前言:android
使用IDA进行动态调试so,有两种方式进行调试,一种是调试启动方式,调试启动能够调试jni_onload ,init_array 处的代码,能够在较早的时机获得调试权限,通常反调试会在较早的时候进行启动; 而另外一种则是附加调试,附加调试是在APP已经运行起来的时候进行附加调试,这两种方式与Windows上的调试启动和附加调试概念很类似;下面咱们来进行实践把...shell
实践环境:Windows 10 + IDA Pro 7.0 + Nexus5(4.4.4)tcp
正文:ide
第一种调试启动:函数
1. 以调试的方式启动程序(这样能够在jni_onload ,init_array 处断下来)spa
adb shell am start -D -n com.yaotong.crackme/.MainActivity线程
2. 在IDA的主目录 dbgsrv 目录下 ,找到 android_server,拷贝到手机的 data/local/tmp/ 目录下debug
adb push (android_server的目录) /data/local/tmp3d
3. 使用chmod修改android_server程序的执行权限并执行:调试
adb shell chmod 755 /data/local/tmp/android_server
执行android_server
adb shell
su
cd data/local/tmp
./android_server
4. 新开一个cmd窗口使用forward程序进行端口转发:
adb forward tcp:23946 tcp:23946
5. 打开方法调试:
打开IDA,选择菜单Debugger -> Attach -> Remote ARM Linux/Android debugger
6. Hostname 填写 127.0.0.1或者locahost (都是一个意思)
Port 自动填的23946
8. 点击菜单Debugger->Debugger Opitions 在弹出的Debugger setup窗口的Events中选择 Suspend on Process entry和Suspend on thread start/exit 以及 Suspend on library load/unload,再点击OK退出。经过此操做能够设置程序在建立新线程和加载so时自动中断。
经过DDMS获取相应进程的端口号,而后使用jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=XXXX(DDMS查询到的端口号,通常ddms进行转发后的端口都是8700)
链接成功后,在IDA按F9后手机上的“waiting for debugger"提示会自动消失,这个时候应该已经断在新线程,或者加载so处了。
9. 如今就能够在IDA中按下快捷键CTRL + S来查看要调试的so是否已经加载了,若是没有就F9,直到加载了为止;若是已经有了,就记下该so的start位置,而后另开一个ida分析.so库,找到JNI_ONLOAD的偏移地址,那么该JNI_OnLoad函数在进程中的真实地址就是so.start + JNI_OnLoad_Offset。
这里须要说明的是:有可能在快捷键CTRL + S跳出的窗口中有两个同名的so,咱们应当选择权限为RX的这个,RX通常是代码段,RW通常是数据段。
10. 获得真实地址后,在IDA中按下快捷键G跳转到这个地址,而后按下快捷键F2就完成在JNI_OnLoad函数入口处下断点了。若是想直接在native函数下断点,那么另开一个IDA 进行静态查看函数地址而后转换成为动态加载起来的地址,接着G到该地址下断点便可
11. 再次按下F9,则在JNI_OnLoad断了下来,接着就能够进行调试等系列操做了...
adb shell
su
cd data/local/tmp
./android_server
6打开IDA,选择菜单Debugger -> Attach -> Remote ARM Linux/Android debugger
Hostname 填写 127.0.0.1或者locahost (都是一个意思)
Port 自动填的23946