VMP的手动分析和AI还原

VMP的手动分析和AI还原

作者:uiop@360SRC

前言

DEX-VMP:主要保护Android应用中的Java/Kotlin方法。它会将Dex文件中的ART字节码转换为自定义字节码,并将原方法标记为native方法。

一、DEX-VMP实现原理

根据art虚拟机解释模式可以模仿实现自定义操作码进行取值、译码、执行 以下是简易实现

c 复制代码
1. // 一个简化的解释器核心循环
2. while (true) {
3.     // 1. 取值 (Fetch)
4.     unsigned char opcode = *vip++; // 从指令流中读取操作码
5.  
6.     // 2. 译码 (Decode) 并 3. 执行 (Execute)
7.     switch (opcode) { // 根据自定义操作码跳转到对应的处理函数
8.         case OP_ADD:  // 如果是加法指令
9.             // ... 执行加法的具体代码 ...
10.             break;
11.         case OP_MOV:  // 如果是移动数据指令
12.             // ... 执行移动数据的具体代码 ...
13.             break;
14.         // ... 其他成百上千的指令处理分支 ...
15.     }
16. }

二、手动分析流程

分析流程根据实现思路,可以围绕取值阶段来还原自定义操作码;

  • 1、首先看看静态分析能否获取到信息

    通过hook registernative获取到MainActivity.onCreate的地址在0x7401b38088 查看maps内存空间可以定位注册在以下标记的一段匿名可执行内存空间中

    将上边内存空间dump出来,可以看到这段代码为跳板函数会跳转到0x7362fb934执行函数

    0x7362f对应在下边内存,通过以前对壳的分析,这段匿名内存是通过壳进行加载并匿名的实际逻辑实现

    对正在执行oncreate函数的内存进行Dump并完成修复,会发现函数存在大量br跳转,手动简单修复br跳转后查看oncreate函数(未完全修复完毕),需结合动态半自动修复

    可以查看大体函数执行逻辑

    修复后的cfg,可以看出很多跳转缺失,纯靠静态分析是非常困难,需要结合动态调试来下一步分析

  • 2、定位取值阶段

    分为有无源码对比,可使用两种突破方式,

    1. 通过 JNITRACE分析函数大致执行逻辑,使用指令级 Trace,通过指令块循环次数结合函数指令大小,从而实现突破。
    2. 利用有源码的函数开头的稳定特征,监控读取操作精准命中,实现突破。

    通过指令大小并结合trace进行快速定位代码块进行分析:通过分析oncreate函数开头以及指令大小定位内存加密后的oncreate函数指令位置,此 oncreate函数存在58条指令 源码开头:

    在dump的dex中查找指令开头位置再0x63f77c

    通过trace的log分析后,发现以下代码块出现了58次正好结合58条指令,猜测并标记地址为取指令行为

    知道取指令地址后下监控断点验证查看确实在0x167608处取出指令

    跳转过去分析取值后跳到0x16766c

    分析0x16766c取指后操作进行字节码解密处理

    通过以上分析可以发现完全和trace的猜测一样。

    继续通过修复oncreate函数追踪分析13353c发现存在jni映射

    修改结构体顺序还原自定义jni映射

    向下追踪找到执行实际函数操作

    通过回调向上分析

    结合trace验证,确定为分发指令到0x15af88里边执行

    Hook该解密函数获取所有opcode

    接下来就是通过dex索引查找函数一步步进行字节还原,需要手工对照一点点还原比较耗时;能否取巧结合ai方式进行还原,可以进一步实践;

三、基于AI还原

dex vmp的基础支撑其实是jni函数,通过追踪jni调用,人工分析基本代码流程,筛选后的tracelog再结合强大的ai能力进行还原能节省很多人工分析流程时间,以下为ai还原对照,可以看到对于简单的函数可以进行完美还原,缺点是对于复杂函数涉及的log非常大的话需要多次拼接进行分析,造成的结果可能不是特别准确,但是基本逻辑不会出现问题可以进行正常的逆向分析

  • Ai还原代码:

  • 源dex反编译代码:

四、VMP保护更安全的展望

针对以上分析过程使用的突破方式,可以采用的防护手段

  • JNItrace防护 1、通过jnienv计算所有jni函数偏移量来通过函数指针形式进行调用隐藏所有jni的调用过程 2、通过jnienv获取jni接口地址,检测jni接口函数是否在libart范围内,以及jni函数开头是否改变,防护Jnitrace、frida-trace、xposed实现的jnitrace。

  • 指令trace防护 1、采用 DexVM 与并对解密算法 VM 进行嵌套,将核心逻辑与算法执行流完全虚拟化,从而提升代码混淆强度并抵抗传统指令级分析,类似如下实现即可防护通过指令数量来快速定位代码块的方法

参考

bbs.kanxue.com/thread-2887... bbs.kanxue.com/thread-2707... bbs.kanxue.com/thread-2852... github.com/NiTianErXin... www.cnblogs.com/thesevenths...

相关推荐
胡八一1 天前
Ghidra逆向分析工具使用
逆向
TouchWorld1 天前
iOS逆向-哔哩哔哩增加3倍速(1)-最大播放速度
ios·逆向
介一安全3 天前
【Frida Android】实战篇12:企业常用对称加密场景 Hook 教程
android·网络安全·逆向·安全性测试·frida
漏洞文库-Web安全3 天前
渗透测试中的方法论
linux·运维·学习·安全·web安全·网络安全·逆向
Glommer4 天前
Akamai 逆向思路
javascript·爬虫·逆向
clown_YZ5 天前
Glacier CTF 2025--部分题解
网络安全·逆向·ctf
漏洞文库-Web安全6 天前
Linux逆向学习记录
linux·运维·学习·安全·web安全·网络安全·逆向
介一安全6 天前
【Frida Android】实战篇11:企业常用加密场景 Hook(1)
android·网络安全·逆向·安全性测试·frida
Jevely54006 天前
frida基础 so篇(一)
逆向