进来了必须顶,不管看不看

谁玩过WRK吗
当我定义_X86_PAE_宏的时候少个头文件,谁尝试过恢复吗
微软太不厚道了,提供又不提供全
有兴趣恢复或者已经恢复的兄弟加我QQ 7448217

VMProtect是crack本营俄罗斯出的一款保护软件, VMProtect的特点有三个1 头晕, 2目眩 3同上



和普通加壳软件不一样的地方 

VMP将X86代码转换为中间代码 

由VMP嵌入可执行文件中的解析引擎予以解析 

该引擎的特点是大量被加垃圾代码使用了很多怪异指令 中间字节码动态解密

分析难度非常大



一条mov eax, 0 经过vmprotect 2.04加密后 OD RunTrace 3000多条指令 字节码指令有40多条



VMP虚拟机的LOOP(经过删除了部分无用指令后):

0040668E  >  8A46 FF      mov    al, byte ptr [esi-1]
00406691  . |00D8          add    al, bl
00406693  . |F5            cmc
00406694  . |C0C8 02      ror    al, 2
00406697  . |66:85F0      test    ax, si
0040669A  . |04 D3        add    al, 0D3
0040669C  . |C0C0 06      rol    al, 6
0040669F  . |00C3          add    bl, al
004066A1  . |0FB6C0        movzx  eax, al
004066A4  . |83C6 FF      add    esi, -1

004066DA  .  8B0C85 006140>mov    ecx, dword ptr [eax*4+406100]

0040779B  $  C1C9 19      ror    ecx, 19

此时ECX指向了他的一个handler

可以看出他的基本结构: 指令指针在ESI中 字节码由BL动态解密

HANDLER理论上有256个

每一次编译这个LOOP都会不一样,但是基本原理差不多



VMP会在加密的代码块前面加一条push xxx jmp xxx

在我机器上从虚拟机入口进入到取指令循环经历了茫茫91条指令
大部分指令是故意混乱的

第一条指令是 push 0402104 这个地址指向.rdata中
之后 jmp 到vmp1中(默认用VMPROTECT2.04没有修改段名)

从我们的代码进入到VMP的虚拟机需要做的事情:
1, 初始化指令指针esi
      跳入到vmp1中之后第一次实际压入的地址(不包括他为了混乱随便压了又弹得)是esi的地址,不过这里还是加密过后的 后面对该地址进行了解密,如果要实现编程提取他的地址好像很有难度
      实际上ESI这个时候还不是完全指向的VM字节码在虚拟机循环里面展现了一个偏移 我这里是 -1应该每次VM编译都会不一样
2, 初始化解密密钥bl
      EBX = 解密后的ESI 也就是说SI的低8位作为初始密钥
3, 保存现场环境以便退出虚拟机时恢复
      我这里的从进入vmp1段堆栈结构是
52D724A7 这个是在指令指针后面压入的一个值,暂时没分析出他的作用
加密的指令指针
eax
ebx
ebp
edi
esi
edx
eflags
ebx
ecx
0
ebp-> 0
esp-> 48个位子(4字节一个)

编译条件不变每次编译混乱的都不一样,但是基本框架是这样,可能版本不一样框架会稍有变化


出口第一句实际指令就是 mov esp, ebp

入口保留的48个空位难道是VM虚拟机用来做为临时用途的

然后再是从入口保存的寄存器信息里恢复,

也就是说VM字节码要改变实际寄存器的值只要改变这里的值就OK,

分析哪些HANDLER改变寄存器可以用 hw...



将近返回的时候有一个VM HANDLER写了刚开始进入VM的时候压入在堆栈的值, 这个值在出口的时候是VM的返回值