IDA调试so文件基础篇

时间:2024-10-25 15:06:26

我们前面学习了如何使用eclipse调试smali文件,今天我们一起来学习一下如何使用IDA调试so文件。今天我们讲述的重点放在成功调试so文件,讲得比较基础,因此我们使用前面eclipse建立的NDK项目hello3作为示例来讲解。想了解的同学,可以转战这里:/u012195899/article/details/52711524,这个示例非常的简单,就是点击按钮之后输出字符串而已。

现在,我们可以开始今天的讲解了。

一、首先,将我们的apk在手机中运行起来。

二、启动你的IDA,并导入so文件。流程如下:

1、首先启动程序


2、导入我们的.so文件


通过点击左边的函数名称,就可以定位到对应的代码。

三、操作android_server

1、找到IDA中的dbgsrv文件夹下的android_server文件,将这个文件使用adb命令上传到我们的手机/data/local/tmp目录下,命令如下:

2、给android_server文件添加执行权限,命令如下:

adb shell chmod 755 /data/local/tmp/android_server

在这一步中可能会遇到权限拒绝问题,大家切换用户身份即可。

3、启动android_server,命令如下:


android_server的执行需要注入进程,因此需要手机root。

在这一步中,可能会报两类错。第一种是Incompatible debugging server:address size is 4 bytes, expected 4,这是因为你的android_server 是32位的,而你启动的 ida 是64位的 ,换成32位的ida就可以了。第二种是error: only position independent executables (PIE) are supported,这是因为Android5.0以上的编译选项默认开启了pie,在5.0以下编译的原生应用不能运行,有两种解决办法,一是用Android5.0以下的手机进行操作,还有一种就是用IDA6.6以上版本即可。

4、转换端口,这里的端口号是 固定的,命令如下。


四、IDA连接端口

此时保持刚才的IDA程序,再另外打开一个IDA,这次我们直接点击GO进入空白页。




接下来会弹出显示当前手机里运行程序的包名。因此我们需要事先将我们的程序在手机里启动起来。


此时,双击包名进入我们的调试页面。


此时,使用ctrl+S快捷键,会出现当前内存中所存在的so文件


接下来,我们选择libhello_jni.so文件并双击它


此时,可以看到,我们成功跳转到libhello_jni.so文件地址。


此时,我们按下G快捷键,就可以跳转到自己想要调试的地址。在我们的示例中,想要调试的肯定是获取字符串的函数,那我们来看一下这个函数的地址应该怎么计算。这个时候我们切换到第一个打开的IDA,找到刚才的getString函数位置。



这里我们获取到了函数的偏移地址是0x0000CB4,刚才让大家记录了一下libhello_jni的start开始地址为0xB460F000,此时将两个地址相加即得到我们的函数的内存地址。因此,我们的内存地址为0x0000CB4+0xB460F000 = 0xB460FCB4。

此时,我们再切换到刚才的调试IDA,在按下G快捷键的位置输入跳转地址0xB460FCB4。 


点击OK键,可以看到我们成功跳转到getString函数


这个时候,我们就可以在对应位置打上断点了,只需要点击指令左侧的蓝色小圆点使其变红即可。然后按下左上方绿色按钮开始调试


此时,打开我们手机中的程序,点击button按钮触发,使得getString函数被调用


此时切换到我们的调试IDA界面


接下来,大家可以按F7进行单步调试,F8单步进入调试。

今天我们的学习就到这里了,主要学习下如何使用IDA调试so文件的基础,之后我们再使用其他示例来学习。