使用Ida动态调试Android 中的so文件的方式以及技巧

时间:2022-03-16 22:32:16

首先要想调试对应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中找到

使用Ida动态调试Android 中的so文件的方式以及技巧

连接后选择我们要调试的程序,载入完成后

Ctrl-s查看加载的模块

将jdb桥附加到远程调试端口:

<span style="white-space:pre">	</span>jdb-connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

载入后在Debugger选项中选择

使用Ida动态调试Android 中的so文件的方式以及技巧


在选择我们对应的模块后,根据静态分析中的偏移下断点

 

一切就绪后运行调试器就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。