安卓逆向11.IDA以Debug模式调试APK SO

一箫一剑平生意,负尽狂名十五年。这篇文章主要讲述安卓逆向11.IDA以Debug模式调试APK SO相关的知识,希望能为你提供帮助。
有时候,我们需要在APK启动时就附加上进程,等程序完全运行后再附加的方法显然时机已经晚了!
比如想要调试SO库的JNI_Onload函数,很多时候需要在程序启动的时候就附加并且调试!
 
方法一、附加断点法(先附加再下断点)
优点:速度快
缺点:IDA v7.2 断点在Jni_Onload后F5无法查看伪代码,IDA6.8可以,原因未知!

1.首先需要给androidManifest.xml设置android:debuggable="true",否则会出现无法附加到模拟器的错误!

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
2.在CMD窗口下执行【adb devices】检查模拟器是否正常连接

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
3.将IDA安装目录下dbgsrv文件夹下的android_server发送到安卓模拟器中,注意android_server文件所在路径不能有中文和空格,否则adb push命令会出错,我这里将android_server文件放在c盘根目录下,使用以下命令将android_server发送到模拟器中。 【adb push C:\\android_server /data/local/tmp】

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
4.执行【adb shell】命令

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
5.执行【su】 获取root权限

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
6.执行【cd /data/local/tmp】 将路径切换到/data/local/tmp下

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
7.执行【ls -l】查询目录下所有文件以及读写权限

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
8.执行【chmod 777 android_server】将android_server文件权限修改为777权限

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
9.再次执行【ls -l】查看文件权限是否修改成功

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
10.执行【./android_server】启动android_server

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
11.原来的窗口别关,重新打开一个新的CMD窗口,执行【adb forward tcp:23946 tcp:23946】进行端口转发

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
12.打开DDMS,打开就行了,只要能正常显示进程列表就行。然后DDMS别关!

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
13.以Debug模式启动进程 命令格式为:adb shell am start -D -n 包名/包名.入口Activity 【adb shell am start -D -n com.crackme.jnidynamicregtest/com.crackme.jnidynamicregtest.MainActivity】
命令执行之后,可以看到安卓模拟器启动了进程,并且提示Waiting for debugger

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
14.打开IDA 菜单 Debugger-> Attach-> Remote ARM Linux/Android debugger,输入127.0.0.1点击OK

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
15.选择要附加的进程,点击OK

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
16.此时IDA已经正常附加进程,并且暂停下来

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

17.Debugger-> Debugger option,勾选一下三项

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
安卓逆向11.IDA以Debug模式调试APK SO

文章图片

18.打开刚才启动的DDMS,查看进程端口,此时为8613

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
19.执行【jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8613】恢复java层运行,注意8613是DDMS里查询到的端口号。

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
20.此时再到IDA中按F9可以看到IDA日志窗口会提示当前加载的SO库文件

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

【安卓逆向11.IDA以Debug模式调试APK SO】 
21.这时候就可以到Jni_Onload函数下断,然后按F9就会断在Jni_Onload函数

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
方法二、断点附加法(先下断点再附加)
优点:IDA可以直接F5查看伪代码
缺点:速度相对第一种更慢
1.首先我们需要将APK文件里的so文件提取出来,方法很多,比如直接用ZIP解压!

安卓逆向11.IDA以Debug模式调试APK SO

文章图片
   
安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
2.直接用IDA打开提取出来的libnative-lib.so文件,找到Jni_OnLoad函数并下好断点

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
3.执行命令,启动IDA的android_server服务 adb shell su cd /data/local/tmp ./android_server

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
4.以Debug模式启动进程 命令格式为:adb shell am start -D -n 包名/包名.入口Activity 【adb shell am start -D -n com.crackme.jnidynamicregtest/com.crackme.jnidynamicregtest.MainActivity】 命令执行之后,可以看到安卓模拟器启动了进程,并且提示Waiting for debugger

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
8.执行【adb forward tcp:23946 tcp:23946】进行端口转发

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
9.打开DDMS并关

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
10.返回IDA,菜单 Debugger-> Select debugger-> Remote ARM Linux/Android debugger

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
11.菜单 Debugger-> process option

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

12.HostName设置127.0.0.1,点击OK

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
13.菜单 Debugger-> Attach Process,选择需要调试的进程

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
安卓逆向11.IDA以Debug模式调试APK SO

文章图片

14.当看到IDA中断下后按F9运行

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
15.执行【jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8604】恢复java层运行,注意8604是DDMS里查询到的端口号。

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
16.IDA会提示检测到相同的so文件,点击same

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
17.等待漫长的过程后,发现已经成功在Jni_OnLoad函数断下

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
18.IDA F5也能正常使用

安卓逆向11.IDA以Debug模式调试APK SO

文章图片

 
 
三、附加技巧
改文件名 mv android_server as 改调试端口号 ./android_server -p123456 注意:p后面没有空格 或者静态path android_server不打开DDMS附加方法: adb shell ps找到进程PID adb forward tcp:xxxx jdwp:PID jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=xxxx



    推荐阅读