JNI_OnLoad和init_array 在SO脱壳中占了很多比重,那么如何在它们执行前下断点呢?
考虑到SO加载的时机,在jdb附加之前并不能对我们想调试的SO下断点,即使是知晓了偏移位置。因为它们还没有被加载。据说这可以用脚本来解决,这不是这篇文章讨论的范围。本文章讨论的方法是从系统库中下断的方法来达到目的。
首先讨论init_array下断点的方法:
init_array 是在so加载后由linker负责调用,详细细节可以翻阅linker源码。
linker在调用init_array的时候会输出 “[ Calling %s @ %p for ‘%s’ ]”
思路是可以通过定位该字符串来定位调用init_array 的位置。
adb pull /system/bin/linker
下载手机中的linker,将下载来的linker拖入IDA中分析。等待IDA分析完后打开字符串表,搜索”[ Calling %s @ %p for ‘%s’ ]”,为了方便记忆,直接搜索”call”也是可以的。
搜索出来后双击记录,下面是结果:
双击红色箭头处的 o 可以转到引用该字符串的地方。
BLX R4是调用代码Init_array的地方。 记录下此地偏移地址(0x15bc),留作以为备用。
接下来在动态调试的时候,使用am以等待调试器附加的状态启动app,然后用ida附加。
附加后在IDA的module list中搜索linker这一项。