![](http://static.blog.csdn.net/images/category_icon.jpg)
版权声明:本文为博主原创文章,未经博主允许不得转载。
我们前面学习了如何使用eclipse调试smali文件,今天我们一起来学习一下如何使用IDA调试so文件。今天我们讲述的重点放在成功调试so文件,讲得比较基础,因此我们使用前面eclipse建立的NDK项目hello3作为示例来讲解。想了解的同学,可以转战这里:http://blog.csdn.net/u012195899/article/details/52711524,这个示例非常的简单,就是点击按钮之后输出字符串而已。
现在,我们可以开始今天的讲解了。
一、首先,将我们的apk在手机中运行起来。
二、启动你的IDA,并导入so文件。流程如下:
1、首先启动程序
2、导入我们的.so文件
通过点击左边的函数名称,就可以定位到对应的代码。
三、操作android_server
1、找到IDA中的dbgsrv文件夹下的android_server文件,将这个文件使用adb命令上传到我们的手机/data/local/tmp目录下,命令如下:
2、给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文件的基础,之后我们再使用其他示例来学习