JNI_OnLoad与init_array下断方法整理

本文介绍了如何在JNI_OnLoad和init_array执行前设置断点,通过分析linker和dlsym在Android系统库中的调用来定位关键位置,提供了一种动态调试SO的方法。
摘要由CSDN通过智能技术生成

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这一项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值