IDA调试JNI_Onload及init_array调用流程分析

寻找jni_onload流程分析:

pull出来libdvm.soIDA静态打开,strings窗口,搜索jni_onload

 

 

双击进入函数内:

 

 

F5c源码

 

 

重点关注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附加。
附加后在IDAmodule list中搜索linker这一项。

 

 

Base这一栏是linker在内存中加载的基地址,基地址=0x4000B000

所以调用init_array的地方blx r4在该内存中的偏移为Base+offset = 0x4000B000+0x274C=4000D74C

在反汇编窗口按下G键,输入0x4000D74C,即可跳转过去,并设置好断点。

如果跳过去后,目标并不是汇编代码,请机智的按下C键。

 

 

这个函数实在jni_onload之前,所以需要先jdbF9,记得点上三项,之后断下来,F7进入函数。

至此结束!

posted @ 2017-08-02 16:00  鸿昊兄弟  阅读(1330)  评论(0编辑  收藏  举报