首先要想调试对应APP的so,一般要拿一个自己编译的AOSP最方便杂七杂八的问题最少。
将ida的android_server push 到/data/local/tmp,执行后监听local port 23946
<span style="white-space:pre"> </span>adb forward tcp:23496 tcp:23946
以debug模式启动APP
<span style="white-space:pre"> </span>am start -D -n 包名/.类名
一定记得打开ddms(不推荐monitor),不然后面的jdb使用会经常挂掉
在ida中找到
连接后选择我们要调试的程序,载入完成后
Ctrl-s查看加载的模块
将jdb桥附加到远程调试端口:
<span style="white-space:pre"> </span>jdb-connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
载入后在Debugger选项中选择
在选择我们对应的模块后,根据静态分析中的偏移下断点
一切就绪后运行调试器就ok了
哦对了,在ida中,Option->Genernal->BAD 勾选 对齐,长度四字节,这样就能看见机器码了
======================================================================================================================
是的下面有不少Tips
Tip0:
系统加载so,在完成装载、映射和重定向以后,就首先执行.init和.init_array段的代码,之后如果存在JNI_OnLoad 就调用该函数.我们要对一个so进行分析,需要先看看有没有.init_array section和.init section,简单so加壳一般会在初始化函数进行脱壳操作,当然同时还会有饭调试相关的代码。
所以一般下断点要 函数偏移断,Jni_Onload断,init_array断
Tip1:
有时候程序会启动多个线程检测调试状态,这时候只要将这些线层挂起来就行,使用Ida的Thread模块检测程序运行后的线程启动状态,然后挂起;如果是多个进程的话使用
kill -19 < pid> //挂起
Kill -18 <pid> //恢复
Tip2:
可以通过dump一定程度上或者全部得到内存中的dex文件。通过对mmap以及libdvm中的一些方法(如:dvmDexFileOpenPartial,或者Z14dvmDefineClassP6DvmDexPKcP6Object)下断点,可以得到脱壳后的dex文件(内存ASCII: dex\n035),然后使用idc脚本dump即可。Dump时标识的address基本都是R0。