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

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

2017-11-28 12:32
8858
  • 在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

  • [招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

    收藏
    免费 1
    支持
    分享
    最新回复 (5)
    雪    币: 105
    活跃值: (549)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    2
    谢谢分享
    2017-11-28 13:09
    0
    雪    币: 7012
    活跃值: (4222)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    3
    方便多了,  感谢分享
    2017-11-28 14:12
    0
    雪    币: 14855
    活跃值: (6083)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    4
      IDA  Python脚本还是不完善
    1、不能自动获取so中函数I地址
    2、不能调用so中函数并得到返回值
     
    2017-11-28 14:55
    0
    雪    币: 1157
    活跃值: (847)
    能力值: ( LV8,RANK:150 )
    在线值:
    发帖
    回帖
    粉丝
    5
    tDasm   IDA  Python脚本还是不完善1、不能自动获取so中函数I地址2、不能调用so中函数并得到返回值 
    1.  不能自动获取So中函数  地址不太清楚指的是什么,  可以参考  Functions    FuncItems  这两个函数看看是否满足你的需求
    2.  不能调用So中函数并得到返回值,可以参考  AppCall,  也可以参考  http://blog.csdn.net/freakishfox/article/details/74566260    搜索  AppCall
    2017-11-28 15:59
    0
    雪    币: 14855
    活跃值: (6083)
    能力值: ( 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
    游客
    登录 | 注册 方可回帖
    返回
    //