[注意]哪位玩过WRK吗(VMProtect2.04简单分析)
发表于:
2010-4-25 12:36
9554
[注意]哪位玩过WRK吗(VMProtect2.04简单分析)
进来了必须顶,不管看不看
谁玩过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的返回值
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!