IDA调试JNI_Onload及init_array调用流程分析
寻找jni_onload流程分析:
pull出来libdvm.so,IDA静态打开,strings窗口,搜索jni_onload
双击进入函数内:
F5看c源码
重点关注v20 和 v23,在v23那句按tab回到汇编窗口
重点是方框处就是需要记下的偏移地址
.text:00050008 BLX R8
接下来动态加载程序,步骤不再赘述
adb shell
su
/data/local/tmp/as
adb forward tcp:23946 tcp:23946
adb shell am start -D -n com.wolf.ndktest/com.wolf.ndktest.MainActivity
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8624
附加成功后在Molules窗口中搜索libdvm.so,记下基址地址4145F000
Jni_onload的地址=基址+偏移,4145F000 + 50008=414AF008
G跳转,按c键
下断之后jdb
直接断在这里
F7进入函数:
至此结束
.init_array调用流程
adb pull /system/bin/linker
下载手机中的linker,将下载来的linker拖入IDA中分析。等待IDA分析完后打开字符串表,搜索”[ Calling %s @ %p for ‘%s’ ]”,为了方便记忆,直接搜索”call”也是可以的。搜索Calling
搜索出来后双击记录,下面是结果:
双击红色箭头处的 o 可以转到引用该字符串的地方。
BLX R4是调用代码Init_array的地方。 记录下此地偏移地址(0x274C),留作以为备用。
接下来在动态调试的时候,使用am以等待调试器附加的状态启动app,然后用ida附加。
附加后在IDA的module list中搜索linker这一项。
Base这一栏是linker在内存中加载的基地址,基地址=0x4000B000
所以调用init_array的地方blx r4在该内存中的偏移为Base+offset = 0x4000B000+0x274C=4000D74C
在反汇编窗口按下G键,输入0x4000D74C,即可跳转过去,并设置好断点。
如果跳过去后,目标并不是汇编代码,请机智的按下C键。
这个函数实在jni_onload之前,所以需要先jdb后F9,记得点上三项,之后断下来,F7进入函数。
至此结束!