IDAPython脚本分享 - 自动在JNI_OnLoad下断点

发布者:freakish
发布于:2017-10-22 16:02

自动在JNI_OnLoad下断点

脚本背景

  • 在Android逆向的过程中,一个很常见的场景就是我们需要分析So模块的JNI_OnLoad函数,每次我们使用IDA进行调试的时候,都要手动的找一次 libart.so(ART虚拟机)中调用JNI_OnLoad函数的位置,重复又麻烦,于是就用脚本把这个相对固定的过程用IDA Python脚本固化下来,提高效率,顺便跟大家分享一下。

脚本使用注意事项

  • IDA载入分析 libart.so 完毕之后(实时附加调试的时候,可以在IDA切换到这个模块)
  • 针对于ART虚拟机的,Dalvik虚拟机的需要对应修改一下(Dalvik虚拟机渐渐远去,我就不提供修改版本了)
  • 开发测试环境为Nexus 5X AOSP 6.0.0_r1

脚本思路

  • 通过阅读 libart.so 相关源码可知,在调用So模块的JNI_OnLoad函数之前,代码中会有日志输出,有参考字符串 “[Calling JNI_OnLoad in”
  • 通过 IDAPython 接口API,在 .rodata 段搜索上述的字符串,找到偏移地址
  • 通过 IDAPython 接口API,对上述偏移地址进行交叉引用参考,发现有2处引用参考,其中第二处是字符串定义处,因此取第一处
  • 通过交叉引用地址,使用IDAPython API 接口开始遍历整个函数(art::JavaVMExt::LoadNativeLibrary), 为了增加准确性,从上述找到的字符串参考位置开始进行 特征指令匹配
    1. 读取第二处的字节码 0xE494,根据 Thumb-2 指令的B指令编码规则(请参考我的另一篇博文),计算出目标跳转地址 0x24EBA0
    2. 跟踪进计算出来的地址 0x24EBA0,继续搜索特征指令 BLX R12
    3. 使用 IDAPython API接口直接在这个地址下断点即可

思路总结

  • 通过阅读对应部分源码,然后结合 IDA反汇编结果,先手工在IDA里面找一遍,然后考虑结合实际的一些特征值,配合 IDAPython API来进行脚本自动化 ~..~

脚本源码


声明:该文观点仅代表作者本人,转载请注明来自看雪