VMProtect 的虚拟机
最近被寂寞轰炸,元旦快完蛋了,分析一下 VMProtect吧
可能不准确,但是可以作为初级读本来了解这个保护
附件下载:xxx.rar
==========================
Abstact
==========================
1 - 既然是 VM,就有自己的 CONTEXT,而 VMCONTEXT 是线程相关的(安全、可重入)
每个未注册的线程进入 VM 会在 VM 的线程槽中用 ThreadID 注册一个槽
然后用此槽号来访问 VMSEG_DATA 中对应的 VMCONTEXT
2 - 有一个主循环解码 OPCODE
可以设断开发一个类似WKT DBGR的工具
3 - 类似于 VC PCODE 或者 MMX 指令
所有数据(包括运算结果的符号)都通过堆栈传递
4 - 跟VM数据区交换的同一指令在 DispatchDescriptor 中有很多描述,比如vpop
其中某些位指出了偏移量
5 - 运算指令总是结束后pushf
这样在VM解码的过程中不会丢失符号
6 - 指令解释器的序列不同的文件不一样,但看起来指令的特征不会变(想象FLIRT)
同一个VICTIM可以识别出来生成一个MAP来调试!这一点很重要!!!!
7 - 指令解释器的代码基本不变,但涉及立即数操作的
会加入随机的解码算法,但应该可以根据首尾特征来判断虚拟指令
8 - 一些指令的 BYTE 立即数被扩展成了 WORD,但只利用 BYTE 位
9 - VM 跟 x86 不对应,很多垃圾,也许我指分析到了最浅的一层
我深刻地感到,也许还有VM中的VM?
==========================
Example
==========================
很晕!以我加了一个混乱OEP的notepad.exe为例
!!!注记符是我起的,不要太在意,可以按浮点指令理解
进入VM的代码样式为:
push key0
push VMSEG_CODE//代码段
jmp VMP_MAIN
此例一开始堆栈环境为
[00000000]
[EDI]
[EFlags]
[ESI]
[EAX]
[EBP]
[EDX]
[ECX]
[EBX]
[EAX]
[VMSEG_CODE]
[key0]//这里为E95243D1
vpop//这个指令是一个系列的,OPCODE & 3C 也就是111100为1的位表示在VMSEG_DATA中的偏移
...
vpop//将上面的寄存器弹到VM CONTEXT中去
vpush B2C49D2C
vadd//注意这个指令运算后pushfd,运算结果为9C16E0FD
vpop//保存符号
vpop//保存结果
vpushw//压入0001
vpushv//0001入栈C
vpushv//9C16E0FD入栈B
vpushv//9C16E0FD入栈A
vshld//shld A,B,C,保存结果&符号
vpop//保存符号
...好多
===============================
List
===============================
我用猜的方法命名了一些指令,都以v开头,
后来有点规则混乱但是没有改,涉及到跟VMDATA传输的以vv开头
如果是求值操作结尾为pd/w/b,其中b可能被扩展成WORD样子push了
我也混乱了,不说了,这是一张表,详细的请看 idb
pcode_dispatch_table dd offset vvpop
.vmp0:010174FD
.vmp0:01017501 dd offset vshr
.vmp0:01017505 dd offset loc_10174EF
.vmp0:01017509 dd offset loc_10174AD
.vmp0:0101750D dd offset vvpop
.vmp0:01017511 dd offset loc_10174D1
.vmp0:01017515 dd offset vpopw
.vmp0:01017519 dd offset vpushpb
.vmp0:0101751D dd offset vvpop
.vmp0:01017521 dd offset vpushvesp
.vmp0:01017525 dd offset vpopcs
.vmp0:01017529 dd offset vpushvesp
.vmp0:0101752D dd offset vvpop
.vmp0:01017531 dd offset vpushb2d
.vmp0:01017535 dd offset loc_10174EF
.vmp0:01017539 dd offset vpushimm32
.vmp0:0101753D dd offset vvpop
.vmp0:01017541 dd offset vnaw
.vmp0:01017545 dd offset vaddp
.vmp0:01017549 dd offset vpoppd
.vmp0:0101754D dd offset vvpop
.vmp0:01017551 dd offset vaddb
.vmp0:01017555 dd offset vvpushpw
.vmp0:01017559 dd offset vpopcs
.vmp0:0101755D dd offset vvpop
.vmp0:01017561 dd offset vshlb
.vmp0:01017565 dd offset loc_10178FD
.vmp0:01017569 dd offset vpushdwptr
.vmp0:0101756D dd offset vvpop
.vmp0:01017571 dd offset loc_10174AD
.vmp0:01017575 dd offset vpushw
.vmp0:01017579 dd offset vaddw
.vmp0:0101757D dd offset vvpop
.vmp0:01017581 dd offset vshld
.vmp0:01017585 dd offset vsetesp
.vmp0:01017589 dd offset vnna
.vmp0:0101758D dd offset vvpop
.vmp0:01017591 dd offset vshr
.vmp0:01017595 dd offset vvpushb
.vmp0:01017599 dd offset vaddp
.vmp0:0101759D dd offset vvpop
.vmp0:010175A1 dd offset loc_1017400
.vmp0:010175A5 dd offset vvpushpw
.vmp0:010175A9 dd offset vpushimm32
.vmp0:010175AD dd offset vvpop
.vmp0:010175B1 dd offset vpushpd
.vmp0:010175B5 dd offset vshlb
.vmp0:010175B9 dd offset vpushw
.vmp0:010175BD dd offset vvpop
.vmp0:010175C1 dd offset vpushw2d
.vmp0:010175C5 dd offset vshlw
.vmp0:010175C9 dd offset loc_10174EF
.vmp0:010175CD dd offset vvpop
.vmp0:010175D1 dd offset vpushsp
.vmp0:010175D5 dd offset vpushwi
.vmp0:010175D9 dd offset vpushpw
.vmp0:010175DD dd offset vvpop
.vmp0:010175E1 dd offset vpushb2d
.vmp0:010175E5 dd offset vnna
.vmp0:010175E9 dd offset vpopw
.vmp0:010175ED dd offset vvpop
.vmp0:010175F1 dd offset vpushvesp
.vmp0:010175F5 dd offset vpoppd
.vmp0:010175F9 dd offset vnaw
.vmp0:010175FD dd offset vvpush
.vmp0:01017601 dd offset vvsetb
.vmp0:01017605 dd offset vpushw2d
.vmp0:01017609 dd offset vnnab
.vmp0:0101760D dd offset vvpush
.vmp0:01017611 dd offset vhalt
.vmp0:01017615 dd offset loc_101740C
.vmp0:01017619 dd offset vpopcs
.vmp0:0101761D dd offset vvpush
.vmp0:01017621 dd offset vpushpd
.vmp0:01017625 dd offset vpushw2d
.vmp0:01017629 dd offset vshlb
.vmp0:0101762D dd offset vvpush
.vmp0:01017631 dd offset vshr
.vmp0:01017635 dd offset vshl
.vmp0:01017639 dd offset loc_10174D1
.vmp0:0101763D dd offset vvpush
.vmp0:01017641 dd offset vpushpd
.vmp0:01017645 dd offset loc_10174D1
.vmp0:01017649 dd offset vpushwi
.vmp0:0101764D dd offset vvpush
.vmp0:01017651 dd offset vpushw
.vmp0:01017655 dd offset vpopsp
.vmp0:01017659 dd offset vstob
.vmp0:0101765D dd offset vvpush
.vmp0:01017661 dd offset vvpushb
.vmp0:01017665 dd offset vpopcs
.vmp0:01017669 dd offset vpushdwptr
.vmp0:0101766D dd offset vvpush
.vmp0:01017671 dd offset vshlb
.vmp0:01017675 dd offset vpushpb
.vmp0:01017679 dd offset loc_10174EF
.vmp0:0101767D dd offset vvpush
.vmp0:01017681 dd offset vpushsp
.vmp0:01017685 dd offset vaddw
.vmp0:01017689 dd offset vpopsp
.vmp0:0101768D dd offset vvpush
.vmp0:01017691 dd offset loc_10174AD
.vmp0:01017695 dd offset vvpushpw
.vmp0:01017699 dd offset loc_101740C
.vmp0:0101769D dd offset vvpush
.vmp0:010176A1 dd offset loc_10174AD
.vmp0:010176A5 dd offset vpoppw
.vmp0:010176A9 dd offset vstopb
.vmp0:010176AD dd offset vvpush
.vmp0:010176B1 dd offset vd2w
.vmp0:010176B5 dd offset loc_10174EF
.vmp0:010176B9 dd offset vvpushb
.vmp0:010176BD dd offset vvpush
.vmp0:010176C1 dd offset vd2w
.vmp0:010176C5 dd offset vpushpd
.vmp0:010176C9 dd offset vpushsp
.vmp0:010176CD dd offset vvpush
.vmp0:010176D1 dd offset vaddb
.vmp0:010176D5 dd offset vpushimm32
.vmp0:010176D9 dd offset vhalt
.vmp0:010176DD dd offset vvpush
.vmp0:010176E1 dd offset vpushpb
.vmp0:010176E5 dd offset loc_10174D1
.vmp0:010176E9 dd offset vstob
.vmp0:010176ED dd offset vvpush
.vmp0:010176F1 dd offset vhalt
.vmp0:010176F5 dd offset vpushpw
.vmp0:010176F9 dd offset vpopw
.vmp0:010176FD dd offset loc_10174AD
.vmp0:01017701 dd offset vpushwi
.vmp0:01017705 dd offset vnna
.vmp0:01017709 dd offset vstob
.vmp0:0101770D dd offset vshlb
.vmp0:01017711 dd offset loc_101740C
.vmp0:01017715 dd offset vpushw2d
.vmp0:01017719 dd offset vshl
.vmp0:0101771D dd offset vvpushb
.vmp0:01017721 dd offset vpushw2d
.vmp0:01017725 dd offset vpushsp
.vmp0:01017729 dd offset vpushpd
.vmp0:0101772D dd offset vnaw
.vmp0:01017731 dd offset vpushdwptr
.vmp0:01017735 dd offset vpushw
.vmp0:01017739 dd offset vpopcs
.vmp0:0101773D dd offset loc_101740C
.vmp0:01017741 dd offset vshlb
.vmp0:01017745 dd offset vshld
.vmp0:01017749 dd offset loc_1017400
.vmp0:0101774D dd offset loc_10174AD
.vmp0:01017751 dd offset vpopcs
.vmp0:01017755 dd offset loc_10178FD
.vmp0:01017759 dd offset vpushw2d
.vmp0:0101775D dd offset vnna
.vmp0:01017761 dd offset loc_101740C
.vmp0:01017765 dd offset vpushpb
.vmp0:01017769 dd offset vd2w
.vmp0:0101776D dd offset vsetesp
.vmp0:01017771 dd offset vhalt
.vmp0:01017775 dd offset loc_10174AD
.vmp0:01017779 dd offset vnnab
.vmp0:0101777D dd offset vshlw
.vmp0:01017781 dd offset vpushsp
.vmp0:01017785 dd offset loc_1017400
.vmp0:01017789 dd offset vd2w
.vmp0:0101778D dd offset vnnab
.vmp0:01017791 dd offset vd2w
.vmp0:01017795 dd offset vpopsp
.vmp0:01017799 dd offset vpushsp
.vmp0:0101779D dd offset loc_10174EF
.vmp0:010177A1 dd offset loc_10174AD
.vmp0:010177A5 dd offset vpushwi
.vmp0:010177A9 dd offset vstopb
.vmp0:010177AD dd offset vhalt
.vmp0:010177B1 dd offset vaddp
.vmp0:010177B5 dd offset vpushvesp
.vmp0:010177B9 dd offset vpushwi
.vmp0:010177BD dd offset vvpushb
.vmp0:010177C1 dd offset vpushpd
.vmp0:010177C5 dd offset vpopsp
.vmp0:010177C9 dd offset loc_1017400
.vmp0:010177CD dd offset vaddp
.vmp0:010177D1 dd offset loc_10174D1
.vmp0:010177D5 dd offset vnnab
.vmp0:010177D9 dd offset vpoppd
.vmp0:010177DD dd offset vshr
.vmp0:010177E1 dd offset vpushpb
.vmp0:010177E5 dd offset vaddb
.vmp0:010177E9 dd offset vpushdwptr
.vmp0:010177ED dd offset vpushdwptr
.vmp0:010177F1 dd offset vstob
.vmp0:010177F5 dd offset loc_10174EF
.vmp0:010177F9 dd offset vpushpw
.vmp0:010177FD dd offset vshr
.vmp0:01017801 dd offset vpushpw
.vmp0:01017805 dd offset vshlb
.vmp0:01017809 dd offset vpushwi
.vmp0:0101780D dd offset vsetesp
.vmp0:01017811 dd offset vpushb2d
.vmp0:01017815 dd offset vpopsp
.vmp0:01017819 dd offset vaddw
.vmp0:0101781D dd offset vaddp
.vmp0:01017821 dd offset vpopsp
.vmp0:01017825 dd offset vnnab
.vmp0:01017829 dd offset vshld
.vmp0:0101782D dd offset vshl
.vmp0:01017831 dd offset loc_10174AD
.vmp0:01017835 dd offset vpushimm32
.vmp0:01017839 dd offset vpopcs
.vmp0:0101783D dd offset vpopcs
.vmp0:01017841 dd offset vnna
.vmp0:01017845 dd offset vpushimm32
.vmp0:01017849 dd offset vvpushb
.vmp0:0101784D dd offset vhalt
.vmp0:01017851 dd offset loc_1017400
.vmp0:01017855 dd offset loc_10174EF
.vmp0:01017859 dd offset vpopcs
.vmp0:0101785D dd offset vvpushpw
.vmp0:01017861 dd offset vstopb
.vmp0:01017865 dd offset vpushw
.vmp0:01017869 dd offset vpopcs
.vmp0:0101786D dd offset vshlw
.vmp0:01017871 dd offset vnna
.vmp0:01017875 dd offset vaddw
.vmp0:01017879 dd offset vaddb
.vmp0:0101787D dd offset vnna
.vmp0:01017881 dd offset vstopb
.vmp0:01017885 dd offset vvsetb
.vmp0:01017889 dd offset vshlw
.vmp0:0101788D dd offset vnaw
.vmp0:01017891 dd offset vstopb
.vmp0:01017895 dd offset vpushpb
.vmp0:01017899 dd offset vpopsp
.vmp0:0101789D dd offset vnaw
.vmp0:010178A1 dd offset vnnab
.vmp0:010178A5 dd offset vshld
.vmp0:010178A9 dd offset vpushvesp
.vmp0:010178AD dd offset vpushimm32
.vmp0:010178B1 dd offset vaddb
.vmp0:010178B5 dd offset vpushvesp
.vmp0:010178B9 dd offset vaddb
.vmp0:010178BD dd offset vhalt
.vmp0:010178C1 dd offset vstopb
.vmp0:010178C5 dd offset vnaw
.vmp0:010178C9 dd offset vpushsp
.vmp0:010178CD dd offset vsetesp
.vmp0:010178D1 dd offset vshl
.vmp0:010178D5 dd offset vpopw
.vmp0:010178D9 dd offset vshld
.vmp0:010178DD dd offset vpoppd
.vmp0:010178E1 dd offset vnnab
.vmp0:010178E5 dd offset vpoppw
.vmp0:010178E9 dd offset vshld
.vmp0:010178ED dd offset vaddb
.vmp0:010178F1 dd offset vshr
.vmp0:010178F5 dd offset vpushimm32
.vmp0:010178F9 dd offset vstob
也许啊
forgot/iPB