VMProtect 学习笔记(转载)

写的不错,分享下。。。

MProtect之所以叫做VMProtect,因为它是以VMVirtual Machine)虚拟机为核心来实现的,这里的虚拟机并不是传统意义上的虚拟机,其是将汇编指令进行虚拟化,让其失去原本容易理解的含义,增大对逆向工程的难度。

一.虚拟机

1) 虚拟机指令(VM_Handler

VMP中的虚拟机指令可分为一下几类:

出入栈:PushRegPushImmPushEspPopRegPopEsp...

运算:AddDivIDivImulMulNorShlShr...

内存读写:ReadDsReadFsWriteDsWriteFs...

一些特殊的指令:GetHashJmpCpuidCallApiRdtsc...

当然还有一些其他的如浮点运算的指令。

在这些指令中又可根据操作数大小的不同来进行细分。VMP将原程序的指令进行分解转换为由这些Handler组成的新的指令操作集合,实现程序的虚拟化。这些Handler的地址存放于一张指令表中,通过调度执行。从Opcode的解码过程中可以看出,该表的大小为0x100

2) 虚拟机调度(VM_Dispatch

VMP中的虚拟机调度一般以这样的形式存在:

Opcode 解码

mov Reg0,dword ptr ds:[Reg1*4+<VMHandlerTable>]

Handler地址解码

转到Handler执行

3) 虚拟机Context

VM_Context主要涉及对真实环境中上下文的保存,以及一些数据的传递。其组成主要有:

+00 RELOC

+04 ANTIDUMP

+08 ECX

+0C EDI

+10 EDX

+14 EFL

+18 EBP

+1C ESI

+20 EAX

+24 EBX

+28 ESI

+2C RETADDR

+30 INITKEY

其中的寄存器存储位置在每个虚拟机中都有所不同。VMP中对一些一些寄存器的使用也有规定比如:ESI记录opcode的位置(VM_Eip),EBP记录VM使用堆栈的位置(VM_Esp),EDI中储存着VM_Context的偏移。

下载地址:http://www.vdisk.cn/down/index/19534752

原文地址:https://www.cnblogs.com/Sendige/p/9600760.html