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...

相关推荐
浩浩测试一下14 小时前
汇编 标志位寄存器 (逆向分析 )
c语言·汇编·逆向·windows编程·标志寄存器
浩浩测试一下14 小时前
汇编 数组与串指令(逆向分析)
汇编·逆向·二进制·免杀·串指令·汇编数组
程序00717 小时前
.NET玩转爬虫 遇到反爬 jsl cookie
逆向
RSCompany1 天前
Frida 17 以后 Python API 跑旧版 JS 报 Java is not defined ?一行 import 直接恢复 Frida 16 体验
开发语言·python·逆向·hook·frida·android逆向·frida17
浩浩测试一下1 天前
汇编中的JCC指令 (逆向分析)
汇编·逆向·标志位·jcc指令·跳转指令·标志位寄存器
浩浩测试一下2 天前
汇编中的段与段寄存器(大小)段序 (逆向分析)
汇编·逆向·二进制·字节序·windows编程·内存地址排序
浩浩测试一下4 天前
汇编 位运算 (逆向分析)
汇编·逆向·位运算·asm·windows编程·二进制逆向
浩浩测试一下4 天前
汇编 高低八位寄存器数据存储方式(逆向分析)
汇编·网络安全·逆向·二进制·免杀·寄存器·windows编程
泡泡以安8 天前
Unidbg学习笔记(十三):固定随机干扰项
android·逆向
泡泡以安8 天前
Unidbg学习笔记(十六):Console Debugger
android·逆向