IDA调试so文件进阶篇

之前我们讲了用IDA调试so文件的基础,想了解的可以转这里:http://blog.csdn.net/u012195899/article/details/52780062,今天学习当apk采用了一些反调试手段时,如何使用IDA来帮助我们解决问题。虽然我们的app使用的是阿里14年ctf第三题,但本文的重点是dex dump,以及这其中的详细步骤,并不涉及该题的最后解答。

一、安装apk

因为我们需要对apk进行调试,因此拿到apk的第一件事,就是使用apktool反编译,查看里面的这题是可以被调试的,然后我们新建并启动自己的avd,然后安装apk即可。注意:这个apk只能运行在android4.x版本上。命令为
adb install x.apk

二、将android_server传到avd中并启动

这一步在IDA调试so基础篇中已经讲述得很清楚,不记得的可以参考转链接:http://blog.csdn.net/u012195899/article/details/52780062

转发端口:

adb forward tcp:23946 tcp:23946

三、以debug模式启动apk

我们查看AndroidManifest.xml文件,发现里面的启动类是MainActivity,包名是com.ali.tg.testapp,因此执行命如下:
adb shell am start -D -n com.ali.tg.testapp/.MainActivity
这个时候可以看到我们的程序停留在等待调试连接页面。

四、IDA attach程序






五、jdb连接程序

这里我最开始使用8700端口去连接失败,网上很多说用ddms,这里我使用的是端口转发
首先进入adb shell,输入ps命令查看当前运行的进程

这里看到该app的进程号为857,接下来就输入以下命令实现端口转发


jdb连接命令

六、进入调试

回到IDA调试界面


这个时候看到我们的IDA页面弹出几个类似下面的弹出框,点cancel即可。


接下来,我们要开始打断点。

七、打断点

打断点我们都知道,需要找到文件在内存的绝对地址加上偏移即可。我们的最终目的是dex dump,就需要用到dvmDexFileOpenPartial 函数,这个函数在4.x版本下位于libdvm.so文件,且这个文件加载加载时间很早,类似JNI_OnLoad,这也就是我们前面为什么需要使用jdb连接方式来调试。接下来,我们就需要找到这个函数的偏移和该文件的内存地址。
首先在当前的IDA使用ctrl+s快捷键选择段,ctrl+f搜索libdvm.so,记录下起始地址

然后将我们android系统中的libdvm.so文件拷贝出来,地址位于/system/lib/目录下
然后双开IDA,new一个文件,导入该so文件。

可以看到,dvmDexFileOpenPartial函数的偏移为0x00043E38
那么最终该函数的内存地址就是0x406F1000+0x00043E38=0x40734E38
进入我们的动态调试的IDA界面,按下G快捷键,输入刚才得到的内存地址

接下来打断点,然后执行

这个时候可以看到PC寄存器中为该函数的地址,接下来按F7单步执行。只是执行了push指令即可,注意要在BL指令前停下来。我们查看右方的寄存器内容。R0和R1就是该函数的前两个参数,R0代表dex文件起始地址,R1代表dex文件大小。

输入shift+F2快捷键调出IDA脚本运行界面,在右边输入右下脚本:
static main(void)
{
    auto fp, dex_addr, end_addr;
    fp = fopen(“F:\\dump.dex”, “wb”);
    end_addr = r0 + r1;
    for ( dex_addr = r0; dex_addr < end_addr; dex_addr ++ )
        fputc(Byte(dex_addr), fp);
}

这样会把dex文件保存为F盘下的dump.dex中。点击run执行。
过一段时间,会生成该dex文件。这里我们就成功dump下整个dex。
今天就暂时学习到这里。我们还有很长的一段路要走。

猜你喜欢

转载自blog.csdn.net/u012195899/article/details/52938353