所用工具: 010editor+dexfixer +android killer+apktool(要最新版,我使用的2.7.0,低版本打包资源文件时会报错)
dex修改之后,可用dexfixer工具修复。
工具下载在这里。
思路1:
apktool反编译后,修改smali文件,之后再打包。使用android killer 签名,缺点要等挺长时间。
2:
使用360打开apk(注意不是解压),提取出里面的dex文件。ida打开找到位置,使用010editor修改后,再使用dexfixer签名。注意dex.035的头有可能会变成dex.038。之后再把原来的dex文件和META-INF文件夹删除掉,添加修改之后的dex文件,使用android killer 再签名即可。
so层动态调试
在动态调试这里耽误了不好时间,之前一直以为需要app开启debug模式或者安卓系统打开debugger才可以。这两天自己写了一个带so的app,实测是不需要的。
使用工具IDA7.7
注意:android:extractNativeLibs=”true”要在androidManifest.xml中写明。原因如下;我因为 minSdkVersion为26,所以默认为false,false的话,动态调试时会找不到目标so,自然也就无法调试了。
android:extractNativeLibs = true
时,gradle打包时会对工程中的so库进行压缩
,最终生成apk包的体积会减小
。
但用户在手机端进行apk安装时,系统会对压缩后的so库进行解压,从而造成用户安装apk的时间变长
。
关于android:extractNativeLibs
默认值设定方面,若开发人员未对android:extractNativeLibs进行特殊配置:
minSdkVersion < 23 或 Android Gradle plugin < 3.6.0
情况下,打包时android:extractNativeLibs=true
;minSdkVersion >= 23 并且 Android Gradle plugin >= 3.6.0
情况下,打包时android:extractNativeLibs=false
;
<application
android:extractNativeLibs="true">
</application>
参考文档:https://blog.csdn.net/weixin_48967543/article/details/115269878
1,如果是需要以32位ida调试,则使用:
adb install --abi armeabi-v7a
安装app后打开,点击目标按钮以让目标so库加载进来。
2,将ida文件夹中dbgsrv中的android_server和android_server64两个文件push到/data/local/tmp中,命名可以是as和as64,chmod 777 赋予执行权限后执行。方法为:./as
adb forward tcp:23946 tcp:23946(将手机端口转发到电脑)。
3,debugger—attach—remote ARM Linux/android debugger—hostname选择localhost后点击确定,选择进程后等待,在右侧module中找到目标so的基地址,另外一个ida,找到目标函数偏移。计算后快捷键G,跳转,f2断点。回到手机上,点击目标按钮,此时ida进入了断点模式。step into F7表示进入函数,step over F8表示一行行的走。F9表示到下一个断点,没有断点程序一直执行完。
(android软件安全与逆向分析一书中259页,使用ctrl+s 打开段选择对话框,结果发现有多个同文件名so,不知道是哪一个,右侧module中搜索只有一个,我觉得从右侧module中找基地址更好一些)
最后还是总结下,adb安装时如何指定在ARM环境下以32位还是64位运行:
要想指定应用在64位终端下以32位方式模式下运行,可以使用如下命令:
adb install --abi armeabi-v7a
要想指定应用在64位终端下以64位方式模式下运行,可以使用如下命令:
adb install --abi arm64-v8a
如果是其他的Android平台,譬如X86或者其它的,可以使用如下命令:
adb install --abi
app下载链接