VMP的手动分析和AI还原

阅读量13438

发布时间 : 2025-12-11 15:15:32

VMP的手动分析和AI还原

作者:uiop@360SRC

前言

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

一、DEX-VMP实现原理

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

 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 进行嵌套,将核心逻辑与算法执行流完全虚拟化,从而提升代码混淆强度并抵抗传统指令级分析,类似如下实现即可防护通过指令数量来快速定位代码块的方法

参考

https://bbs.kanxue.com/thread-288731.htm
https://bbs.kanxue.com/thread-270799.htm
https://bbs.kanxue.com/thread-285212.htm
https://github.com/NiTianErXing666/SmallVmp
https://www.cnblogs.com/theseventhson/p/14933920.html

本文由360安全应急响应中心原创发布

转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/313690

安全KER - 有思想的安全新媒体

分享到:微信
+10赞
收藏
360安全应急响应中心
分享到:微信

发表评论

360安全应急响应中心

360安全应急响应中心(360 Security Response Center,简称360SRC)是360公司致力于保障产品及业务安全,促进白帽专家合作与交流的平台。诚邀白帽专家向我们反馈360产品安全漏洞、威胁情报,共筑数字安全基石,保障数亿用户业务和产品的安全。

  • 文章
  • 70
  • 粉丝
  • 15

热门推荐

Copyright © 北京奇虎科技有限公司 三六零数字安全科技集团有限公司 安全KER All Rights Reserved 京ICP备08010314号-66