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