写的不错,分享下。。。
MProtect之所以叫做VMProtect,因为它是以VM(Virtual Machine)虚拟机为核心来实现的,这里的虚拟机并不是传统意义上的虚拟机,其是将汇编指令进行虚拟化,让其失去原本容易理解的含义,增大对逆向工程的难度。
一.虚拟机
1) 虚拟机指令(VM_Handler)
VMP中的虚拟机指令可分为一下几类:
出入栈:PushReg、PushImm、PushEsp、PopReg、PopEsp...
运算:Add、Div、IDiv、Imul、Mul、Nor、Shl、Shr...
内存读写:ReadDs、ReadFs、WriteDs、WriteFs...
一些特殊的指令:GetHash、Jmp、Cpuid、CallApi、Rdtsc...
当然还有一些其他的如浮点运算的指令。
在这些指令中又可根据操作数大小的不同来进行细分。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的偏移。