抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

vmp是什么

VMP(Virtual Machine Protection)是一种流行的内存不还原壳技术,它通过自定义虚拟机来执行变形后的字节码,而不直接执行原始的DEX字节码。

加壳过程:

  1. 受保护函数抽取与插桩:VMP壳首先会从程序中抽取需要保护的函数体,并对其插桩,形成对特定代码的控制。
  2. 字节码变形:抽取的字节码中的操作码部分会经过变换,变形后的字节码被加密并存储到私密文件中。
  3. 变形字节码加密存储:变形后的字节码通常被加密存储在一个私密文件中,这个文件在程序运行时会被加载。
  4. 自定义虚拟机解释执行:当需要执行受保护的函数时,VMP壳通过JNI调用自定义的适配器函数,该函数根据索引找到变形字节码在内存中的位置,并传递给VMP壳的自定义解释器执行。

运行过程:

  1. 加载变形字节码:加壳后的DEX文件被加载到内存中。当受保护函数被调用时,VMP壳会通过JNI调用其自定义适配器函数。
  2. 通过自定义解释器执行字节码:自定义解释器接收到的字节码经过循环取值、译码和解析执行的步骤,最终完成对受保护函数的执行。
  3. JNI与虚拟机的交互:VMP的自定义解释器与标准的Android虚拟机(ART)通过JNI进行交互,执行对应的操作。

这种方式下,虽然程序在执行时,内存中的字节码并没有还原成标准的DEX文件,而是变形过的代码。然而,这种变形后的代码与原始代码在功能上是等效的,只有通过VMP壳自定义的解释器才能正确执行。

VMP壳脱壳的难点

与传统的内存还原壳相比,VMP壳的脱壳过程更加复杂,因为它的关键机制在于将字节码变形,并通过一个自定义虚拟机解释器来执行。因此,脱壳的难点主要集中在两个方面:

1) 获取变形字节码

  • VMP壳的变形字节码通常会被加密存储在某个文件中,在程序运行时被加载到内存中。为了脱壳,首先需要通过某种方式提取出这些变形字节码。
  • 由于自定义虚拟机在执行过程中会将字节码逐步解密并加载到内存中,因此通过动态分析,可以监控解释器的取指令过程,获取这些字节码。

2) 找到字节码映射关系

  • 自定义字节码和标准字节码具有等效的执行结果。因此,通过执行代码的语义等效性,可以找到自定义字节码和标准字节码之间的映射关系。
  • 这一映射关系的建立,通常依赖于对VMP壳自定义解释器与Android虚拟机(ART)的执行代码进行对比分析。通过比对两者执行的行为,可以发现它们之间的等效点,从而实现对变形字节码的逆向分析。

总结:

要脱掉VMP壳,必须做到两点:

  • 获取VMP壳使用的变形字节码。
  • 找到变形字节码和标准字节码之间的映射关系。

VMP壳的防御体系

VMP壳的核心部分是其自定义的虚拟机解释器,这也是脱壳时需要重点破解的部分。为了保护这个虚拟机解释器,VMP壳厂商通常会采取多种防护手段,包括静态防护和动态防护。

静态防护

  • 反反汇编:通过插入“花指令”(垃圾指令)和代码混淆来防止静态分析工具(如IDA、Ghidra等)正确反汇编和分析程序。这些“花指令”会阻碍反汇编工具的解析,导致解析错误,增加分析难度。
    • 不可执行花指令:通过无效的指令或跳转指令,使得反汇编工具在解析过程中遇到错误。
    • 可执行花指令:通过跳转指令或动态生成代码,使得反汇编工具无法解析正确的执行路径。
  • 代码混淆:例如使用LLVM的控制流平坦化技术,将顺序执行的代码转化为包含多个switch-case结构的代码块,打乱了代码的执行顺序,使得即使是静态反汇编后的代码,也很难理解原始的控制流结构。

动态防护

  • 反调试技术:VMP壳通过多种动态反调试手段来防止调试器附加到程序中,常见的反调试技术包括:
    • 时间反调试:检测程序在运行时是否被调试。通过测量函数执行时间的延迟,判断是否存在调试器。
    • 进程反调试:检查进程中是否存在调试工具,如gdb,并通过PTrace等机制阻止调试器的附加。
    • 端口反调试:检测调试工具常用的端口是否被占用,如IDA的默认端口23946。
  • 动态代码混淆:在程序运行时,根据实时环境生成混淆代码,增加动态分析时的破解难度。通过监控调试器的行为,调整代码路径,防止动态调试器的监控。

dex-vmp和arm-vmp有什么区别

顾名思义最大区别一个针对java层,一个针对so层

Dex-vmp原理:对原 dex 处理,找到要保护的方法,将原指令翻译成等价指令,加密存储,并将原指令替换为 VMP 入口指令 - 实现 VM,解释执行存储的等价指令。那么这样这样实现的VM可以在java层也可以在so层,一般来说是放在so层。

(1)解析dex: 定位保护的方法,可以手动解析dex文件或者使用开源库dexlib2

(2)将原指令翻译成等价指令 : 这里就需要通过jni接口实现,这也是为什么dex-vmp加壳后有native标签,我们知道一条java指令对应可以用jni指令进行实现,那么我们需要的就是将对应的方法通过jni接口调用so层中c/c++实现方法进行翻译。

因为dex-vmp需要调用jni接口,所以一定会调用CallVoidMethod方法等,所以这也是为什么很多快速追踪vmp调用栈选择InvokeWithVarArgs的原因

(3)实现VM: vm基于寄存器结构,我们需要初始化寄存器,然后对对应的Opcode进行翻译,这里调用一些jni接口

(4)解决JNI兼容的问题

arm-vmp原理:将so文件中的arm汇编的指令码转换为自定义的虚拟指令。核心是虚拟指令集和虚拟指令解释器

(1)将Native化的java代码和原C++代码使用Capstone进行反编译,生成原生汇编码

(2)使用随机生成的矩阵将原生指令码转换为虚拟指令码

(3)通过虚拟指令解释器对虚拟指令码进行解释

vmp是自己实现解释器,而dex2c还是用的原生的art来解释。

对于字节码解密函数的定位 其实还可以用frida监控内存读写的方式得到。另外hook所有的jni函数 监控其字段读写 函数调用 解析参数返回值 在指定vmp函数进入时记录这些信息 指定vmp函数离开时输出这些信息 可以快捷精准地分析指定的vmp函数

可以通过黑盒探测,如通过各种hook、修改源码等定制ART,实现对VMP保护的函数的执行轨迹的跟踪记录如基于frida实现的jnitrace,或者自行简单定制ART,输出关键的函数调用关系

一些文章

ARM平台VMP保护开发入门 - 我是小三 - 博客园

vmp入门(一):android dex vmp还原和安全性论述

[原创] 某DEX_VMP安全分析与还原-Android安全-看雪-安全社区|安全招聘|kanxue.com

移动端VMP攻防-如何分析VMP&入门篇

so加固整理:

libnqshield.so/国信灵通 libvenSec.so/启明星辰 libmobisec.so/阿里聚安全 libvenustech.so/启明星辰 libtup.so/腾讯乐固(旧版) libchaosvmp.so/娜迦加固 liblegudb.so/腾讯乐固(旧版) libddog.so/娜迦加固 libshella/腾讯乐固(旧版) libfdog.so/娜迦加固 libshel1x/腾讯乐固(日版) libedog.so/娜迦加固(企业版) mix.dex/腾讯乐固(旧版) libexec.so/爱加密 mixz.dex/腾讯乐固(旧版) libexecmain.so/爱加密 libshell-super.2019.so/腾讯云移动应用安全(腾讯御安全) ijiami.dat/爱加密 libBugly-yaq.so/腾讯云移动应用安全(腾讯御安全) ijiami.ajm/爱加密 libzBugly-yaq.so/腾讯云移动应用安全(腾讯御安全) libsecexe.so/梆梆安全 tosversion/腾讯云移动应用安全(腾讯御安全) libsecmain.so/梆梆安全 libshellx-super.2019.so/腾讯云移动应用安全(腾讯御安全) libSecShel1.so/梆梆安全 tosprotection/腾讯云移动应用安全(腾讯御安全) 1ibDexHelper.so/梆梆安全(企业版) 000000111111.dex/腾讯云移动应用安全(腾讯御安全) libDexHelper-x86.so/梆梆安全(企业版) 000000111111.dex/腾讯云移动应用安全(腾讯御安全) .appkey/360加固 000000011111.dex/腾讯云移动应用安全(腾讯御安全) libprotectClass.so/360加固 00000o11111.dex/腾讯云移动应用安全(腾讯御安全) libjiagu.so/360加固 000001111111/腾讯云移动应用安全(腾讯御安全) libjiagu_ls.so/360加固 o0ooo000oo0o.dat/腾讯云移动应用安全(腾讯御安全) libjiagu_x86.so/360加固 t86/腾讯云移动应用安全(腾讯御安全) libjiagu_a64.so/360加固 libtosprotection.x86.so/腾讯云移动应用安全(腾讯御安全) libjiagu_x64.so/360加固 libtosprotection.armeabi.so/腾讯云移动应用安全(腾讯御安全) libjiagu_art.so/360加固 libtosprotection.armeabi-v7a.so/腾讯云移动应用安全(腾讯御安全) 1ibjgdtc.so/360加固 libnesec.so/网易易盾 libjgdtc_x86.so/360加固 libAPKProtect.so/APKProtect libjgdtc_a64.so/360加固 libkwscmm.so/几维安全 libjgdtc_x64.so/360加固 libkwscr.so/几维安全 libjgdtc_art.so/360加固 libkwslinker.so/几维安全 libegis.so/通付盾 libx3g.so/顶像科技 libNSaferOnly.so/通付盾 libuusafe.jar.so/UU安全 libapssec.so/盛大加固 libuusafe.so/UU安全 librsprotect.so/瑞星加固 libuusafeempty.so/UU安全 libitsec.so/海云安加固 mogosec_classes/中国移动加固 libnqshield.so/网秦加固 mogosec_data/中国移动加固 libbaiduprotect.so/百度加固 mogosec_dexinfo/中国移动加固 libbaiduprotect_x86.so/百度加固 mogosec_march/中国移动加固 libbaiduprotect_art.so/百度加固 libcmvmp.so/中国移动加固 baiduprotect1.jar/百度加固 libmogosec_dex.so/中国移动加固 aliprotect.dat/阿里聚安全 libmogosec_sodecrypt.so/中国移动加固 libsgmain.so/阿里聚安全 ibmogosecurity.so/中国移动加固 libfakejni.so/阿里聚安全 libreincp.so/珊瑚灵御 libzuma.so/阿里聚安全 libreincp_x86.so/珊瑚灵御 libzumadata.so/阿里聚安全 jiagu_data.bin/apktoolplus libpreverify1.so/阿重聚安全 sign.bin/apktoolplus libdemolishdata.so/阿重聚安全 libapktoolplus_jiagu.so/apktoolplus libdemolish.so/阿里聚安全 libsgsecuritybody.so/阿重聚安全

评论