概述
VMProtect是一款基于虚拟机技术的可执行文件保护工具。它将目标程序转换成一种虚拟机指令集,称为VM代码,这种指令集与目标程序原本的指令集不同。VMProtect还会加密、混淆和优化VM代码,增加破解者分析和逆向的难度。VMProtect还提供了各种反调试和防止破解的技术。
下面分别介绍VMProtect的几个主要原理:
1.虚拟化
VMProtect的核心是一个虚拟机,它能够执行VM代码。在保护目标程序时,VMProtect将目标程序的指令集转换成VM代码。VM代码包含了大量的控制流程和数据转换指令,这些指令不是真正的处理器指令,只有VMProtect的虚拟机能够理解和执行它们。因此,将目标程序转换成VM代码,增加了破解者分析和逆向的难度。
2.加密
VMProtect还会加密目标程序的代码和数据。这些加密后的数据和代码需要在运行时解密才能使用。加密和解密的过程中使用了对称密钥加密算法,这样可以防止破解者直接分析目标程序的代码和数据。
3.代码转换
VMProtect对目标程序的代码进行转换和优化,使得程序的逻辑更加复杂和混淆,增加了破解者的逆向难度。例如,VMProtect会将一些简单的逻辑运算拆分成多个指令,使得破解者需要更多的时间和精力才能还原出原始的逻辑运算。
4.反调试
VMProtect提供了多种反调试技术,可以检测调试器的存在并防止调试器对目标程序进行调试。例如,VMProtect可以在运行时检测目标程序是否在调试器中运行,或者通过修改代码来增加调试器的难度。
5.杂项保护
除了上述几种主要的保护技术之外,VMProtect还提供了许多其他的保护技术,如内存保护、反内存dump、反动态链接等。这些技术可以增加破解者的难度,使得他们需要更多的时间和精力才能破解目标程序。
综上所述,VMProtect通过虚拟化、加密、代码转换、反调试和杂项保护等多种技术来保护目标程序的安全性,增加了破解者的逆向难度。
分析
VMPDump
https://github.com/0xnobody/vmpdump
VMPDump是由 VTIL 提供支持的动态 VMP 转储器和导入修复器。适用于 VMProtect 3.X x64。
用法
VMPDump.exe <Target PID> “<Target Module>” [-ep=<Entry Point RVA>] [-disable-reloc]
<Target PID>:目标进程ID,十进制或十六进制形式
“<Target Module>”:模块名称,可为空
[-ep=<Entry Point RVA>]:可选,十六进制格式的入口点RVA
[-disable-reloc]:可选,关闭基质重定位,保证加载时以转储时的ImageBase地址加载
原理
- Import Stubs: 在可执行文件中,用于调用动态链接库(DLL)函数的指令通常是通过导入表中的函数入口地址来实现的。VMPProtect在每个导入调用或跳转处注入了一个stub(桩代码),这些stub用于解析.vmpX节中的’obfuscated’ thunk(混淆的跳转目标),并添加一个固定常量来对其进行”deobfuscation”(解混淆)。然后,使用ret指令来执行这些调用或跳转。
- VMPDump: 用于将使用VMPProtect保护的可执行文件还原为原始代码。VMPDump会扫描所有可执行节(sections)中的这些stub,并使用VTIL x64 lifter将它们转换为VTIL(Virtual Thunk Interface Language)。然后对这些stub进行分析,以确定需要替换的调用类型以及需要覆盖的字节。
- Import Table and Thunks: VMPDump会创建一个新的导入表,并在现有导入地址表(IAT)中追加thunk。之后,对VMP import stubs的调用会被替换为对这些thunk的直接调用。
- Byte Replacement and Stub Injection: 在经过变异处理的程序中,有时无法使用一个字节替换VMP import stub调用为直接的thunk调用,因为后者需要更多的字节(1字节)。在这种情况下,VMPDump会扩展节(section)并注入一个跳转到导入thunk的stub。然后,VMP import stub的调用被替换为对注入的stub的5字节相对调用或跳转。
VMProtect原理
1. **导入调用和跳转的保护**:VMProtect通过为每个导入调用(import call)或跳转(jmp)注入代码片段(stubs)来保护软件。这些代码片段负责解析位于`.vmpX`区段中的“混淆”指针(thunk)。
2. **去混淆和分派**:这些代码片段通过添加一个固定常量来“去混淆”指针,然后通过`ret`指令分派实际的调用或跳转。这种方法使得直接分析软件变得更加困难,因为原始的调用或跳转指令被混淆。
VMPDump原理
1. **识别和提升代码片段**:VMPDump扫描所有可执行的区段,寻找VMProtect注入的这些代码片段。然后,使用VTIL x64提升器(lifter)将这些代码片段转换成VTIL(Virtual-Trust Intermediate Language,虚拟可信中间语言)格式。
2. **分析和替换调用**:对这些代码片段进行分析,以确定需要替换的调用类型和需要覆盖的字节。这允许VMPDump还原原始程序的调用和跳转。
3. **创建新的导入表和修正调用**:一旦检索到所有调用,VMPDump创建一个新的导入表,并将thunk添加到现有的导入地址表(IAT)中。对VMProtect导入片段的调用被替换为直接调用这些thunk。
4. **处理变异例程**:在变异的例程(mutated routines)中,有时由于空间限制,不能直接替换VMProtect导入片段的调用为直接thunk调用。在这种情况下,扩展区段并注入跳转到导入thunk的新代码片段。VMProtect的调用随后被替换为指向这个新注入的代码片段的5字节相对调用或跳转。
VTIL(Virtual Trust Intermediate Language)
VTIL是一个专门为二进制翻译和优化而设计的中间表示(Intermediate Representation,IR)。简单来说,VTIL 是一种用于理解和转换计算机程序的工具,特别是那些编译成机器代码(如二进制文件)的程序。
在更通俗的语言中,可以将 VTIL 理解为一种“翻译工具”。当程序员写程序时,他们通常使用高级语言(如 C++ 或 Python)。这些程序最终会被编译成机器可以理解的语言,即机器代码。然而,机器代码对于人类来说通常很难理解和修改。VTIL 的目的是在机器代码和更易于人类理解的形式之间提供一种中间表示,从而使得分析、理解和优化已编译的程序变得更加容易。
VTIL 专注于提供高效的二进制翻译和优化,这对于逆向工程、程序分析和安全研究等领域非常重要。通过 VTIL,专业人员可以更容易地理解和修改编译后的程序,从而进行安全分析、性能优化或其他类型的研究。