在Themida / Winlicense脱壳后,在以下几种情况可能需要对SDK VM 进行处理。
1,程序分析需要。
2,由于最新版本anti-dump原因,有可能导致脱壳后的程序不能运行。
3,需要减小程序体积,删去TMD/WL壳区段。
TMD/WL VM的两种常见方式,
1,JMP 方式
在程序中很容易找到
jmp aaaaaaaa
aaaaaaaa:
push key
JMP vm_start
2,非jmp方式,如call XXXXXXXX。
TMD/WL VM的虚拟机出入口的一般方式:
push key
Jmp Vm_Start 进入虚拟机
00514835 9C pushfd ; Vm_Start 虚拟机入口
00519518 311C24 xor dword ptr ss:[esp],ebx
0051951B 331C24 xor ebx,dword ptr ss:[esp]
0051951E 8B2424 mov esp,dword ptr ss:[esp]
00519521 61 popad
00519522 9D popfd
00519523 C3 retn ;Vm_Retn 虚拟机出口
在虚拟机出口处可以得到返回的地址,如VM的API函数等:
popad
popfd
retn
Un VM步骤:
1,在OD的CPU窗口上 右键---选择find reference
2,在出现的reference窗口上选择要VM的jmp / call。
3,右键---选择UnVirtualizer with jump / no jump.
4,点确定。
5,再次 右键---选择UnVirtualizer with jump,此时会弹出一个文本窗口,查找
POP ESP
或者
MOV ESP, DWORD PTR SS:[ESP]
或者
MOV ESP,DWORD PTR [ESP]
或者
ADD ESP,0x4
一般从最后面往上找起,如找到
00C27B02 POP EAX
00C27B0D POP ESP
00C27B13 MOV ECX,DWORD PTR [EBP+0xfffffff0]
00C27B70 CMP DWORD PTR [ECX+0xfffffff8],EDI
那么,在弹出的窗口中输入00C27B13这个地址,点确定即可。
6,如何确认unVM的数据是否正确:
A,根据unVM后的最后一个数据JMP是否为(EB 10).或EB 11等,即最后面这个JUMP是短距离的往后跳,如果是跳到前面那说明unVM的
数据太多了。
B,只能根据上下文来判断。
以上过程如有补充或疑问,可问QQ: 9112627, 对软件破解、Winlicense脱壳,Zprotect脱壳,NP过校验,网络验证破解等有一定的研究。