首页
社区
课程
招聘
[原创][开源]Android逆向中So模块自动化修复工具+实战一发
发表于: 2017-10-11 14:27 23484

[原创][开源]Android逆向中So模块自动化修复工具+实战一发

2017-10-11 14:27
23484

工具目前还处于娃娃阶段,平时上班没有太多时间来撸^..^,目前包含了如下的功能:

So文件信息读取显示
1.1 显示Elf头
1.2 显示Program头
1.3 显示Section头

So文件节表修复重建功能(适合面目全非型
2.1 根据.dynamic 节重建其他节信息

环境准备

开始分析

增加了几个附带的So文件

为了更加直观,我们把AndroidKiller反编译出来的classes-dex2jar.jar 拖入jd-gui查看,代码很直观,如下:

  • Android加固方案经过这么长时间的发展,从开始的整体dex加密压缩方案逐步开始往native层发展,市面上知名的几款商业级加固方案中很容易发现这种方案的身影。这样看来,在今后相当长的一段时间内,Android逆向中不可避免的会频繁接触到与So加固的对抗了。

    工具的初衷

  • 搜集常见So加固方案(主要是日常分析中遇到的)
  • 自动化对抗加固方案,解放双手
  • 开源工具源码
    1. 把切实可行的解决方案想法落地到代码
    2. 方便需要的同学查看解决方案原理
    3. 希望有更多的人参与进来,慢慢打造一个好用上手的工具
  • 工具目前还处于娃娃阶段,平时上班没有太多时间来撸^..^,目前包含了如下的功能:

    1. So文件信息读取显示
      1.1 显示Elf头
      1.2 显示Program头
      1.3 显示Section头

    2. So文件节表修复重建功能(适合面目全非型
      2.1 根据.dynamic 节重建其他节信息

  • 开源地址:https://github.com/freakishfox/xAnSo
  • 目录结构:
    • Core
      • 主要存放一些基础组件类
    • fix
      • 主要存放一些修复方案逻辑
      • 持续增加...
    • util
      • 逻辑无关的工具类
    • viewer
      • 界面显示相关逻辑
    • Windows
      • 工具在Windows平台下编译需要的工程配置及相关文件
  • 工具编译
    • 目前Windows平台的编译可以在Visual Studio2013环境下完成,Android目录下的编译配置文件还没配置上去
  • Core
    • 主要存放一些基础组件类
  • fix
    • 主要存放一些修复方案逻辑
    • 持续增加...
  • util
    • 逻辑无关的工具类
  • viewer
    • 界面显示相关逻辑
  • Windows
    • 工具在Windows平台下编译需要的工程配置及相关文件
  • 主要存放一些基础组件类
  • 主要存放一些修复方案逻辑
  • 持续增加...
  • 逻辑无关的工具类
  • 界面显示相关逻辑
  • 工具在Windows平台下编译需要的工程配置及相关文件
  • 目前Windows平台的编译可以在Visual Studio2013环境下完成,Android目录下的编译配置文件还没配置上去
  • 环境准备

    • 要测试工具效果,我们自己写一个很简单的Android App, , 使用Android Studio创建一个工程,主要代码如下:
    • 代码很简单,基本是一个空页面的App,直接编译打包,上传到阿里安全进行加固(Demo),把加固后的结果下载回来
  • 开始分析

    • 把下载回来的加固包丢入 AndroidKiller (请自行更新包里的工具ApkTool到最新版本,省的再踩老坑反编译报错...)
    • 图中我框出了经过加固之后的变化部分
    • MainActivity->OnCreate函数变成了Native, 里面原先的代码看不到了
    • 增加了一个类fixHelper
    • 增加了几个附带的So文件

    • 为了更加直观,我们把AndroidKiller反编译出来的classes-dex2jar.jar 拖入jd-gui查看,代码很直观,如下:

    • 很自然,我们要跟着 fixHelper.fixfunc 进一步分析,继续观察代码,发现悲剧了,进入native层了,直接看图:
    • 逃不掉了,必须要看So的代码了, 从这里的代码我们知道,肯定有那么一个So库,有那么一个导出函数fixfunc可以供Java层调用,看上面的这个代码结构的架势,估计是在运行时动态修复MainActivity.OnCreate函数的,带着这样的疑问,我们在这个fixHelper类中找到了一个static{}代码块中找到了经典的 System.load("libdemolish.so"),那清楚了,二话不说在反编译后的目录里面找到这个So文件,直接拖入IDA静候佳音!
  • 要测试工具效果,我们自己写一个很简单的Android App, , 使用Android Studio创建一个工程,主要代码如下:
  • 代码很简单,基本是一个空页面的App,直接编译打包,上传到阿里安全进行加固(Demo),把加固后的结果下载回来
  • 把下载回来的加固包丢入 AndroidKiller (请自行更新包里的工具ApkTool到最新版本,省的再踩老坑反编译报错...)
  • 图中我框出了经过加固之后的变化部分
  • MainActivity->OnCreate函数变成了Native, 里面原先的代码看不到了
  • 增加了一个类fixHelper
  • 增加了几个附带的So文件

  • 为了更加直观,我们把AndroidKiller反编译出来的classes-dex2jar.jar 拖入jd-gui查看,代码很直观,如下:

  • 很自然,我们要跟着 fixHelper.fixfunc 进一步分析,继续观察代码,发现悲剧了,进入native层了,直接看图:
  • 逃不掉了,必须要看So的代码了, 从这里的代码我们知道,肯定有那么一个So库,有那么一个导出函数fixfunc可以供Java层调用,看上面的这个代码结构的架势,估计是在运行时动态修复MainActivity.OnCreate函数的,带着这样的疑问,我们在这个fixHelper类中找到了一个static{}代码块中找到了经典的 System.load("libdemolish.so"),那清楚了,二话不说在反编译后的目录里面找到这个So文件,直接拖入IDA静候佳音!
  • IDA反编译的结果是这样的:
  • IDA分析完成之后,函数列表是空的, 导出函数也是空的,代码区域啥的都是 1% ~~~~,显然是这个So文件经过了处理,并成功干扰到了IDA的分析
  • 内心的想法
    • 到这里,一开始是懵逼的,到底这个So文件被搞了什么鬼导致IDA跟着懵逼呢?但是我知道一个前提,如果我们自己编译一个So文件,不经过处理,那IDA分析起来是比较溜的,于是我们这个时候考虑启用 对比大法
  • 开始对比
    • 要对比,那我们就找一个没有经过(加固)处理的So模块来,我随便找了一个模块,为了描述方便,我称为A模块吧, 于是开始使用 readelf 这个工具分别查看模块的状态,得如下结果:
    • 这是节表显示结果,通过对比,结果很直观,被处理过的So模块,节表大部分信息已乱,除了elf执行必须的.DYNAMIC节之外,于是我们首先怀疑可能就是这里的问题导致了IDA的紊乱,找到了一处怀疑点,那就开始干,把不一样的变的一样(西医就是这么个思路~~), 那具体要怎么修复呢, 了解ELF格式的同学应该比较快速的知道,利用 .DYNAMIC信息来进行修复(修复原理可以参考:https://bbs.pediy.com/thread-192874.htm=>
      6
      [原创]ELF section修复的一些思考, 感谢 @ThomasKing),部分修复操作在 @ThomasKing的基础上做了修改调整
  • 到这里,一开始是懵逼的,到底这个So文件被搞了什么鬼导致IDA跟着懵逼呢?但是我知道一个前提,如果我们自己编译一个So文件,不经过处理,那IDA分析起来是比较溜的,于是我们这个时候考虑启用 对比大法
  • 要对比,那我们就找一个没有经过(加固)处理的So模块来,我随便找了一个模块,为了描述方便,我称为A模块吧, 于是开始使用 readelf 这个工具分别查看模块的状态,得如下结果:
  • 这是节表显示结果,通过对比,结果很直观,被处理过的So模块,节表大部分信息已乱,除了elf执行必须的.DYNAMIC节之外,于是我们首先怀疑可能就是这里的问题导致了IDA的紊乱,找到了一处怀疑点,那就开始干,把不一样的变的一样(西医就是这么个思路~~), 那具体要怎么修复呢, 了解ELF格式的同学应该比较快速的知道,利用 .DYNAMIC信息来进行修复(修复原理可以参考:https://bbs.pediy.com/thread-192874.htm=>
    6
    [原创]ELF section修复的一些思考, 感谢 @ThomasKing),部分修复操作在 @ThomasKing的基础上做了修改调整
  • 解决问题
    • 问题初步定位了大致方向, 原理也了解了, 于是落地到代码, 启动写好的工具对节表信息进行修复:
    • 等待一会儿会修复完毕,于是我们得到修复后的文件:
  • 问题初步定位了大致方向, 原理也了解了, 于是落地到代码, 启动写好的工具对节表信息进行修复:
  • 等待一会儿会修复完毕,于是我们得到修复后的文件:
  • 刚才跟节表磕了一会儿,现在再回过神来继续想想 fixHelper.fixfunc 搞定了没有,把我们修复之后的文件拖入IDA, 经过一小会儿的分析, 效果出来了, 基本有了我们希望的结果(直接有图有真相):
  • 到这里之后,估计很多人都能继续着手分析了, 也达到了本文的目的。最后提醒一点是,大家在自己动手修复节表这种东西的时候,不要忘记修复 符号表,对IDA来说还是比较重要的,不然分析出来的效果会降低,具体情况大家可以尝试一遍,印象会更深刻。
  • 另外建议新手有空可以读一下 apkTool 的代码,确实没几行代码,但是在熟悉这块代码之后,对后续的一些初级坑的帮助还是挺大的 ^..^
  1. 把切实可行的解决方案想法落地到代码
  2. 方便需要的同学查看解决方案原理
  3. 希望有更多的人参与进来,慢慢打造一个好用上手的工具
  1. So文件信息读取显示
    1.1 显示Elf头
    1.2 显示Program头
    1.3 显示Section头

  2. So文件节表修复重建功能(适合面目全非型
    2.1 根据.dynamic 节重建其他节信息

  • Android加固方案经过这么长时间的发展,从开始的整体dex加密压缩方案逐步开始往native层发展,市面上知名的几款商业级加固方案中很容易发现这种方案的身影。这样看来,在今后相当长的一段时间内,Android逆向中不可避免的会频繁接触到与So加固的对抗了。

    工具的初衷

  • 搜集常见So加固方案(主要是日常分析中遇到的)
  • 自动化对抗加固方案,解放双手
  • 开源工具源码
    1. 把切实可行的解决方案想法落地到代码
    2. 方便需要的同学查看解决方案原理
    3. 希望有更多的人参与进来,慢慢打造一个好用上手的工具
  • 把切实可行的解决方案想法落地到代码
  • 方便需要的同学查看解决方案原理
  • 希望有更多的人参与进来,慢慢打造一个好用上手的工具
  • 工具目前还处于娃娃阶段,平时上班没有太多时间来撸^..^,目前包含了如下的功能:

    1. So文件信息读取显示
      1.1 显示Elf头
      1.2 显示Program头
      1.3 显示Section头

    2. So文件节表修复重建功能(适合面目全非型
      2.1 根据.dynamic 节重建其他节信息

  • So文件信息读取显示
    1.1 显示Elf头
    1.2 显示Program头
    1.3 显示Section头

  • So文件节表修复重建功能(适合面目全非型
    2.1 根据.dynamic 节重建其他节信息

  • 开源地址:https://github.com/freakishfox/xAnSo
  • 目录结构:
    • Core
      • 主要存放一些基础组件类
    • fix
      • 主要存放一些修复方案逻辑
      • 持续增加...
    • util
      • 逻辑无关的工具类
    • viewer
      • 界面显示相关逻辑
    • Windows
      • 工具在Windows平台下编译需要的工程配置及相关文件
  • Core
    • 主要存放一些基础组件类
  • 主要存放一些基础组件类
  • fix
    • 主要存放一些修复方案逻辑
    • 持续增加...
  • 主要存放一些修复方案逻辑

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

    收藏
    免费 5
    支持
    分享
    最新回复 (20)
    雪    币: 878
    活跃值: (496)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    2
    看样子还不支持64位
    2017-10-11 14:51
    0
    雪    币: 208
    活跃值: (119)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    3
    有大佬从系统进行dex解密时函数的hook得到dump的地址和大小。在导出到存储,但是现在有的加固方案开始了针对dex加载到内存函数的奇巧。
    2017-10-11 16:25
    0
    雪    币: 4687
    活跃值: (253)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    4
    继TK大大的修复工具后,又一款修复,支持不错啊
    2017-10-12 09:14
    0
    雪    币: 7012
    活跃值: (4222)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    5
    感谢分享
    2017-10-12 09:34
    0
    雪    币: 158
    活跃值: (196)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    6
    不错,以fork
    2017-10-12 13:36
    0
    雪    币: 14855
    活跃值: (6083)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    7
    建议把编译后的exe文件放上来。你不是希望每个人都出编译一下源码吧?
    2017-10-12 14:17
    0
    雪    币: 1037
    活跃值: (1780)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    8
    楼主能不能把编译后的exe放上来,电脑都没有VS
    2017-10-12 16:50
    0
    雪    币: 324
    活跃值: (12)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    9
    收货,编译的EXE
    上传的附件:
    2017-10-12 17:43
    0
    雪    币: 218
    活跃值: (420)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    10
    赞一个。
    2017-10-12 19:18
    0
    雪    币: 8
    活跃值: (505)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    11
    赞一个
    2017-10-12 23:03
    0
    雪    币: 14855
    活跃值: (6083)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    12
    chhzh 收货,编译的EXE
    编译有问题?
    2017-10-13 15:40
    0
    雪    币: 5303
    活跃值: (1625)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    13
    chhzh 收货,编译的EXE
    发个release的吧~
    2017-10-13 16:01
    0
    雪    币: 236
    活跃值: (361)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    14
    能不能修复dex的onCreate
    2017-10-13 20:39
    0
    雪    币: 2
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    15
    小白android 能不能修复dex的onCreate
    又一个被坑害的童鞋哈哈哈。撸主的工具很不错试了下效果可以
    2017-10-17 22:26
    0
    雪    币: 573
    活跃值: (1009)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    16
    chhzh 收货,编译的EXE
    wine  xAnSo.exe 
    err:module:import_dll  Library  MSVCP120D.dll  (which  is  needed  by  L"Z:\\home\\json\\Downloads\\xAnSo.exe")  not  found
    err:module:import_dll  Library  MSVCR120D.dll  (which  is  needed  by  L"Z:\\home\\json\\Downloads\\xAnSo.exe")  not  found
    err:module:LdrInitializeThunk  Main  exe  initialization  for  L"Z:\\home\\json\\Downloads\\xAnSo.exe"  failed,  status  c0000135
    2017-10-27 16:58
    0
    雪    币: 468
    活跃值: (60)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    17
    感谢分享,编译了个release版本
    上传的附件:
    2017-11-2 17:18
    1
    雪    币: 120
    活跃值: (1597)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    18
    工具很不错~~感谢分享
    2018-11-19 21:19
    0
    雪    币: 19
    能力值: ( LV1,RANK:0 )
    在线值:
    发帖
    回帖
    粉丝
    19
    有没有人碰到乐固的壳?是抽取其中部分java代码变成了native,但是却找不到so中对应的jni code,试着用楼主的工具修复了一下so,IDA解不出来,难道是dex重组?
    2019-2-28 19:23
    0
    雪    币: 200
    活跃值: (10)
    能力值: ( LV2,RANK:10 )
    在线值:
    发帖
    回帖
    粉丝
    20
    大佬大佬,支持支持
    2019-8-2 16:27
    0
    雪    币: 866
    能力值: ( LV1,RANK:0 )
    在线值:
    发帖
    回帖
    粉丝
    21
    大佬,64位的so修复,有没有合适的工具?
    2020-4-19 13:09
    0
    游客
    登录 | 注册 方可回帖
    返回
    //