首页
社区
课程
招聘
[原创]IDAPython脚本分享 - 自动在JNI_OnLoad下断点
发表于: 2017-11-28 12:32 9130

[原创]IDAPython脚本分享 - 自动在JNI_OnLoad下断点

2017-11-28 12:32
9130
  • 在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来进行脚本自动化 ~..~
  1. 读取第二处的字节码 0xE494,根据 Thumb-2 指令的B指令编码规则(请参考我的另一篇博文),计算出目标跳转地址 0x24EBA0
  2. 跟踪进计算出来的地址 0x24EBA0,继续搜索特征指令 BLX R12
  3. 使用 IDAPython API接口直接在这个地址下断点即可
  • 在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

  • [培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

    收藏
    免费 1
    支持
    分享
    最新回复 (5)
    雪    币: 110
    活跃值: (994)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    2
    谢谢分享
    2017-11-28 13:09
    0
    雪    币: 7826
    活跃值: (5257)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    3
    方便多了,  感谢分享
    2017-11-28 14:12
    0
    雪    币: 15947
    活跃值: (7193)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    4
      IDA  Python脚本还是不完善
    1、不能自动获取so中函数I地址
    2、不能调用so中函数并得到返回值
     
    2017-11-28 14:55
    0
    雪    币: 1158
    活跃值: (852)
    能力值: ( LV8,RANK:150 )
    在线值:
    发帖
    回帖
    粉丝
    5
    tDasm   IDA  Python脚本还是不完善1、不能自动获取so中函数I地址2、不能调用so中函数并得到返回值 
    1.  不能自动获取So中函数  地址不太清楚指的是什么,  可以参考  Functions    FuncItems  这两个函数看看是否满足你的需求
    2.  不能调用So中函数并得到返回值,可以参考  AppCall,  也可以参考  569K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2U0M7$3c8F1i4K6u0W2L8X3g2@1i4K6u0r3k6Y4u0W2j5h3E0A6M7$3S2X3L8%4S2Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3k6r3g2@1j5h3W2D9M7#2)9J5c8U0M7@1y4e0j5$3x3U0j5H3i4K6t1$3L8X3u0K6M7q4)9K6b7R3`.`.   搜索  AppCall
    2017-11-28 15:59
    0
    雪    币: 15947
    活跃值: (7193)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    6



    freakish

    1. 不能自动获取So中函数 地址不太清楚指的是什么, 可以参考 Functions FuncItems 这两个函数看看是否满足你的需求
    2. 不能调用So中函数并得到返回值,可以参考 AppCa ...
    你测试过没有?我测试不行。注意是安卓SO的函数,而不是windows  DLL函数。在windows下这些都没问题的,但是安卓不行,我测试的是安卓4.2及以下,其他版本未知。
    而且我看了很多别人的调试安卓脚本,都要人工把光标定位到某API地址,然后再用脚本获取光标处地址。
    本来脚本可以用 idaapi.get_debug_name_ea("gDvm")来获取api地址,但是没有成功过。不知道是不是Python 版本问题?
    2017-11-29 08:29
    0
    游客
    登录 | 注册 方可回帖
    返回