首页
社区
课程
招聘
[原创]DX加固逆向分析
发表于: 2018-3-3 16:14 11726

[原创]DX加固逆向分析

2018-3-3 16:14
11726

首先看一下DX对于这种自身的虚拟源码保护是怎么说明的?

结合免费版分析可以猜测是这样的加固流程:

1.      首先进行免费版转换把dex中对应的方法通过JNI反射转换为cpp文件(当然这里企业版比免费版转换的方法要多,免费版中的内部类MainActivity$1就没有进行转换);

2.      然后就是独有工具链的编译,猜测很有可能是基于LLVM的自定义编译;

3.      进行虚拟化保护,生成相对的VMdata和对应的Handler解释器,最后每次通过dispatcher来读取VMdata完成解释。

一、分析篇:

1.So脱壳:

根据上一次的免费版分析知道顶象中so的保护采用的变形的UPX加壳。

在linker执行完第一个init函数,也就是upx的loader函数后开始dump.

在偏移值为274E处下断点:

根据base和Size dump出来

dump下来接着修复。

通过对Load和dynamic进行简单修复后基本上所有的函数,静态都可以看到了,如图所示:

2.直接分析:

静态分析:

这里面要抓住几个核心的问题,一是核心代码的虚拟指令,二是虚拟安全运行环境.

OK,开始吧!在IDA中打开

分析看到JNI_Onload、oncreate、wanwan01、wanwan02、wanwan0、Testloop等这些函数基本上是遵从一个规则那就是:

所以可以猜想的是这几个函数是构成那个虚拟运行环境的重点函数,也是我们分析的重点。

进入sub_43B0这个函数以后发现如下:

经过简单分析以后发现

在F5看伪代码以后发现:是一个控制流平展图,里面的case总共有250个左右,但是只有50多个,200个左右没有显示,大致猜测加固原理如下:

在加固处理的时候对dex native化形成的cpp文件进行语法分析,或者就是上面所说的形成了中间二进制文件,然后根据这些二进制文件的特征来形成了50个左右“Handler”。(总共是253个“Handler”,这里只用到50个),每次解释的时候读取这个虚拟指令集合。然后调用相应的Handler来进一步的进行解释完成。

动态调试分析

如上图所示为取虚拟指令的一个过程。下图是每次调用执行完返回的一个过程。

下面感觉是维护一个地址表:

并且在调试过程中发现case94、case 249、case107、case222、case197这些Handler的内容是一样的,或许是一些无用的垃圾指令。

在调试中如下图所示会发现有大量的重复的虚拟指令,并且对应的Handler也没有具体的语义。如下图所示:


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

最后于 2018-3-3 16:55 被不知世事编辑 ,原因:
上传的附件:
收藏
免费 1
支持
分享
最新回复 (17)
雪    币: 355
活跃值: (637)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
牛逼
2018-3-3 21:39
0
雪    币: 4609
活跃值: (714)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
666
2018-3-3 22:46
0
雪    币: 14
活跃值: (887)
能力值: ( LV3,RANK:24 )
在线值:
发帖
回帖
粉丝
4
厉害了
2018-3-5 09:52
0
雪    币: 210
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
说的挺好的
2018-3-5 10:49
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
牛逼
2018-3-5 21:31
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
厉害,学习了
2018-3-5 22:44
0
雪    币: 116
活跃值: (305)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
单凭截图还看不出对native的处理到底是虚拟机还是fla,
顶象和聚安全的代码混淆(fla)是一样的,强度和效果个人认为做得很好。
2018-3-6 10:56
0
雪    币: 3712
活跃值: (1401)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
lpcdma 单凭截图还看不出对native的处理到底是虚拟机还是fla, 顶象和聚安全的代码混淆(fla)是一样的,强度和效果个人认为做得很好。
我觉得DX这个还是OLLVM的变形,只是比较细粒度的化的处理,犹如传统虚拟机调度一般,在性能和兼容方面差不多的情况下,只要能增大逆向者的攻击者成本我觉得都是可取的,没必要纠结是不是传统虚拟机那一套。
2018-3-6 11:17
0
雪    币: 116
活跃值: (305)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
不知世事 我觉得DX这个还是OLLVM的变形,只是比较细粒度的化的处理,犹如传统虚拟机调度一般,在性能和兼容方面差不多的情况下,只要能增大逆向者的攻击者成本我觉得都是可取的,没必要纠结是不是传统虚拟机那一套。
混淆利用符号执行终究是可以还原的(还原到比较好分析嘛),这样就和虚拟机不是一个级别的了。
聚安全和顶象这种fla基本上是不影响效率和兼容性。
你上面也说也对,其实这个也和虚拟机的调度差不多,
只是没做指令包装或者说是指令转换,使得相对容易还原和分析,但保证了效率和兼容性及安全性的平衡。
2018-3-6 11:46
0
雪    币: 98
活跃值: (364)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
来,大佬,分享个样本。
2018-3-6 17:21
0
雪    币: 729
活跃值: (1306)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
12
大佬,你是怎么hook    findclass的,能给我看看代码吗
最后于 2018-3-8 15:10 被skyun编辑 ,原因:
2018-3-8 15:09
0
雪    币: 25
活跃值: (1111)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
skyun 大佬,你是怎么hook    findclass的,能给我看看代码吗
findclass很好hook啊,参考这个
  const  struct  JNINativeInterface*  anInterface=  env->functions;
        MSHookFunction((void  *)  anInterface->FindClass,
                                      (void  *)  &myFindClass,  (void  **)  &oldFindClass);
2018-3-9 10:57
0
雪    币: 729
活跃值: (1306)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
14
繁华皆成空 findclass很好hook啊,参考这个 const struct JNINativeInterface* anInterface= env->functions; MSHook ...
谢谢大佬指点
2018-3-21 08:32
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
现在普遍的厂商加固平台上的都是利用加固第二代技术,是么?再第二代加固技术上添加保护so,以及类抽取这些
2018-4-19 11:30
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
2018-4-21 00:21
0
雪    币: 1636
活跃值: (653)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
真大神
2020-3-26 15:06
0
游客
登录 | 注册 方可回帖
返回
//