首页
社区
课程
招聘
[原创]VMProtect1.2x总结(完)
发表于: 2007-12-6 21:50 159058

[原创]VMProtect1.2x总结(完)

2007-12-6 21:50
159058
hoho,先占几个位,慢慢补充和修改。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (107)
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
Vmprotect1.2x跟踪总结

前言

    回想起来,断断续续的跟Vmprotect已经差不多有三个月了,仿佛在黑暗中寻找点点微光,也象在大海中漂流,直到今天方见陆地。

    做个总结,留着备忘。希望能给那些以前没有接触过或很少接触过Vmprotect朋友一些提示,节省些时间,如果这篇文章能让你省去一些时间,是我的荣幸。正如看雪上的兄弟给我的帮助一样,很感谢他们,虽然有时只是一两句的指点和提示,但都让我少走了很多弯路。印象最深的是forgot的文章《寂寞轰炸:再次小窥 VMProtect 虚拟机》里“使用堆栈传递参数”,“Vm中的vm”,还有他和十三少指点我的“德摩根定律”(这让我很郁闷,因为软件是我的业余,硬件却是我的专业)。cyclotron的文章《VMCrackME----A Preliminary Virtual Machine From Top To Bottom》,清晰的展现了虚拟机的框架结构,和一些伪代码的分析。Softworm指点过“加载整个虚拟机的引擎”,月中人翻译的“变形实践”,bughoho的vmprotect精华文章等等,所有这些都让我受益非浅。

    这几个月,是我近段时间最充实的一段。期间学习了IDA,翻译了几篇教程,完成了两个虚拟机插件,调整了搞破解的心态,见识了很多高手,同时认识了不少朋友。而我付出的只是几个月中每天两个小时的时间,非常值得。

   缘起是跟踪一个程序,费了很大力气把前期的东东搞懂,只差最后一步,却碰到了Vmprotect,实在不想放弃……。
2007-12-6 21:53
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
3
第一节 Vmprotect的框架结构

    先对比一下“原执行程序”和“加了Vmprotect的执行程序”。加了Vmprotect的程序增加了一个代码段,默认为Vmp开头的代码段,当然它也可以是其它任何名字。如下图所示意。红框中标注的是vmp段,它包含了整个虚拟机引擎(softworm提示)和燃料:

    图中上面的部分是“加了Vmprotect的notepad.vmp.exe”的图示,下面部分是未加“Vmprotect的notepad.exe”的原执行程序图示。

    Vmprotect虚拟机引擎的主体结构见下图:


    下图是虚拟机引擎的图示。可以看出它有头,颈,躯干,四肢。象穿着裙子的女孩子?八爪鱼?千手观音?
    伸出的几十条(Vmprotect1.22是45条左右)乃至百余条(Vmprotect1.20是195条左右)触手,是去获取虚拟机伪指令。


    可能很多时候,用IDA无法看出如上图一样全貌。这是因为,有时它使用retn或jmp来实现到伪指令跳转,IDA5.0能很好的显示jmp跳转的图示,retn却无法处理,如果想看一下它的全貌,可以把它的retn修改为jmp,但也只是看一下,却不能执行。

    下面定义几个标签,后面插件中会用:
1、VMInit   虚拟机初始化入口,从这里开始push所有寄存器,并保存threadID。
2、VMLoopEP  可以称为虚拟机循环入口,也就是虚拟机解释器的入口点。其实用VMInterpreter更好一些,但之前这样定义的就没更改了。
3、VMJmp_EA  实现到伪指令的跳转的那条指令的标签,可能是ret也可能是jmp。也就是虚拟机解释器的出口。
4、VM_Context 虚拟机保存环境变量的地址标签,是个结构体。但这个结构体的内容是变化的,里面保存的是x86的一些通用和特殊寄存器,只是位置不定,运行时,会不断的调整变化。
上传的附件:
2007-12-6 21:53
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
4
第二节 伪指令总结

    先看一下Vmprotect1.21和1.22的更新记录(十三少提示)
28.03.2006 - VMProtect 1.22 released
[!] Minor bugs have been fixed
[+] Now it is possible to check the integrity of the bytecode (with the "Check the integrity of the VM objects" enabled)
21.02.2006 - VMProtect 1.21 released
[!] The bug causing errors while emulating CMPXCHG8b if the EAX and EDX registers are present in operands has been fixed
[+] The interpreter contains only those commands that will take part in executing the bytecode
[-]  Some commands have been removed from the basic VM logic (it makes it more difficult to analyze and decompile the bytecode)

      Vmprotect从1.21到1.22变化不大,从Vmprotect 1.20到1.21,有一条“[+]  The interpreter contains only those commands that will take part in executing the bytecode”,可以这样理解吧,在1.21版,其解释器只加载那些参与执行的伪指令。这也就是为什么1.20有190多条伪指令,而1.21和1.22只有40多条伪指令的原因吧。
    Vmprotect1.20和Vmprotect 1.21伪指令差别不大,部分指令的实现略有不同,先看简单的完整的(vmprotect1.20)。伪指令有以下几个特点:
1、所有伪指令都是以实际堆栈来传递参数。(出自forgot)
2、按指令长度分:可分为单字节(无操作数)、双字节(操作数1个字节),三字节(操作数2个字节),五字节指令(操作数4字节)。如下几个伪指令:
序  号  :[跳转表地址]->跳转地址  ||[机器码地址]->机器码 操作数   | 栈 |伪指令 
第000061条:[0x1000141A]->0x100017DE||[0x10023F87]->0x29          |0036|VM_PUSH_ESP 
第000062条:[0x10001726]->0x10001A41||[0x10023F88]->0xec 32b3b174  |0032|VM_PUSH_IMM 
第000063条:[0x1000153E]->0x10001B68||[0x10023F8D]->0x72 9b61     |0030|VM_PUSHW_IMMW 
第000064条:[0x1000165E]->0x100012FD||[0x10023F90]->0xba 07       |0032|VM_POPW_CONTEXT

3、按功能分:堆栈类(POP/PUSH),传送类(MOV),移位类(SHL/SHR),算术运算类(MUL/ADD/DIV)类,浮点类,逻辑运算类(NOR),杂类(RETN/RETF/WAIT),跳转类(JMP)。

   基于此,定义了以下伪指令助记符命名规则(参考了bughoho,forgot, cyclotron的文章):
1、伪指令分为三部分,前缀,机器码助记符,(操作数助记符),(尾缀)。如VM_PUSHW_IMMW。
2、所有伪指令前缀为”VM_”,未识别的指令以”VM_OP_nnn”表示。
3、如果指令中有pushfw的操作,则在指令的尾部加尾缀”_F”。
3、机器码借用x86的常用机器码,以对堆栈数据类型操作为准,加数据类型标识,如为字节操作加”B”,如为字操作加”W”, 如为双字操作不加。例如VM_PUSHW_IMMW中的PUSHW。
4、操作数助记符通常三种情况:无或一个或两个。无则留空;一个则使用简单常用的符号表示,同时尾部也加数据类型标识;二个则通常定义为A和B,不加数据类型标识。
    单操作数助记符的几种表示:IMM代表立即数,CT代表CONTEXT简写,其它的是都是寄存器的英文缩写如EAX,ESP,EDX等等。
    双操作数助记符的表示:使用双操作数的只有MOV类指令,它与x86下的MOV指令定义基本相同,比如MOV_B_SSA,表示传送SS:[A]中的内容到B。A通常为[esp],B通常为[esp]或[esp+sizeof(A)]。
   以上规则只是用于助记,和方便交流。如何定义,随个人喜好。
   VMP1.20的伪指令如下表,VMP1.22与其相同,实际在加密的程序中只用到它的子集。我之前总结的VMP1.20的伪指令有些错误(forgot和十三少提示),且格式不统一。这里做了修正,部分指令做了简化。

A、算术操作类:
VM_ADD                  
VM_ADDB                 
VM_ADDB_F               
VM_ADDW                 
VM_ADDW_F               
VM_ADD_F                
VM_DIV                  
VM_DIVB                 
VM_DIVW                 
VM_IDIV                 
VM_IDIVB                
VM_IDIVW                
VM_IMULB_F              
VM_IMULW_F              
VM_IMUL_F               
VM_MULB_F               
VM_MULW_F               
VM_MUL_F                

VM_F2XM1                
VM_FABS                 
VM_FADD                 
VM_FADDQ                
VM_FCHS                 
VM_FCOMP                
VM_FCOMPQ               
VM_FCOS                 
VM_FDECSTP              
VM_FDIV                 
VM_FDIVQ                
VM_FILD                 
VM_FILDQ                
VM_FINCSTP              
VM_FISTP                
VM_FISTPQ               
VM_FISTPW               
VM_FISUB                
VM_FISUBQ               
VM_FLD                  
VM_FLDCW                
VM_FLDG2                
VM_FLDN2                
VM_FLDPI                
VM_FLDQ                 
VM_FLDT                 
VM_FLDZ                 
VM_FLd1                 
VM_FMUL                 
VM_FMULQ                
VM_FNCLEX               
VM_FNINIT               
VM_FNSTCW               
VM_FNSTSW               
VM_FPATAN               
VM_FPREM                
VM_FPREM1               
VM_FPTAN                
VM_FRNDINT              
VM_FSIN                 
VM_FSQRT                
VM_FST                  
VM_FSTP                 
VM_FSTPQ                
VM_FSTPT                
VM_FSTQ                 
VM_FSUB                 
VM_FSUBQ                
VM_FSUBR                
VM_FSUBRQ               
VM_FTST                 
VM_FYL2X               

C、跳转类
VM_JMP  

D、传送类
VM_MOVB_B_CSA           
VM_MOVB_B_DSA           
VM_MOVB_B_ESA           
VM_MOVB_B_FSA           
VM_MOVB_B_GSA           
VM_MOVB_B_SSA           
VM_MOVB_CSA_B           
VM_MOVB_DSA_B           
VM_MOVB_ESA_B           
VM_MOVB_FSA_B           
VM_MOVB_GSA_B           
VM_MOVB_SSA_B           
VM_MOVW_B_CSA           
VM_MOVW_B_DSA           
VM_MOVW_B_ESA           
VM_MOVW_B_FSA           
VM_MOVW_B_GSA           
VM_MOVW_B_SSA           
VM_MOVW_CSA_B           
VM_MOVW_DSA_B           
VM_MOVW_ESA_B           
VM_MOVW_FSA_B           
VM_MOVW_GSA_B           
VM_MOVW_SSA_B           
VM_MOV_B_CSA            
VM_MOV_B_DSA            
VM_MOV_B_ESA            
VM_MOV_B_FSA            
VM_MOV_B_GSA            
VM_MOV_B_SSA            
VM_MOV_CSA_B            
VM_MOV_DSA_B            
VM_MOV_ESA_B            
VM_MOV_FSA_B            
VM_MOV_GSA_B            
VM_MOV_SSA_B           

E、逻辑运算类
VM_NOR                  
VM_NORB                 
VM_NORB_F               
VM_NORW                 
VM_NORW_F               
VM_NOR_F  

F、堆栈操作类
VM_POPW_CTB0            
VM_POPW_CTB1            
VM_POPW_CTW             
VM_POPW_CX              
VM_POPW_DS              
VM_POPW_ES              
VM_POPW_FS              
VM_POPW_GS              
VM_POPW_SP              
VM_POPW_SS              
VM_POP_CR0              
VM_POP_CR1              
VM_POP_CR2              
VM_POP_CR3              
VM_POP_CR4              
VM_POP_CR5              
VM_POP_CR6              
VM_POP_CR7              
VM_POP_CT               
VM_POP_DR0              
VM_POP_DR1              
VM_POP_DR2              
VM_POP_DR3              
VM_POP_DR4              
VM_POP_DR5              
VM_POP_DR6              
VM_POP_DR7              
VM_POP_ECX              
VM_POP_ESP              
VM_PUSHW_CS             
VM_PUSHW_CTB0           
VM_PUSHW_CTB1           
VM_PUSHW_CTW            
VM_PUSHW_DS             
VM_PUSHW_ES             
VM_PUSHW_FS             
VM_PUSHW_GS             
VM_PUSHW_IMMB           
VM_PUSHW_IMMW           
VM_PUSHW_SP             
VM_PUSHW_SS             
VM_PUSH_CR0             
VM_PUSH_CR1             
VM_PUSH_CR2             
VM_PUSH_CR3             
VM_PUSH_CR4             
VM_PUSH_CR5             
VM_PUSH_CR6             
VM_PUSH_CR7             
VM_PUSH_CT              
VM_PUSH_DR0             
VM_PUSH_DR1             
VM_PUSH_DR2             
VM_PUSH_DR3             
VM_PUSH_DR4             
VM_PUSH_DR5             
VM_PUSH_DR6             
VM_PUSH_DR7             
VM_PUSH_ESP             
VM_PUSH_IMM             
VM_PUSH_IMMB            
VM_PUSH_IMMW 

G、移位类 
VM_SHL                  
VM_SHLB                 
VM_SHLB_F               
VM_SHLD_F               
VM_SHLW                 
VM_SHLW_F               
VM_SHL_F                
VM_SHR                  
VM_SHRB                 
VM_SHRB_F               
VM_SHRD_F               
VM_SHRW                 
VM_SHRW_F               
VM_SHR_F      

H、其它
VM_WAIT                 
VM_RETF                 
VM_RETN  

     看上面的指令,比对x86常用的虚拟机指令,发现它缺少很多我们所必须的指令,如比较指令CMP,TEST;条件跳转指令JB,JLE,JA等等,虽然上面有一个无条件跳转VM_JMP指令,但随着了解的深入,就会知道它不能等效于我们原文件的跳转;还有很多指令都有缺失,如SUB,AND,NOT,XOR等等。一个处理器是缺少不了这些指令的,它是如何处理的?实际上这些缺失的指令都是由上面的指令来实现的,比如sub a,b=add a,-b。not a=a nor a等等。具体后面讨论。

    我们每类指令中摘取一条先看一下它的具体实现吧。只要记得是通过堆栈传递参数就很好理解了。
A、算术操作类
VM_ADDW_F:            
.vmp0:0043160C                 pop     cx
.vmp0:0043160E                 add     [esp], cx
.vmp0:00431612                 pushfw
.vmp0:00431614                 jmp     VMLoop_EP
将堆栈里的两个数据相加,并保存标志位。

B、浮点类
VM_F2XM1:                      
.vmp0:004318BB                 f2xm1
.vmp0:004318BD                 jmp     VMLoop_EP
浮点类很简单

C、跳转类
VM_JMP:         
.vmp0:00431FBC                 pop     edx
.vmp0:00431FBD                 mov     esi, edx
.vmp0:00431FBF                 jmp     VMJmp_EP
注意它改变了ESI值,ESI是bytecode的指针,其跳转位置也与其它所有指令不同,你可以看前面的虚拟机图示,唯一一条没有伸回VMLoop_EP的触手就是VM_JMP,从图中就可以把它摘出。

D、传送类
VM_MOVB_B_DSA: 
.vmp0:00431FC4                 pop     ecx
.vmp0:00431FC5                 mov     al, [ecx]
.vmp0:00431FC7                 push    ax
.vmp0:00431FC9                 jmp     VMLoop_EP
注意机器码的数据类型和向堆栈中传递的数据类型是不同的。

E、逻辑运算类
VM_NORB_F:
.vmp0:00431858                 pop     cx
.vmp0:0043185A                 pop     ax
.vmp0:0043185C                 not     cl
.vmp0:0043185E                 not     al
.vmp0:00431860                 and     cl, al
.vmp0:00431862                 push    cx
.vmp0:00431864                 pushfw
.vmp0:00431866                 jmp     VMLoop_EP
这是“字节或非”,相当于是not(A or B)=(not A)and (not B)

VM_NORW:                
.vmp0:00431504                 not     dword ptr [esp]
.vmp0:00431507                 pop     cx
.vmp0:00431509                 and     [esp], cx
.vmp0:0043150D                 jmp     VMLoop_EP
这个是“字或非”,最开始时把它定义为VM_NA_AND_B是错误的,最终看来Vmprotect只有一类逻辑运算指令就是NOR。

F、堆栈操作类
VM_PUSHW_CTB0:
.vmp0:004314C1                 movzx   eax, byte ptr [esi]
.vmp0:004314C4                 add     al, bl
.vmp0:004314C6                 not     al
.vmp0:004314C8                 neg     al
.vmp0:004314CA                 ror     al, 1
.vmp0:004314CC                 dec     al
.vmp0:004314CE                 add     bl, al
.vmp0:004314D0                 inc     esi
.vmp0:004314D1                 mov     al, [VM_CONTEXT+eax*4]
.vmp0:004314D4                 push    ax
.vmp0:004314D6                 jmp     VMLoop_EP

VM_POPW_CTB1:
.vmp0:004315AC                 mov     al, [esi]
.vmp0:004315AE                 add     al, bl
.vmp0:004315B0                 not     al
.vmp0:004315B2                 neg     al
.vmp0:004315B4                 ror     al, 1
.vmp0:004315B6                 dec     al
.vmp0:004315B8                 add     bl, al
.vmp0:004315BA                 pop     cx
.vmp0:004315BC                 mov     [VM_CONTEXT+eax*4+1], cl
.vmp0:004315C0                 add     esi, 1
.vmp0:004315C3                 jmp     VMLoop_EP

注意一下这里面是[edi+eax*4]和[edi+eax*4+1],我将edi替换为VM_CONTEXT,还是要注意操作数的类型和最终push或pop类型有区别。

G、移位类 
VM_SHLW:
.vmp0:00431628                 pop     ax
.vmp0:0043162A                 pop     cx
.vmp0:0043162C                 shl     ax, cl
.vmp0:0043162F                 push    ax
.vmp0:00431631                 jmp     VMLoop_EP

H、其它
VM_RETN: 
.vmp0:0043182C                 mov     dword ptr [ebp-4], 0
.vmp0:00431833                 pop     edx
.vmp0:00431834                 pop     edx
.vmp0:00431835                 pop     ebx
.vmp0:00431836                 pop     eax
.vmp0:00431837                 pop     edi
.vmp0:00431838                 popf
.vmp0:00431839                 pop     ebp
.vmp0:0043183A                 pop     ecx
.vmp0:0043183B                 pop     esi
.vmp0:0043183C                 pop     esi
.vmp0:0043183D                 retn
注意,它将初始化是压入的堆栈,又弹送出来了。
2007-12-6 21:54
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
5
第三节 伪代码识别插件
    古语有云:“欲善其事,必先利其器”,土话叫“磨刀不误砍柴功”。当我想大量分析比对vmprotect的样本的时候,如果一个个手动去更改伪指令的名称,真是个苦差事。于是想到编这个插件。
    最开始只是想,190多条中,能识别一部分就好了,哪怕只有几十条,也省去了我手动填写的很多工作。但没想到识别的越来越多。开始是只有几十条,后来不断的找到一些新规律,不断完善插件,它识别的也越来越多,最后能识别1.20和1.22的所有指令,是我最开始无论如何都没有想到的。随着识别指令的增加,程序也越来越臃肿,搞到最后快5000行了,按理应该好好优化一下,不过实在打不起精神重新写过。
    源码我不打算公布了,因为实在是太烂,可能结果很唬人,不是什么高级方法,都是笨方法。最初想借用IDA的sig的实现方法,单结果却不令人满意,最后只能识别很少一部分,且有很多错误,这个方法耽搁了不少时间,走了弯路。下面说一下实际的识别方法:
    1、先统计所有伪指令中所用的x86指令的条数。依照条数可进行大致分类,并作为指令判决的补充条件。
    2、查找伪指令中的关键x86指令,比如浮点类的几十条很容易就搞定了,还有WAIT,RETN,RETF等,这类指令也容易搞定。其它的如ADD,MUL,DIV,SHL,SHR等也可以用了类似方法,但由于指令多,有些特例不好处理。
    3、处理MOV类的伪指令,这类指令稍复杂一些,它的规律就是通常为2条x86指令,如pop ,pop或pop,push组合,也是有些特例要做些特殊处理。
    4、处理PUSH/POP类指令,这类中多数指令是很简单的,如PUSH_REG类,通常都是mov加push组合。PUSH_CT类比较难搞一些,主要方法是寻找[edi+eax*4]这个东东,找到了就是这类指令。
    5、处理JMP指令,主要是看jmp的位置和ESI的变化。
    6、指令类型和操作数类型,是根据堆栈的变化情况和里面关键语句的操作数类型来实现的。
    使用方法:将plw文件放置于IDA pro的plugins目录下,使用IDA装载完文件后,快捷方式Alt-V启动插件分析伪指令。除识别伪指令外,还增加了几个虚拟机标签,如VMLOOP_EP,VMJMP_EA等。插件完成后,会跳到虚拟机指令表,信息窗口会打印识别的指令数目,和未识别的指令等信息。
   下面是一个Vmprotect1.20的识别结果,256条中有部分指令重复出现,实际只有193条。
.vmp0:00431B9E VM_OP_TABLE 
.vmp0:00431B9E                 dd offset VM_FSTPT      
.vmp0:00431BA2                 dd offset VM_PUSHW_CTW
.vmp0:00431BA6                 dd offset VM_FSUBR
.vmp0:00431BAA                 dd offset VM_FISTPQ
.vmp0:00431BAE                 dd offset VM_PUSHW_CS
.vmp0:00431BB2                 dd offset VM_MOVB_FSA_B
.vmp0:00431BB6                 dd offset VM_PUSH_CR7
.vmp0:00431BBA                 dd offset VM_MOV_ESA_B
.vmp0:00431BBE                 dd offset VM_POP_DR0
.vmp0:00431BC2                 dd offset VM_IMULW_F
.vmp0:00431BC6                 dd offset VM_PUSH_DR7
.vmp0:00431BCA                 dd offset VM_IDIVB
.vmp0:00431BCE                 dd offset VM_FDIVQ
.vmp0:00431BD2                 dd offset VM_FABS
.vmp0:00431BD6                 dd offset VM_FDECSTP
.vmp0:00431BDA                 dd offset VM_IMUL_F
.vmp0:00431BDE                 dd offset VM_NOR
.vmp0:00431BE2                 dd offset VM_SHLB_F
.vmp0:00431BE6                 dd offset VM_ADD
.vmp0:00431BEA                 dd offset VM_FISTPW
.vmp0:00431BEE                 dd offset VM_PUSH_DR5
.vmp0:00431BF2                 dd offset VM_PUSH_CR0
.vmp0:00431BF6                 dd offset VM_FSUBQ
.vmp0:00431BFA                 dd offset VM_POPW_ES
.vmp0:00431BFE                 dd offset VM_SHRW_F
.vmp0:00431C02                 dd offset VM_FCOS
.vmp0:00431C06                 dd offset VM_ADD_F
.vmp0:00431C0A                 dd offset VM_MOVB_DSA_B
.vmp0:00431C0E                 dd offset VM_JMP
.vmp0:00431C12                 dd offset VM_SHR_F
.vmp0:00431C16                 dd offset VM_FRNDINT
.vmp0:00431C1A                 dd offset VM_PUSH_IMMB
.vmp0:00431C1E                 dd offset VM_POP_DR6
.vmp0:00431C22                 dd offset VM_RETF
.vmp0:00431C26                 dd offset VM_IMULB_F
.vmp0:00431C2A                 dd offset VM_FMULQ
.vmp0:00431C2E                 dd offset VM_FADDQ
.vmp0:00431C32                 dd offset VM_FLDZ
.vmp0:00431C36                 dd offset VM_PUSH_DR4
.vmp0:00431C3A                 dd offset VM_POPW_GS
.vmp0:00431C3E                 dd offset VM_MOVB_SSA_B
.vmp0:00431C42                 dd offset VM_FDIV
.vmp0:00431C46                 dd offset VM_POPW_DX
.vmp0:00431C4A                 dd offset VM_MOVW_DSA_B
.vmp0:00431C4E                 dd offset VM_PUSH_CR6
.vmp0:00431C52                 dd offset VM_FLd1
.vmp0:00431C56                 dd offset VM_MOVW_B_GSA
.vmp0:00431C5A                 dd offset VM_MOVW_B_CSA
.vmp0:00431C5E                 dd offset VM_POPW_SP
.vmp0:00431C62                 dd offset VM_POPW_CTB1
.vmp0:00431C66                 dd offset VM_PUSHW_DS
.vmp0:00431C6A                 dd offset VM_MOV_B_ESA
.vmp0:00431C6E                 dd offset VM_FSQRT
.vmp0:00431C72                 dd offset VM_FST
.vmp0:00431C76                 dd offset VM_DIVB
.vmp0:00431C7A                 dd offset VM_PUSH_ESP
.vmp0:00431C7E                 dd offset VM_POP_DR1
.vmp0:00431C82                 dd offset VM_PUSHW_SS
.vmp0:00431C86                 dd offset VM_MOV_B_DSA
.vmp0:00431C8A                 dd offset VM_FCOMPQ
.vmp0:00431C8E                 dd offset VM_PUSH_DR1
.vmp0:00431C92                 dd offset VM_POPW_CTB1
.vmp0:00431C96                 dd offset VM_PUSHW_IMMB
.vmp0:00431C9A                 dd offset VM_MUL_F
.vmp0:00431C9E                 dd offset VM_ADDB_F
.vmp0:00431CA2                 dd offset VM_MOV_B_ESA
.vmp0:00431CA6                 dd offset VM_FISTPW
.vmp0:00431CAA                 dd offset VM_MOVW_B_FSA
.vmp0:00431CAE                 dd offset VM_SHRW
.vmp0:00431CB2                 dd offset VM_PUSHW_GS
.vmp0:00431CB6                 dd offset VM_PUSH_DR3
.vmp0:00431CBA                 dd offset VM_FRNDINT
.vmp0:00431CBE                 dd offset VM_POP_ECX
.vmp0:00431CC2                 dd offset VM_DIV
.vmp0:00431CC6                 dd offset VM_PUSH_CR1
.vmp0:00431CCA                 dd offset VM_SHL
.vmp0:00431CCE                 dd offset VM_MOV_B_CSA
.vmp0:00431CD2                 dd offset VM_MOVB_DSA_B
.vmp0:00431CD6                 dd offset VM_PUSHW_IMMW
.vmp0:00431CDA                 dd offset VM_POPW_GS
.vmp0:00431CDE                 dd offset VM_FISUBQ
.vmp0:00431CE2                 dd offset VM_PUSHW_CTB0
.vmp0:00431CE6                 dd offset VM_MOV_B_FSA
.vmp0:00431CEA                 dd offset VM_FSIN
.vmp0:00431CEE                 dd offset VM_PUSH_CR0
.vmp0:00431CF2                 dd offset VM_PUSHW_CS
.vmp0:00431CF6                 dd offset VM_ADDB_F
.vmp0:00431CFA                 dd offset VM_FCOMP
.vmp0:00431CFE                 dd offset VM_FLDG2
.vmp0:00431D02                 dd offset VM_POP_CR3
.vmp0:00431D06                 dd offset VM_POPW_CTW
.vmp0:00431D0A                 dd offset VM_NORW
.vmp0:00431D0E                 dd offset VM_MOVB_CSA_B
.vmp0:00431D12                 dd offset VM_ADDW_F
.vmp0:00431D16                 dd offset VM_FDIV
.vmp0:00431D1A                 dd offset VM_POPW_DX
.vmp0:00431D1E                 dd offset VM_FYL2X
.vmp0:00431D22                 dd offset VM_MOV_B_SSA
.vmp0:00431D26                 dd offset VM_MOV_FSA_B
.vmp0:00431D2A                 dd offset VM_SHLB
.vmp0:00431D2E                 dd offset VM_PUSHW_DS
.vmp0:00431D32                 dd offset VM_FNCLEX
.vmp0:00431D36                 dd offset VM_PUSHW_SP
.vmp0:00431D3A                 dd offset VM_FILDQ
.vmp0:00431D3E                 dd offset VM_POP_CR5
.vmp0:00431D42                 dd offset VM_MOVW_B_CSA
.vmp0:00431D46                 dd offset VM_FILDQ
.vmp0:00431D4A                 dd offset VM_POP_CR6
.vmp0:00431D4E                 dd offset VM_FSTPT
.vmp0:00431D52                 dd offset VM_FMUL
.vmp0:00431D56                 dd offset VM_FISTPQ
.vmp0:00431D5A                 dd offset VM_FNINIT
.vmp0:00431D5E                 dd offset VM_FSQRT
.vmp0:00431D62                 dd offset VM_NORB
.vmp0:00431D66                 dd offset VM_IDIV
.vmp0:00431D6A                 dd offset VM_RETF
.vmp0:00431D6E                 dd offset VM_MOV_B_GSA
.vmp0:00431D72                 dd offset VM_FYL2X
.vmp0:00431D76                 dd offset VM_MOV_DSA_B
.vmp0:00431D7A                 dd offset VM_MOVW_B_ESA
.vmp0:00431D7E                 dd offset VM_SHRB_F
.vmp0:00431D82                 dd offset VM_PUSH_CT
.vmp0:00431D86                 dd offset VM_FSTP
.vmp0:00431D8A                 dd offset VM_POPW_ES
.vmp0:00431D8E                 dd offset VM_DIVW
.vmp0:00431D92                 dd offset VM_ADDW
.vmp0:00431D96                 dd offset VM_FSTPT
.vmp0:00431D9A                 dd offset VM_IDIVW
.vmp0:00431D9E                 dd offset VM_MOV_GSA_B
.vmp0:00431DA2                 dd offset VM_POP_DR7
.vmp0:00431DA6                 dd offset VM_SHLW
.vmp0:00431DAA                 dd offset VM_FSUB
.vmp0:00431DAE                 dd offset VM_ADDB
.vmp0:00431DB2                 dd offset VM_PUSH_CR2
.vmp0:00431DB6                 dd offset VM_DIVB
.vmp0:00431DBA                 dd offset VM_NORB
.vmp0:00431DBE                 dd offset VM_MOV_CSA_B
.vmp0:00431DC2                 dd offset VM_PUSH_DR2
.vmp0:00431DC6                 dd offset VM_FST
.vmp0:00431DCA                 dd offset VM_PUSH_IMM
.vmp0:00431DCE                 dd offset VM_RETN
.vmp0:00431DD2                 dd offset VM_MOVW_B_DSA
.vmp0:00431DD6                 dd offset VM_POP_DR3
.vmp0:00431DDA                 dd offset VM_POP_ESP
.vmp0:00431DDE                 dd offset VM_FTST
.vmp0:00431DE2                 dd offset VM_MUL_F
.vmp0:00431DE6                 dd offset VM_FNSTSW
.vmp0:00431DEA                 dd offset VM_MOVB_B_ESA
.vmp0:00431DEE                 dd offset VM_SHR
.vmp0:00431DF2                 dd offset VM_POP_CT
.vmp0:00431DF6                 dd offset VM_ADDW
.vmp0:00431DFA                 dd offset VM_FPREM
.vmp0:00431DFE                 dd offset VM_MOVB_B_ESA
.vmp0:00431E02                 dd offset VM_PUSH_IMMW
.vmp0:00431E06                 dd offset VM_FSTPQ
.vmp0:00431E0A                 dd offset VM_FLDPI
.vmp0:00431E0E                 dd offset VM_SHL_F
.vmp0:00431E12                 dd offset VM_MOVW_GSA_B
.vmp0:00431E16                 dd offset VM_FSUBRQ
.vmp0:00431E1A                 dd offset VM_PUSH_CR5
.vmp0:00431E1E                 dd offset VM_MOVB_B_CSA
.vmp0:00431E22                 dd offset VM_SHRB
.vmp0:00431E26                 dd offset VM_POP_DR5
.vmp0:00431E2A                 dd offset VM_F2XM1
.vmp0:00431E2E                 dd offset VM_PUSH_DR0
.vmp0:00431E32                 dd offset VM_MOV_FSA_B
.vmp0:00431E36                 dd offset VM_PUSH_CR4
.vmp0:00431E3A                 dd offset VM_FADD
.vmp0:00431E3E                 dd offset VM_RETN
.vmp0:00431E42                 dd offset VM_FPTAN
.vmp0:00431E46                 dd offset VM_FINCSTP
.vmp0:00431E4A                 dd offset VM_MOV_SSA_B
.vmp0:00431E4E                 dd offset VM_FLD
.vmp0:00431E52                 dd offset VM_FPATAN
.vmp0:00431E56                 dd offset VM_PUSHW_GS
.vmp0:00431E5A                 dd offset VM_MOVB_B_FSA
.vmp0:00431E5E                 dd offset VM_POPW_SP
.vmp0:00431E62                 dd offset VM_POPW_FS
.vmp0:00431E66                 dd offset VM_MOV_B_FSA
.vmp0:00431E6A                 dd offset VM_MULW_F
.vmp0:00431E6E                 dd offset VM_POPW_CTB0
.vmp0:00431E72                 dd offset VM_MUL_F
.vmp0:00431E76                 dd offset VM_ADD_F
.vmp0:00431E7A                 dd offset VM_PUSHW_GS
.vmp0:00431E7E                 dd offset VM_NORW_F
.vmp0:00431E82                 dd offset VM_FDECSTP
.vmp0:00431E86                 dd offset VM_POP_CR1
.vmp0:00431E8A                 dd offset VM_POP_CR7
.vmp0:00431E8E                 dd offset VM_MOVW_FSA_B
.vmp0:00431E92                 dd offset VM_SHRD_F
.vmp0:00431E96                 dd offset VM_SHLB
.vmp0:00431E9A                 dd offset VM_PUSH_CR1
.vmp0:00431E9E                 dd offset VM_POP_DR2
.vmp0:00431EA2                 dd offset VM_MOVB_B_CSA
.vmp0:00431EA6                 dd offset VM_POP_CR2
.vmp0:00431EAA                 dd offset VM_POP_CR0
.vmp0:00431EAE                 dd offset VM_MOVB_B_GSA
.vmp0:00431EB2                 dd offset VM_FMULQ
.vmp0:00431EB6                 dd offset VM_MULW_F
.vmp0:00431EBA                 dd offset VM_FISTP
.vmp0:00431EBE                 dd offset VM_NOR_F
.vmp0:00431EC2                 dd offset VM_FILD
.vmp0:00431EC6                 dd offset VM_IMUL_F
.vmp0:00431ECA                 dd offset VM_SHLB
.vmp0:00431ECE                 dd offset VM_MOVW_B_FSA
.vmp0:00431ED2                 dd offset VM_PUSHW_CTB1
.vmp0:00431ED6                 dd offset VM_MOVW_B_FSA
.vmp0:00431EDA                 dd offset VM_FISUB
.vmp0:00431EDE                 dd offset VM_POP_CT
.vmp0:00431EE2                 dd offset VM_FNSTCW
.vmp0:00431EE6                 dd offset VM_FLDCW
.vmp0:00431EEA                 dd offset VM_SHLW_F
.vmp0:00431EEE                 dd offset VM_POPW_SS
.vmp0:00431EF2                 dd offset VM_MOVB_B_DSA
.vmp0:00431EF6                 dd offset VM_MOVW_B_SSA
.vmp0:00431EFA                 dd offset VM_NORB_F
.vmp0:00431EFE                 dd offset VM_POPW_DS
.vmp0:00431F02                 dd offset VM_MOVB_B_DSA
.vmp0:00431F06                 dd offset VM_PUSH_CR2
.vmp0:00431F0A                 dd offset VM_MOVW_SSA_B
.vmp0:00431F0E                 dd offset VM_FPREM1
.vmp0:00431F12                 dd offset VM_FISTP
.vmp0:00431F16                 dd offset VM_SHRB
.vmp0:00431F1A                 dd offset VM_POP_DR4
.vmp0:00431F1E                 dd offset VM_POPW_ES
.vmp0:00431F22                 dd offset VM_FLDQ
.vmp0:00431F26                 dd offset VM_MOVB_ESA_B
.vmp0:00431F2A                 dd offset VM_PUSH_CR3
.vmp0:00431F2E                 dd offset VM_WAIT
.vmp0:00431F32                 dd offset VM_FCHS
.vmp0:00431F36                 dd offset VM_MULB_F
.vmp0:00431F3A                 dd offset VM_IMULB_F
.vmp0:00431F3E                 dd offset VM_MOVW_CSA_B
.vmp0:00431F42                 dd offset VM_PUSHW_FS
.vmp0:00431F46                 dd offset VM_FPREM
.vmp0:00431F4A                 dd offset VM_POP_CR4
.vmp0:00431F4E                 dd offset VM_MOV_GSA_B
.vmp0:00431F52                 dd offset VM_FSTQ
.vmp0:00431F56                 dd offset VM_MOVB_B_ESA
.vmp0:00431F5A                 dd offset VM_PUSHW_CTB0
.vmp0:00431F5E                 dd offset VM_F2XM1
.vmp0:00431F62                 dd offset VM_MOVW_ESA_B
.vmp0:00431F66                 dd offset VM_SHLD_F
.vmp0:00431F6A                 dd offset VM_FSIN
.vmp0:00431F6E                 dd offset VM_PUSH_DR6
.vmp0:00431F72                 dd offset VM_FLDN2
.vmp0:00431F76                 dd offset VM_FLDT
.vmp0:00431F7A                 dd offset VM_FISTPQ
.vmp0:00431F7E                 dd offset VM_MOVB_B_SSA
.vmp0:00431F82                 dd offset VM_MOV_DSA_B
.vmp0:00431F86                 dd offset VM_PUSHW_ES
.vmp0:00431F8A                 dd offset VM_FMULQ
.vmp0:00431F8E                 dd offset VM_MOVB_GSA_B
.vmp0:00431F92                 dd offset VM_FISUB
.vmp0:00431F96                 dd offset VM_MOVB_ESA_B
.vmp0:00431F9A                 dd offset VM_SHL_F

    对vmp1.22加密的程序,识别效果如下,256条中多数是重复,实际只有45条指令:
.vmp0:01017400 VM_OP_TABLE     dd offset VM_PUSH_CT    ; DATA XREF: start+10562 r
.vmp0:01017404                 dd offset VM_PUSHW_IMMW
.vmp0:01017408                 dd offset VM_RETN
.vmp0:0101740C                 dd offset VM_ADD_F
.vmp0:01017410                 dd offset VM_PUSH_CT
.vmp0:01017414                 dd offset VM_SHR
.vmp0:01017418                 dd offset VM_MOVB_DSA_B
.vmp0:0101741C                 dd offset VM_SHRD
.vmp0:01017420                 dd offset VM_PUSH_CT
.vmp0:01017424                 dd offset VM_MOVB_B_DSA
.vmp0:01017428                 dd offset VM_MOVW_B_DSA
.vmp0:0101742C                 dd offset VM_MOV_B_SSA
.vmp0:01017430                 dd offset VM_PUSH_CT
.vmp0:01017434                 dd offset VM_SHLW
.vmp0:01017438                 dd offset VM_SHLB
.vmp0:0101743C                 dd offset VM_SHRD
.vmp0:01017440                 dd offset VM_PUSH_CT
.vmp0:01017444                 dd offset VM_RETN
.vmp0:01017448                 dd offset VM_PUSH_IMMB
.vmp0:0101744C                 dd offset VM_NOR
.vmp0:01017450                 dd offset VM_PUSH_CT
.vmp0:01017454                 dd offset VM_PUSHW_SP
.vmp0:01017458                 dd offset VM_MOV_DSA_B
.vmp0:0101745C                 dd offset VM_JMP
.vmp0:01017460                 dd offset VM_PUSH_CT
.vmp0:01017464                 dd offset VM_MOVB_B_SSA
.vmp0:01017468                 dd offset VM_NOR
.vmp0:0101746C                 dd offset VM_POPW_CTB0
.vmp0:01017470                 dd offset VM_PUSH_CT
.vmp0:01017474                 dd offset VM_SHLW
.vmp0:01017478                 dd offset VM_PUSHW_IMMB
.vmp0:0101747C                 dd offset VM_ADDB_F
.vmp0:01017480                 dd offset VM_PUSH_CT
.vmp0:01017484                 dd offset VM_SHR
.vmp0:01017488                 dd offset VM_ADDB_F
.vmp0:0101748C                 dd offset VM_MOVB_SSA_B
.vmp0:01017490                 dd offset VM_PUSH_CT
.vmp0:01017494                 dd offset VM_MOVB_DSA_B
.vmp0:01017498                 dd offset VM_MOV_DSA_B
.vmp0:0101749C                 dd offset VM_SHRD
.vmp0:010174A0                 dd offset VM_PUSH_CT
.vmp0:010174A4                 dd offset VM_ADDW_F
.vmp0:010174A8                 dd offset VM_MOVW_DSA_B
.vmp0:010174AC                 dd offset VM_PUSH_IMMB
.vmp0:010174B0                 dd offset VM_PUSH_CT
.vmp0:010174B4                 dd offset VM_PUSH_IMMW
.vmp0:010174B8                 dd offset VM_SHL
.vmp0:010174BC                 dd offset VM_NORB
.vmp0:010174C0                 dd offset VM_PUSH_CT
.vmp0:010174C4                 dd offset VM_POPW_SP
.vmp0:010174C8                 dd offset VM_MOVB_DSA_B
.vmp0:010174CC                 dd offset VM_MOVW_DSA_B
.vmp0:010174D0                 dd offset VM_PUSH_CT
.vmp0:010174D4                 dd offset VM_MOVB_DSA_B
.vmp0:010174D8                 dd offset VM_MOVW_B_DSA
.vmp0:010174DC                 dd offset VM_POPW_CTB0
.vmp0:010174E0                 dd offset VM_PUSH_CT
.vmp0:010174E4                 dd offset VM_ADD_F
.vmp0:010174E8                 dd offset VM_MOVB_B_SSA
.vmp0:010174EC                 dd offset VM_SHRB
.vmp0:010174F0                 dd offset VM_PUSH_CT
.vmp0:010174F4                 dd offset VM_ADDW_F
.vmp0:010174F8                 dd offset VM_SHLW
.vmp0:010174FC                 dd offset VM_MOVW_SSA_B
.vmp0:01017500                 dd offset VM_POP_CT
.vmp0:01017504                 dd offset VM_MOV_DSA_B
.vmp0:01017508                 dd offset VM_MOVB_B_DSA
.vmp0:0101750C                 dd offset VM_JMP
.vmp0:01017510                 dd offset VM_POP_CT
.vmp0:01017514                 dd offset VM_PUSHW_SP
.vmp0:01017518                 dd offset VM_MOV_B_SSA
.vmp0:0101751C                 dd offset VM_PUSHW_SP
.vmp0:01017520                 dd offset VM_POP_CT
.vmp0:01017524                 dd offset VM_SHLW
.vmp0:01017528                 dd offset VM_SHL
.vmp0:0101752C                 dd offset VM_MOVB_B_SSA
.vmp0:01017530                 dd offset VM_POP_CT
.vmp0:01017534                 dd offset VM_PUSHW_CTB0
.vmp0:01017538                 dd offset VM_MOV_B_SSA
.vmp0:0101753C                 dd offset VM_MOVW_B_DSA
.vmp0:01017540                 dd offset VM_POP_CT
.vmp0:01017544                 dd offset VM_MOVW_DSA_B
.vmp0:01017548                 dd offset VM_NOR
.vmp0:0101754C                 dd offset VM_PUSH_IMMW
.vmp0:01017550                 dd offset VM_POP_CT
.vmp0:01017554                 dd offset VM_PUSHW_CTW
.vmp0:01017558                 dd offset VM_PUSH_IMM
.vmp0:0101755C                 dd offset VM_PUSH_IMMB
.vmp0:01017560                 dd offset VM_POP_CT
.vmp0:01017564                 dd offset VM_ADD_F
.vmp0:01017568                 dd offset VM_MOV_DSA_B
.vmp0:0101756C                 dd offset VM_RETN
.vmp0:01017570                 dd offset VM_POP_CT
.vmp0:01017574                 dd offset VM_SHRD
.vmp0:01017578                 dd offset VM_MOVB_SSA_B
.vmp0:0101757C                 dd offset VM_POP_ESP
.vmp0:01017580                 dd offset VM_POP_CT
.vmp0:01017584                 dd offset VM_PUSH_ESP
.vmp0:01017588                 dd offset VM_ADDW_F
.vmp0:0101758C                 dd offset VM_SHLB
.vmp0:01017590                 dd offset VM_POP_CT
.vmp0:01017594                 dd offset VM_MOVB_DSA_B
.vmp0:01017598                 dd offset VM_PUSH_IMMB
.vmp0:0101759C                 dd offset VM_MOV_DSA_B
.vmp0:010175A0                 dd offset VM_POP_CT
.vmp0:010175A4                 dd offset VM_NORB
.vmp0:010175A8                 dd offset VM_PUSH_ESP
.vmp0:010175AC                 dd offset VM_SHLB
.vmp0:010175B0                 dd offset VM_POP_CT
.vmp0:010175B4                 dd offset VM_SHRW
.vmp0:010175B8                 dd offset VM_SHL
.vmp0:010175BC                 dd offset VM_MOVB_B_SSA
.vmp0:010175C0                 dd offset VM_POP_CT
.vmp0:010175C4                 dd offset VM_SHRW
.vmp0:010175C8                 dd offset VM_MOV_B_DSA
.vmp0:010175CC                 dd offset VM_POPW_CTW
.vmp0:010175D0                 dd offset VM_POP_CT
.vmp0:010175D4                 dd offset VM_SHRD
.vmp0:010175D8                 dd offset VM_SHRB
.vmp0:010175DC                 dd offset VM_PUSHW_IMMW
.vmp0:010175E0                 dd offset VM_POP_CT
.vmp0:010175E4                 dd offset VM_SHRB
.vmp0:010175E8                 dd offset VM_PUSH_IMM
.vmp0:010175EC                 dd offset VM_SHLB
.vmp0:010175F0                 dd offset VM_POP_CT
.vmp0:010175F4                 dd offset VM_PUSHW_CTB0
.vmp0:010175F8                 dd offset VM_POPW_CTW
.vmp0:010175FC                 dd offset VM_MOV_SSA_B
.vmp0:01017600                 dd offset VM_PUSHW_CTW
.vmp0:01017604                 dd offset VM_ADDW_F
.vmp0:01017608                 dd offset VM_POP_ESP
.vmp0:0101760C                 dd offset VM_NORB
.vmp0:01017610                 dd offset VM_SHRB
.vmp0:01017614                 dd offset VM_MOVB_B_DSA
.vmp0:01017618                 dd offset VM_PUSH_IMMW
.vmp0:0101761C                 dd offset VM_PUSHW_SP
.vmp0:01017620                 dd offset VM_NORW
.vmp0:01017624                 dd offset VM_NORB
.vmp0:01017628                 dd offset VM_MOVB_SSA_B
.vmp0:0101762C                 dd offset VM_PUSHW_CTB0
.vmp0:01017630                 dd offset VM_SHLW
.vmp0:01017634                 dd offset VM_SHR
.vmp0:01017638                 dd offset VM_ADDW_F
.vmp0:0101763C                 dd offset VM_SHLD
.vmp0:01017640                 dd offset VM_MOVW_B_SSA
.vmp0:01017644                 dd offset VM_MOVW_SSA_B
.vmp0:01017648                 dd offset VM_PUSHW_CTW
.vmp0:0101764C                 dd offset VM_MOVB_SSA_B
.vmp0:01017650                 dd offset VM_SHRW
.vmp0:01017654                 dd offset VM_PUSHW_CTB0
.vmp0:01017658                 dd offset VM_POP_ESP
.vmp0:0101765C                 dd offset VM_SHLD
.vmp0:01017660                 dd offset VM_SHLW
.vmp0:01017664                 dd offset VM_SHRB
.vmp0:01017668                 dd offset VM_MOVW_SSA_B
.vmp0:0101766C                 dd offset VM_ADD_F
.vmp0:01017670                 dd offset VM_PUSHW_CTB0
.vmp0:01017674                 dd offset VM_PUSHW_IMMW
.vmp0:01017678                 dd offset VM_PUSH_IMMB
.vmp0:0101767C                 dd offset VM_SHL
.vmp0:01017680                 dd offset VM_MOV_B_SSA
.vmp0:01017684                 dd offset VM_MOVW_B_DSA
.vmp0:01017688                 dd offset VM_SHLB
.vmp0:0101768C                 dd offset VM_JMP
.vmp0:01017690                 dd offset VM_SHLD
.vmp0:01017694                 dd offset VM_POPW_SP
.vmp0:01017698                 dd offset VM_MOVB_DSA_B
.vmp0:0101769C                 dd offset VM_MOVW_DSA_B
.vmp0:010176A0                 dd offset VM_MOV_SSA_B
.vmp0:010176A4                 dd offset VM_MOV_DSA_B
.vmp0:010176A8                 dd offset VM_SHR
.vmp0:010176AC                 dd offset VM_PUSH_IMM
.vmp0:010176B0                 dd offset VM_PUSHW_IMMB
.vmp0:010176B4                 dd offset VM_SHRD
.vmp0:010176B8                 dd offset VM_MOVW_B_DSA
.vmp0:010176BC                 dd offset VM_MOV_B_DSA
.vmp0:010176C0                 dd offset VM_MOVW_B_DSA
.vmp0:010176C4                 dd offset VM_NOR
.vmp0:010176C8                 dd offset VM_JMP
.vmp0:010176CC                 dd offset VM_ADDW_F
.vmp0:010176D0                 dd offset VM_PUSHW_CTB0
.vmp0:010176D4                 dd offset VM_POP_ESP
.vmp0:010176D8                 dd offset VM_SHRW
.vmp0:010176DC                 dd offset VM_PUSHW_IMMW
.vmp0:010176E0                 dd offset VM_POP_ESP
.vmp0:010176E4                 dd offset VM_MOVB_SSA_B
.vmp0:010176E8                 dd offset VM_PUSHW_IMMB
.vmp0:010176EC                 dd offset VM_NORW
.vmp0:010176F0                 dd offset VM_MOVB_B_SSA
.vmp0:010176F4                 dd offset VM_POPW_CTW
.vmp0:010176F8                 dd offset VM_PUSH_IMMW
.vmp0:010176FC                 dd offset VM_MOVW_SSA_B
.vmp0:01017700                 dd offset VM_PUSH_IMM
.vmp0:01017704                 dd offset VM_MOVW_B_SSA
.vmp0:01017708                 dd offset VM_PUSH_IMMW
.vmp0:0101770C                 dd offset VM_PUSHW_SP
.vmp0:01017710                 dd offset VM_ADDB_F
.vmp0:01017714                 dd offset VM_POPW_CTB0
.vmp0:01017718                 dd offset VM_SHRD
.vmp0:0101771C                 dd offset VM_SHR
.vmp0:01017720                 dd offset VM_SHLB
.vmp0:01017724                 dd offset VM_POPW_CTW
.vmp0:01017728                 dd offset VM_PUSHW_SP
.vmp0:0101772C                 dd offset VM_NORW
.vmp0:01017730                 dd offset VM_ADD_F
.vmp0:01017734                 dd offset VM_SHR
.vmp0:01017738                 dd offset VM_SHRD
.vmp0:0101773C                 dd offset VM_MOV_DSA_B
.vmp0:01017740                 dd offset VM_NOR
.vmp0:01017744                 dd offset VM_POPW_CTW
.vmp0:01017748                 dd offset VM_PUSH_ESP
.vmp0:0101774C                 dd offset VM_MOV_SSA_B
.vmp0:01017750                 dd offset VM_MOV_B_SSA
.vmp0:01017754                 dd offset VM_RETN
.vmp0:01017758                 dd offset VM_MOVW_B_SSA
.vmp0:0101775C                 dd offset VM_MOVB_B_DSA
.vmp0:01017760                 dd offset VM_PUSHW_CTB0
.vmp0:01017764                 dd offset VM_PUSH_IMMW
.vmp0:01017768                 dd offset VM_ADDW_F
.vmp0:0101776C                 dd offset VM_SHRD
.vmp0:01017770                 dd offset VM_MOVB_B_DSA
.vmp0:01017774                 dd offset VM_MOV_B_DSA
.vmp0:01017778                 dd offset VM_POPW_SP
.vmp0:0101777C                 dd offset VM_MOVW_B_DSA
.vmp0:01017780                 dd offset VM_MOVB_B_SSA
.vmp0:01017784                 dd offset VM_NOR
.vmp0:01017788                 dd offset VM_MOV_B_SSA
.vmp0:0101778C                 dd offset VM_MOVW_SSA_B
.vmp0:01017790                 dd offset VM_SHL
.vmp0:01017794                 dd offset VM_NOR
.vmp0:01017798                 dd offset VM_PUSHW_SP
.vmp0:0101779C                 dd offset VM_MOVW_B_DSA
.vmp0:010177A0                 dd offset VM_SHLW
.vmp0:010177A4                 dd offset VM_PUSH_IMM
.vmp0:010177A8                 dd offset VM_PUSH_IMM
.vmp0:010177AC                 dd offset VM_RETN
.vmp0:010177B0                 dd offset VM_MOVB_B_DSA
.vmp0:010177B4                 dd offset VM_SHLD
.vmp0:010177B8                 dd offset VM_PUSHW_IMMB
.vmp0:010177BC                 dd offset VM_NOR
.vmp0:010177C0                 dd offset VM_MOV_B_SSA
.vmp0:010177C4                 dd offset VM_POPW_CTB0
.vmp0:010177C8                 dd offset VM_NOR
.vmp0:010177CC                 dd offset VM_MOVW_B_DSA
.vmp0:010177D0                 dd offset VM_NOR
.vmp0:010177D4                 dd offset VM_PUSH_IMM
.vmp0:010177D8                 dd offset VM_PUSHW_CTW
.vmp0:010177DC                 dd offset VM_ADDB_F
.vmp0:010177E0                 dd offset VM_SHLD
.vmp0:010177E4                 dd offset VM_PUSHW_CTW
.vmp0:010177E8                 dd offset VM_POP_ESP
.vmp0:010177EC                 dd offset VM_MOV_B_DSA
.vmp0:010177F0                 dd offset VM_JMP
.vmp0:010177F4                 dd offset VM_MOVW_B_SSA
.vmp0:010177F8                 dd offset VM_MOV_SSA_B
.vmp0:010177FC                 dd offset VM_MOVW_B_SSA
上传的附件:
2007-12-6 21:54
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
6
第四节 伪代码跟踪记录插件

    为方便调试,同时也是为了学习编写IDA插件,编写了该插件。该插件有如下功能:
    1、识别虚拟机的框架结构,标注VMInit,VMLoop_EP,VMJmp_ea,VM_CONTEXT,VM_OP_TABLE等标签。
    2、启动调试器,执行虚拟机加密的软件,跟踪记录虚拟机的执行情况。可以设定跟踪记录的伪指令中断位置,中断后可暂停、继续和取消执行。
    3、在IDA的Plugins目录下生成两个文本文件.rec和.jmp文件。.rec文件记录的是虚拟机指令执行记录,包括每条指令的地址,机器码,操作数,输入参数,输出参数,指令助记符等。完成简单的Tracer功能。.jmp文件记录的伪代码块的执行情况。
    4、在伪代码块处,为每一条加密的机器码和操作数增加注释,注释内容为伪代码助记符。如不想打开.rec文件,这里也可以简单看一下。

    已发现的还存在的问题:操作数目前在部分指令时还有错误,如PUSHW_CTW时,目前的实现方法,如果改这个bug太困难了。只能凑合用了。好在影响不大。

    使用方法,将该插件拷贝到IDA的plugins目录下,装载完待调试文件后,按快捷键ALT-D启动。插件会有少许提示询问。注意运行前请先保存好文件,以免运行时破坏原来的分析和注释。

    下面是一个简单的跳转指令加密的记录结果(.rec文件),它只有两个伪代码块,中间{}中的是机器码,{}左边的是三个输入参数,右边的是三个输出参数,没有则留空。||之间的是栈海拔指示,最后是伪指令助记符:

S/N    :[    arg0][    arg1][    arg2]{     ESI->机器码     }[ rvalue0][ rvalue1][ rvalue2]| 栈 |伪指令   
第0000次跳转,跳转到:0x00463108(VMInsBuff_00)
00000000:[00462968][        ][        ]{00463108->5d 07      }[        ][        ][        ]|0008|VM_POP_CT
00000001:[00462968][        ][        ]{0046310A->5d 0d      }[        ][        ][        ]|0012|VM_POP_CT
00000002:[00462968][        ][        ]{0046310C->5d 02      }[        ][        ][        ]|0016|VM_POP_CT
00000003:[00462968][        ][        ]{0046310E->5a 06      }[        ][        ][        ]|0020|VM_POP_CT
00000004:[00462968][        ][        ]{00463110->5d 0e      }[        ][        ][        ]|0024|VM_POP_CT
00000005:[00462968][        ][        ]{00463112->5a 0c      }[        ][        ][        ]|0028|VM_POP_CT
00000006:[00462968][        ][        ]{00463114->5a 00      }[        ][        ][        ]|0032|VM_POP_CT
00000007:[00462968][        ][        ]{00463116->5a 04      }[        ][        ][        ]|0036|VM_POP_CT
00000008:[00462968][        ][        ]{00463118->5d 03      }[        ][        ][        ]|0040|VM_POP_CT
00000009:[00462968][        ][        ]{0046311A->5a 0a      }[        ][        ][        ]|0044|VM_POP_CT
00000010:[00462968][        ][        ]{0046311C->5a 0b      }[        ][        ][        ]|0048|VM_POP_CT
00000011:[        ][        ][        ]{0046311E->92 01      }[00000001][        ][        ]|0044|VM_PUSH_IMMB
00000012:[00462968][00000001][        ]{00463120->0a         }[1841a8bc][        ][        ]|0048|VM_ADD
00000013:[00000001][        ][        ]{00463121->5d 05      }[        ][        ][        ]|0052|VM_POP_CT
00000014:[        ][        ][        ]{00463123->2a 13      }[    0013][        ][        ]|0050|VM_PUSHW_IMMB
00000015:[        ][        ][        ]{00463125->27 05      }[1841a8bc][        ][        ]|0046|VM_PUSH_CT
00000016:[        ][        ][        ]{00463127->d3 05      }[1841a8bc][        ][        ]|0042|VM_PUSH_CT
00000017:[25fd0046][1841a8bc][    a8bc]{00463129->10         }[    0203][45e0c20d][        ]|0046|VM_SHLD_F
00000018:[    a8bc][        ][        ]{0046312A->5c 08      }[        ][        ][        ]|0048|VM_POPW_CTW
00000019:[        ][        ][        ]{0046312C->22 599f1ada}[599f1ada][        ][        ]|0044|VM_PUSH_IMM
00000020:[27a30046][599f1ada][        ]{00463131->0a         }[9f7fdce7][        ][        ]|0048|VM_ADD
00000021:[599f1ada][        ][        ]{00463132->5d 05      }[        ][        ][        ]|0052|VM_POP_CT
00000022:[        ][        ][        ]{00463134->2a 17      }[    0017][        ][        ]|0050|VM_PUSHW_IMMB
00000023:[        ][        ][        ]{00463136->27 05      }[9f7fdce7][        ][        ]|0046|VM_PUSH_CT
00000024:[        ][        ][        ]{00463138->d3 05      }[9f7fdce7][        ][        ]|0042|VM_PUSH_CT
00000025:[25fd2899][9f7fdce7][    dce7]{0046313A->76         }[    0283][ffb9cf3e][        ]|0046|VM_SHRD_F
00000026:[    dce7][        ][        ]{0046313B->5c 01      }[        ][        ][        ]|0048|VM_POPW_CTW
00000027:[        ][        ][        ]{0046313D->2b         }[0012fe00][        ][        ]|0044|VM_PUSH_ESP
00000028:[27a30046][        ][        ]{0046313E->57         }[ffb9cf3e][        ][        ]|0044|VM_MOV_B_SSA
00000029:[00462b06][ffb9cf3e][        ]{0046313F->77         }[004630c1][        ][        ]|0048|VM_NOR
00000030:[        ][        ][        ]{00463140->92 01      }[00000001][        ][        ]|0044|VM_PUSH_IMMB
00000031:[00462a51][00000001][        ]{00463142->0a         }[004630c2][        ][        ]|0048|VM_ADD
00000032:[        ][        ][        ]{00463143->92 ff      }[ffffffff][        ][        ]|0044|VM_PUSH_IMMB
00000033:[004625fd][ffffffff][        ]{00463145->0a         }[004630c1][        ][        ]|0048|VM_ADD
00000034:[ffffffff][        ][        ]{00463146->5d 05      }[        ][        ][        ]|0052|VM_POP_CT
00000035:[        ][        ][        ]{00463148->2b         }[0012fe04][        ][        ]|0048|VM_PUSH_ESP
00000036:[        ][        ][        ]{00463149->27 0a      }[cccccccc][        ][        ]|0044|VM_PUSH_CT
00000037:[        ][        ][        ]{0046314B->d3 03      }[00000001][        ][        ]|0040|VM_PUSH_CT
00000038:[        ][        ][        ]{0046314D->d3 04      }[00000212][        ][        ]|0036|VM_PUSH_CT
00000039:[        ][        ][        ]{0046314F->27 00      }[0045a7a0][        ][        ]|0032|VM_PUSH_CT
00000040:[        ][        ][        ]{00463151->d3 0c      }[7ffd8000][        ][        ]|0028|VM_PUSH_CT
00000041:[        ][        ][        ]{00463153->27 0e      }[0012fedc][        ][        ]|0024|VM_PUSH_CT
00000042:[        ][        ][        ]{00463155->d3 06      }[771a3dbf][        ][        ]|0020|VM_PUSH_CT
00000043:[        ][        ][        ]{00463157->d3 02      }[7ffd8000][        ][        ]|0016|VM_PUSH_CT
00000044:[        ][        ][        ]{00463159->d3 0d      }[0012fedc][        ][        ]|0012|VM_PUSH_CT
00000045:[        ][        ][        ]{0046315B->d3 07      }[00000000][        ][        ]|0008|VM_PUSH_CT
00000046:[        ][        ][        ]{0046315D->27 05      }[004630c1][        ][        ]|0004|VM_PUSH_CT
00000047:[        ][        ][        ]{0046315F->6c         }[        ][        ][        ]|0008|VM_JMP
第0001次跳转,跳转到:0x004630C1(VMInsBuff_01)
00000048:[00462968][        ][        ]{004630C1->5d 07      }[        ][        ][        ]|0012|VM_POP_CT
00000049:[00462968][        ][        ]{004630C3->5d 0d      }[        ][        ][        ]|0016|VM_POP_CT
00000050:[00462968][        ][        ]{004630C5->5a 02      }[        ][        ][        ]|0020|VM_POP_CT
00000051:[00462968][        ][        ]{004630C7->5a 06      }[        ][        ][        ]|0024|VM_POP_CT
00000052:[00462968][        ][        ]{004630C9->5d 0e      }[        ][        ][        ]|0028|VM_POP_CT
00000053:[00462968][        ][        ]{004630CB->5a 0c      }[        ][        ][        ]|0032|VM_POP_CT
00000054:[00462968][        ][        ]{004630CD->5d 00      }[        ][        ][        ]|0036|VM_POP_CT
00000055:[00462968][        ][        ]{004630CF->5a 04      }[        ][        ][        ]|0040|VM_POP_CT
00000056:[00462968][        ][        ]{004630D1->5d 03      }[        ][        ][        ]|0044|VM_POP_CT
00000057:[00462968][        ][        ]{004630D3->5d 0a      }[        ][        ][        ]|0048|VM_POP_CT
00000058:[00462884][        ][        ]{004630D5->a5         }[        ][        ][        ]|0052|VM_POP_EAX
00000059:[        ][        ][        ]{004630D6->22 ffbe3ccf}[ffbe3ccf][        ][        ]|0048|VM_PUSH_IMM
00000060:[        ][        ][        ]{004630DB->27 02      }[7ffd8000][        ][        ]|0044|VM_PUSH_CT
00000061:[        ][        ][        ]{004630DD->2b         }[0012fdfc][        ][        ]|0040|VM_PUSH_ESP
00000062:[00462968][        ][        ]{004630DE->57         }[7ffd8000][        ][        ]|0040|VM_MOV_B_SSA
00000063:[        ][        ][        ]{004630DF->22 669828c5}[669828c5][        ][        ]|0036|VM_PUSH_IMM
00000064:[        ][        ][        ]{004630E4->2b         }[0012fdf4][        ][        ]|0032|VM_PUSH_ESP
00000065:[        ][        ][        ]{004630E5->92 08      }[00000008][        ][        ]|0028|VM_PUSH_IMMB
00000066:[00462968][00000008][        ]{004630E7->0a         }[0012fdfc][        ][        ]|0032|VM_ADD
00000067:[00000008][        ][        ]{004630E8->bd         }[7ffd8000][        ][        ]|0040|VM_MOV_SSA_B
00000068:[        ][        ][        ]{004630E9->2b         }[0012fdf8][        ][        ]|0036|VM_PUSH_ESP
00000069:[0012fdfc][        ][        ]{004630EA->87         }[      00][        ][        ]|0038|VM_MOVB_B_SSA
00000070:[    0046][    fdf8][        ]{004630EB->7a         }[    0246][    8000][        ]|0038|VM_ADDB_F
00000071:[0046241b][        ][        ]{004630EC->a5         }[        ][        ][        ]|0042|VM_POP_EAX
00000072:[    27a3][        ][        ]{004630ED->5c 0f      }[        ][        ][        ]|0044|VM_POPW_CTW
00000073:[00462a51][669828c5][        ]{004630EF->77         }[0041c330][        ][        ]|0048|VM_NOR
00000074:[        ][        ][        ]{004630F0->27 07      }[00000000][        ][        ]|0044|VM_PUSH_CT
00000075:[00462a51][00000000][        ]{004630F2->0a         }[0041c330][        ][        ]|0048|VM_ADD
00000076:[        ][        ][        ]{004630F3->27 0a      }[cccccccc][        ][        ]|0044|VM_PUSH_CT
00000077:[        ][        ][        ]{004630F5->d3 03      }[00000001][        ][        ]|0040|VM_PUSH_CT
00000078:[        ][        ][        ]{004630F7->d3 04      }[00000212][        ][        ]|0036|VM_PUSH_CT
00000079:[        ][        ][        ]{004630F9->27 00      }[0045a7a0][        ][        ]|0032|VM_PUSH_CT
00000080:[        ][        ][        ]{004630FB->d3 0c      }[7ffd8000][        ][        ]|0028|VM_PUSH_CT
00000081:[        ][        ][        ]{004630FD->27 0e      }[0012fedc][        ][        ]|0024|VM_PUSH_CT
00000082:[        ][        ][        ]{004630FF->27 06      }[771a3dbf][        ][        ]|0020|VM_PUSH_CT
00000083:[        ][        ][        ]{00463101->27 02      }[7ffd8000][        ][        ]|0016|VM_PUSH_CT
00000084:[        ][        ][        ]{00463103->27 0d      }[0012fedc][        ][        ]|0012|VM_PUSH_CT
00000085:[        ][        ][        ]{00463105->d3 07      }[00000000][        ][        ]|0008|VM_PUSH_CT
00000086:[        ][        ][        ]{00463107->93         }[        ][        ][        ]|0048|VM_RETN
(.jmp)文件给出了伪代码块的记录,当加密体比较庞大时,从这个文件里能看出大致的执行流程,以便定位关键跟踪区域。本例中只有两条。
第0000次跳转,跳转到:0x00463108(VMInsBuff_00)
第0001次跳转,跳转到:0x004630C1(VMInsBuff_01)
上传的附件:
2007-12-6 21:54
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
7
第五节 伪代码宏

   说的是伪代码组合,通常几条甚至几十条伪指令完成一条可以用类x86表述的功能,我把称为伪代码宏,我给每一个伪代码块赋予一个以“VMM_”开始的名字,以与单条伪代码块区分。可以理解伪代码宏为一个伪代码功能组合,它有一条或多条前面定义的伪指令组成。

   伪代码宏,有部分是常规的伪代码组合,有的是变形和繁化。当使用伪代码宏来替代伪代码指令的时候,会很有成就感,你可以将大段大段的伪代码,缩写为一条或几条伪代码宏。有人说过,扭曲变形繁化的方法千千万,简化的方法只有一种。这说明了什么?是繁化更容易还是简化更容易?

   下面列出了一些常用的伪代码宏,相信比较好理解,也希望大家能补充共享,如果能搜集的比较完整,我会再写一个伪代码宏的插件,进行自动简化和去除垃圾代码功能,如果这样,就真的几乎可以直接看到原始汇编代码了。
   
   一、常规组合:
1、VMM_POP_CT n
{00432285->95 0c      }|0004|VM_POP_CT 
{00432287->d0 0a      }|0008|VM_POP_CT 
{00432289->d0 0e      }|0012|VM_POP_CT 
{0043228B->95 05      }|0016|VM_POP_CT 
{0043228D->95 0d      }|0020|VM_POP_CT 
{0043228F->95 02      }|0024|VM_POP_CT 
{00432291->d0 06      }|0028|VM_POP_CT 
{00432293->d0 07      }|0032|VM_POP_CT 
{00432295->95 04      }|0036|VM_POP_CT 
{00432297->95 0b      }|0040|VM_POP_CT 
{00432299->95 01      }|0044|VM_POP_CT 

2、VMM_PUSH_CT n
{004322DF->79 06      }|0044|VM_PUSH_CT 
{004322E1->79 0b      }|0040|VM_PUSH_CT 
{004322E3->79 04      }|0036|VM_PUSH_CT 
{004322E5->79 07      }|0032|VM_PUSH_CT 
{004322E7->79 06      }|0028|VM_PUSH_CT 
{004322E9->79 02      }|0024|VM_PUSH_CT 
{004322EB->79 0d      }|0020|VM_PUSH_CT 
{004322ED->79 05      }|0016|VM_PUSH_CT 
{004322EF->79 0e      }|0012|VM_PUSH_CT 
{004322F1->79 0a      }|0008|VM_PUSH_CT 
{004322F3->79 0c      }|0004|VM_PUSH_CT

3、VMM_INC
0xe6 01     |0040|VM_PUSH_IMMB   01h         
0xf4           |0044|VM_ADD     FFB9CF5Bh   
VMM_INC= add 01h

4、VMM_DEC
0x92 ff         |0044|VM_PUSH_IMMB   ;PUSH -0x01
0x0a            |0048|VM_ADD     ; 
VMM_DEC=add –01h.

5、VMM_PUSH_SSA
0xc3          |0040|VM_PUSH_ESP     
0x14          |0040|VM_MOV_B_SSA
相当于是复制[esp]中的内容,并压栈。通常与NOR结合使用,产生NOT逻辑。很常用。

6、VMM_SUB=VMM_NOT+VMM_ADD
{004321C0->1f 32      }|0044|VM_PUSH_IMMB
{004321C2->79 06      }|0040|VM_PUSH_CT
{004321C8->37         }|0036|VM_PUSH_ESP 
{004321C9->61         }|0036|VM_MOV_B_SSA 
{004321CA->10         }|0040|VM_NOR
{004321CB->b6         }|0042|VM_ADD_F
a –b=a+(-b)

7、VMM_SHLD
{004325F3->f6 05      }|0046|VM_PUSHW_IMMB 
{004325F5->f4 01      }|0042|VM_PUSH_CT 
{004325F7->f4 01      }|0038|VM_PUSH_CT 
{004325F9->65         }|0042|VM_SHLD_F 
{004325FA->41         }|0044|VM_POPW_DX
这是个常规组合,类似的常规组合有很多,比如VMM_SHL,VMM_ADDW,VMM_IMUL等等。就不一一列出了。

下面看个复杂的。
8、VMM_BSWAP
在x86下,bswap是个字节交换指令,我以前几乎没接触过,碰巧看到这个指令帮助,竟然和跟踪的一块vmp伪指令对上了。相信还有更多类似的指令还没有发现。等大家补充。
{004322C0->3e 08      }|0046|VM_PUSHW_IMMB		 ;VMM_PUSHW 0008h
{004322C2->79 03      }|0042|VM_PUSH_CT 
{004322C4->2a         }|0044|VM_POP_DX 			;VMM_PSUHW C03H
{004322C5->37         }|0040|VM_PUSH_ESP 
{004322C6->d6         }|0042|VM_MOVW_B_SSA 
{004322C7->4b         }|0044|VM_SHL 				;VMM_SHL W[esp],8
{004322C8->3e 08      }|0042|VM_PUSHW_IMMB 
{004322CA->01 03      }|0040|VM_PUSHW_CTW 
{004322CC->01 03      }|0038|VM_PUSHW_CTW 
{004322CE->4b         }|0040|VM_SHL 
{004322CF->2a         }|0042|VM_POP_DX 			;VMM_SHL C03L,8
{004322D0->37         }|0038|VM_PUSH_ESP 
{004322D1->1f 04      }|0034|VM_PUSH_IMMB 
{004322D3->12         }|0038|VM_ADD 				;VMM_ADD esp,04h
{004322D4->d6         }|0040|VM_MOVW_B_SSA 	
{004322D5->d0 03      }|0044|VM_POP_CT			;VMM_POP_CT03
这一段等效VMM_BSWAP CT03。相当于是对CONTEXT中第3个双字进行字节交换。本例是将CT03中的55debcffH变换为ffbcde55H


二、逻辑运算宏
   在VMP1.20-VMP1.22几个版本中,只有一类逻辑运算“NOR或非”运算,通过这一种运算可以实现所有的逻辑功能。先解释一下NOR。
   (a NOR b)=NOT(a OR b),与“NAND与非”是兄弟。在硬件的逻辑电路中,最常用的是NAND与非门,硬件中主要是通过NAND来实现各种逻辑关系。而Vmprotect却用了“NOR或非这个运算”,实质是一样的。在x86里没有NOR这个指令。下面我们看一下它是如何实现各个逻辑功能的。

1、VMM_NOT=VMM_PUSH_SSA,VM_NOR
0xc3          |0040|VM_PUSH_ESP
0x14          |0040|VM_MOV_B_SSA 
0x57          |0044|VM_NOR   
它实际上是 (a NOR a)=NOT(a or a)=NOT a

2、VMM_ANDW
{004321F9->01 02      }|0038|VM_PUSHW_CTW 
{004321FB->01 02      }|0036|VM_PUSHW_CTW 
{004321FD->5b         }|0038|VM_NORW  ;VMM_NOT CT02W
{004321FE->4e ff7f    }|0036|VM_PUSHW_IMMW ;VMM_PUSH   FF7FH
{00432201->b8         }|0036|VM_NORW_F ;VMM_NORW_F  FF7FH,(NOT CT02W)
它实际上是
a  AND  b=NOT( (NOT a) OR (NOT b))
所以  VMM_AND 0080,CT02W=VMM_NORW FF7F,(NOT CT02W)
这常用在取标志位的操作中。

3、VMM_XORB
a XOR b=not(a XAND b)=NOT(((NOT a)AND(NOT b)) OR( a AND b))
{00432212->ef 02      }|0038|VM_PUSHW_CTB0 
{00432214->cd 46      }|0036|VM_PUSHW_CTB1 
{00432216->87         }|0038|VM_NORB
{00432217->cd 46      }|0036|VM_PUSHW_CTB1 
{00432219->cd 46      }|0034|VM_PUSHW_CTB1 
{0043221B->71         }|0036|VM_NORB 
{0043221C->ef 02      }|0034|VM_PUSHW_CTB0 
{0043221E->ef 02      }|0032|VM_PUSHW_CTB0 
{00432220->71         }|0034|VM_NORB 
{00432221->71         }|0036|VM_NORB 
{00432222->87         }|0038|VM_NORB

    这些已够了,其它如
   a XAND b=NOT(a XOR b)
    a OR b=NOT((NOT a) AND (NOT b))
    均可以组合出来,而他们的组合随意变换繁化,可以把代码搞的很复杂。只要德摩根定律和几个简单的逻辑代数公式烂熟于胸,即可游刃有余。这些逻辑运算可能主要用于FLAG的操作上,而FLAG操作直接和cmp和条件跳转相关,所以似乎比较重要。因为目前来看,vmprotect还原很费事费时,爆破是捷径。(呵呵,都是别人说的,我摘录来的)

三、等效的空指令宏
    我很喜欢空指令,就像一句古诗“是非成败转头空,古今多少事,都付笑谈中”,这句用在这里很合适。最喜欢的就是在大量的代码中,拿着笔大段大段的“咔嚓”空指令。如果看过“月中人”翻译的《变形实践》,你会发现空指令的实现方法真是千千万,它可以插入在代码中的任意位置(当然,它会影响跳转地址等),VMM_NOP中还可嵌套空指令,正如数学里的0一样,是个神奇的东东。
   下面是我见过的几个简单的。
1、VMM_NOP=VMM_INC,VMM_DEC
0x92 01       |0044|VM_PUSH_IMMB   ;push 0x01
0x0a            |0048|VM_ADD     ;
0x92 ff         |0044|VM_PUSH_IMMB   ;PUSH -0x01
0x0a            |0048|VM_ADD     ;  

2、VMM_NOP=VMM_NOT,VMM_NOT
0xa1          |0040|VM_PUSH_ESP     12FE00h       
0xa9          |0040|VM_MOV_SSA_TO_B     FFF9CF5Bh 
0xc1          |0044|VM_NOR                       4630A5h  
0xa1          |0040|VM_PUSH_ESP     12FE00h       
0xa9          |0040|VM_MOV_SSA_TO_B      4630A5h  
0xc1          |0044|VM_NOR       FFF9CF5Bh

3、VMM_NOP=VMM_NOT,VMM_INC,VM_NOT,VM_INC
0xa1          |0040|VM_PUSH_ESP     12FE00h         
0xa9          |0040|VM_MOV_SSA_TO_B      4630A5h    
0xc1           |0044|VM_NOR       FFF9CF5Bh   
0xe6 01     |0040|VM_PUSH_IMMB     01h         
0xf4           |0044|VM_ADD       FFB9CF5Bh   
0xa1          |0040|VM_PUSH_ESP                            12FE00h         
0xa9          |0040|VM_MOV_SSA_TO_B     FFB9CF5Bh   
0x5e          |0044|VM_NOR       4630A4h     
0xe6 01     |0040|VM_PUSH_IMMB     01h         
0xf5           |0044|VM_ADD       4630A5h
2007-12-6 21:54
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
8
第六节 几条加了vmp的x86指令的正向分析
    论坛上的lusylol兄弟提醒最好使用正向分析,同时也多谢他提醒注意vmprotect的加密区域。
下面,用前面的两个插件,并结合伪代码宏的处理方法,分析几条简单汇编指令。
    一个简单的C程序源代码如下:
#include <iostream>
#include <limits>
#include <math.h>
sing namespace std;
class counter
{
	int data_value;
public:
	void set_value(int);
	int get_value(void);
	int get_num(void);
}sam;
void counter::set_value(int v)
{
	if(v>50)
		data_value=v;
	else
		data_value=0;
}
int counter::get_num(void)
{
	int ii;
	ii=int(data_value);
	return ii;
}
int counter::get_value(void)
{
	int ii;
	ii=data_value*data_value;
	return ii;
}
int main() {
	sam.set_value(10);
	//cout<<"the value is:"<<sam.get_value()<<endl;
	//cout<<"the num is:"<<sam.get_num()<<endl;
}

    生成exe文件后,使用VMP1.20(它与VMP1.22比较类似,但更容易看一些)加密set_value(int v)这个函数,取消所有的加强选项(这样简单些,当然你可以加上,但需要更多的时间和篇幅去描述化简的工作)
    被加密的汇编代码如下:
// if(v>50)
00411A53 837D0832       cmp dword ptr [ebp+08], 32   
00411A57 7E0A           jle 00411A63
//		data_value=v;
00411A59 8B45F8         mov eax, [ebp-08] 
00411A5C 8B4D08        mov ecx, [ebp+08] 
00411A5F 8908           mov [eax], ecx 
//else
00411A61 EB09           jmp 00411A6C
// 	data_value=0;
00411A63 8B45F8         mov eax, [ebp-08] 
00411A66 C70000000000  mov dword ptr [eax], 00000000 
}
00411A6C 5F             pop edi 
00411A6D 5E             pop esi 
00411A6E 5B             pop ebx 
00411A6F 8BE5           mov esp, ebp 
00411A71 5D              pop ebp 
00411A72 C20400         ret 0004

使用虚拟机伪代码识别插件后,再运行虚拟机为代码记录插件(目前均是1202的最新版,其它日期生成的都咔嚓吧)。
Jmp文件内容如下:
第0000次跳转,跳转到:0x00432285(VMInsBuff_00)
第0001次跳转,跳转到:0x004321AA(VMInsBuff_01)
第0002次跳转,跳转到:0x00432285(VMInsBuff_00)
第0003次跳转,跳转到:0x004322F8(VMInsBuff_03)
hoho,它执行了4个伪代码块,其中VMInsBuff_00这个代码块被执行了两次(我们比较运气)。后面的分析我们会知道VMInsBuff_00相当于是个dispatcher(调度器),由它对下一个代码块的进入地址解密分析,有点像前面虚拟机引擎的解释器部分,这是vm中的vm吗?我不知道,我没有分析太多代码块和程序,以后再验证这个猜测吧。
再看rec文件中的内容。内容比较多,尽管我们取消了那3个加强选项,它还是有三百多条(不取消那几个选项的话,要求千条左右)。本节,我们只看VMInsBuff_03这个代码块中吧。VMInsBuff_01中包含是的cmp和jmp是下节讨论的内容。下面我们只把VMInsBuff_03的内容列出,它与VMInsBuff_01相比要简单很多。柿子先拣软的捏。
00000263:[00000000][        ][        ]{004322F8->95 0a      }[        ][        ][        ]|0008|VM_POP_CT
00000264:[0012fe04][        ][        ]{004322FA->d0 08      }[        ][        ][        ]|0012|VM_POP_CT
00000265:[00429500][        ][        ]{004322FC->95 0b      }[        ][        ][        ]|0016|VM_POP_CT
00000266:[0012fd0c][        ][        ]{004322FE->d0 00      }[        ][        ][        ]|0020|VM_POP_CT
00000267:[0012fe04][        ][        ]{00432300->95 01      }[        ][        ][        ]|0024|VM_POP_CT
00000268:[00000287][        ][        ]{00432302->d0 02      }[        ][        ][        ]|0028|VM_POP_CT
00000269:[00000001][        ][        ]{00432304->d0 06      }[        ][        ][        ]|0032|VM_POP_CT
00000270:[7ffde000][        ][        ]{00432306->d0 0c      }[        ][        ][        ]|0036|VM_POP_CT
00000271:[cccccccc][        ][        ]{00432308->d0 04      }[        ][        ][        ]|0040|VM_POP_CT
00000272:[771a3dbf][        ][        ]{0043230A->d0 03      }[        ][        ][        ]|0044|VM_POP_CT
00000273:[00000001][        ][        ]{0043230C->48         }[        ][        ][        ]|0048|VM_POP_ECX
00000274:[        ][        ][        ]{0043230D->1f f8      }[fffffff8][        ][        ]|0044|VM_PUSH_IMMB
00000275:[        ][        ][        ]{0043230F->79 08      }[0012fe04][        ][        ]|0040|VM_PUSH_CT
00000276:[0012fe04][fffffff8][        ]{00432311->12         }[0012fdfc][        ][        ]|0044|VM_ADD
00000277:[0012fdfc][        ][        ]{00432312->61         }[00429500][        ][        ]|0044|VM_MOV_B_SSA
00000278:[00429500][        ][        ]{00432313->95 05      }[        ][        ][        ]|0048|VM_POP_CT
00000279:[        ][        ][        ]{00432315->1f 00      }[00000000][        ][        ]|0044|VM_PUSH_IMMB
00000280:[        ][        ][        ]{00432317->79 05      }[00429500][        ][        ]|0040|VM_PUSH_CT
00000281:[00429500][        ][        ]{00432319->76         }[0012fedc][        ][        ]|0048|VM_MOV_DSA_B
00000282:[        ][        ][        ]{0043231A->8b 00000114}[00000114][        ][        ]|0044|VM_PUSH_IMM
00000283:[        ][        ][        ]{0043231F->79 01      }[0012fe04][        ][        ]|0040|VM_PUSH_CT
00000284:[        ][        ][        ]{00432321->79 03      }[771a3dbf][        ][        ]|0036|VM_PUSH_CT
00000285:[        ][        ][        ]{00432323->79 08      }[0012fe04][        ][        ]|0032|VM_PUSH_CT
00000286:[        ][        ][        ]{00432325->79 02      }[00000287][        ][        ]|0028|VM_PUSH_CT
00000287:[        ][        ][        ]{00432327->79 05      }[00429500][        ][        ]|0024|VM_PUSH_CT
00000288:[        ][        ][        ]{00432329->79 0b      }[00429500][        ][        ]|0020|VM_PUSH_CT
00000289:[        ][        ][        ]{0043232B->79 0c      }[7ffde000][        ][        ]|0016|VM_PUSH_CT
00000290:[        ][        ][        ]{0043232D->79 06      }[00000001][        ][        ]|0012|VM_PUSH_CT
00000291:[        ][        ][        ]{0043232F->79 00      }[0012fd0c][        ][        ]|0008|VM_PUSH_CT
00000292:[        ][        ][        ]{00432331->79 0a      }[00000000][        ][        ]|0004|VM_PUSH_CT
00000293:[00000000][        ][        ]{00432333->d0 0a      }[        ][        ][        ]|0008|VM_POP_CT
00000294:[0012fd0c][        ][        ]{00432335->d0 00      }[        ][        ][        ]|0012|VM_POP_CT
00000295:[00000001][        ][        ]{00432337->d0 04      }[        ][        ][        ]|0016|VM_POP_CT
00000296:[7ffde000][        ][        ]{00432339->95 06      }[        ][        ][        ]|0020|VM_POP_CT
00000297:[00429500][        ][        ]{0043233B->d0 0d      }[        ][        ][        ]|0024|VM_POP_CT
00000298:[00429500][        ][        ]{0043233D->d0 09      }[        ][        ][        ]|0028|VM_POP_CT
00000299:[00000287][        ][        ]{0043233F->d0 02      }[        ][        ][        ]|0032|VM_POP_CT
00000300:[0012fe04][        ][        ]{00432341->d0 0b      }[        ][        ][        ]|0036|VM_POP_CT
00000301:[771a3dbf][        ][        ]{00432343->95 08      }[        ][        ][        ]|0040|VM_POP_CT
00000302:[0012fe04][        ][        ]{00432345->d0 05      }[        ][        ][        ]|0044|VM_POP_CT
00000303:[00000114][        ][        ]{00432347->48         }[        ][        ][        ]|0048|VM_POP_ECX
00000304:[0012fedc][        ][        ]{00432348->95 01      }[        ][        ][        ]|0052|VM_POP_CT
00000305:[771a3dbf][        ][        ]{0043234A->d0 03      }[        ][        ][        ]|0056|VM_POP_CT
00000306:[7ffde000][        ][        ]{0043234C->d0 05      }[        ][        ][        ]|0060|VM_POP_CT
00000307:[        ][        ][        ]{0043234E->79 0b      }[0012fe04][        ][        ]|0056|VM_PUSH_CT
00000308:[0012fe04][        ][        ]{00432350->8f         }[        ][        ][        ]|0264|VM_POP_ESP
00000309:[0012fedc][        ][        ]{00432351->d0 06      }[        ][        ][        ]|0268|VM_POP_CT
00000310:[        ][        ][        ]{00432353->37         }[0012fe08][        ][        ]|0264|VM_PUSH_ESP
00000311:[0012fe08][        ][        ]{00432354->61         }[00411b5a][        ][        ]|0264|VM_MOV_B_SSA
00000312:[        ][        ][        ]{00432355->37         }[0012fe04][        ][        ]|0260|VM_PUSH_ESP
00000313:[        ][        ][        ]{00432356->1f 08      }[00000008][        ][        ]|0256|VM_PUSH_IMMB
00000314:[00000008][0012fe04][        ]{00432358->12         }[0012fe0c][        ][        ]|0260|VM_ADD
00000315:[0012fe0c][        ][        ]{00432359->ab         }[00411b5a][        ][        ]|0268|VM_MOV_SSA_B
00000316:[00411b5a][        ][        ]{0043235A->95 0b      }[        ][        ][        ]|0272|VM_POP_CT
00000317:[        ][        ][        ]{0043235C->79 03      }[771a3dbf][        ][        ]|0268|VM_PUSH_CT
00000318:[        ][        ][        ]{0043235E->79 00      }[0012fd0c][        ][        ]|0264|VM_PUSH_CT
00000319:[        ][        ][        ]{00432360->79 0d      }[00429500][        ][        ]|0260|VM_PUSH_CT
00000320:[        ][        ][        ]{00432362->79 06      }[0012fedc][        ][        ]|0256|VM_PUSH_CT
00000321:[        ][        ][        ]{00432364->79 02      }[00000287][        ][        ]|0252|VM_PUSH_CT
00000322:[        ][        ][        ]{00432366->79 01      }[0012fedc][        ][        ]|0248|VM_PUSH_CT
00000323:[        ][        ][        ]{00432368->79 09      }[00429500][        ][        ]|0244|VM_PUSH_CT
00000324:[        ][        ][        ]{0043236A->79 05      }[7ffde000][        ][        ]|0240|VM_PUSH_CT
00000325:[        ][        ][        ]{0043236C->79 04      }[00000001][        ][        ]|0236|VM_PUSH_CT
00000326:[        ][        ][        ]{0043236E->79 0a      }[00000000][        ][        ]|0232|VM_PUSH_CT
00000327:[        ][        ][        ]{00432370->8c         }[        ][        ][        ]|0272|VM_RETN

呵呵,这个软柿子只有65条伪指令,我们使用伪代码宏的方法,来处理一下吧。处理结果如下,我加了注释:

00000263:[00000000][        ][        ]{004322F8->95 0a      }[        ][        ][        ]|0008|VM_POP_CT
00000264:[0012fe04][        ][        ]{004322FA->d0 08      }[        ][        ][        ]|0012|VM_POP_CT
00000265:[00429500][        ][        ]{004322FC->95 0b      }[        ][        ][        ]|0016|VM_POP_CT
00000266:[0012fd0c][        ][        ]{004322FE->d0 00      }[        ][        ][        ]|0020|VM_POP_CT
00000267:[0012fe04][        ][        ]{00432300->95 01      }[        ][        ][        ]|0024|VM_POP_CT
00000268:[00000287][        ][        ]{00432302->d0 02      }[        ][        ][        ]|0028|VM_POP_CT
00000269:[00000001][        ][        ]{00432304->d0 06      }[        ][        ][        ]|0032|VM_POP_CT
00000270:[7ffde000][        ][        ]{00432306->d0 0c      }[        ][        ][        ]|0036|VM_POP_CT
00000271:[cccccccc][        ][        ]{00432308->d0 04      }[        ][        ][        ]|0040|VM_POP_CT
00000272:[771a3dbf][        ][        ]{0043230A->d0 03      }[        ][        ][        ]|0044|VM_POP_CT
VMM_POP_CT 10(A, 8, B,0, 1, 2, 6, C, 4, 3)

00000273:[00000001][        ][        ]{0043230C->48         }[        ][        ][        ]|0048|VM_POP_ECX
VMM_POP_ECX(00000001)

00000274:[        ][        ][        ]{0043230D->1f f8      }[fffffff8][        ][        ]|0044|VM_PUSH_IMMB
00000275:[        ][        ][        ]{0043230F->79 08      }[0012fe04][        ][        ]|0040|VM_PUSH_CT
00000276:[0012fe04][fffffff8][        ]{00432311->12         }[0012fdfc][        ][        ]|0044|VM_ADD
->VMM_SUB CT08,08H
00000277:[0012fdfc][        ][        ]{00432312->61         }[00429500][        ][        ]|0044|VM_MOV_B_SSA
->VMX_PUSH [CT08-08H]
00000278:[00429500][        ][        ]{00432313->95 05      }[        ][        ][        ]|0048|VM_POP_CT
VMM_MOV CT05,[C08-08H]
00000279:[        ][        ][        ]{00432315->1f 00      }[00000000][        ][        ]|0044|VM_PUSH_IMMB
00000280:[        ][        ][        ]{00432317->79 05      }[00429500][        ][        ]|0040|VM_PUSH_CT
00000281:[00429500][        ][        ]{00432319->76         }[0012fedc][        ][        ]|0048|VM_MOV_DSA_B
VMM_MOV [CT05],00000000H
00000282:[        ][        ][        ]{0043231A->8b 00000114}[00000114][        ][        ]|0044|VM_PUSH_IMM
VMM_PUSH 0114H
00000283:[        ][        ][        ]{0043231F->79 01      }[0012fe04][        ][        ]|0040|VM_PUSH_CT
00000284:[        ][        ][        ]{00432321->79 03      }[771a3dbf][        ][        ]|0036|VM_PUSH_CT
00000285:[        ][        ][        ]{00432323->79 08      }[0012fe04][        ][        ]|0032|VM_PUSH_CT
00000286:[        ][        ][        ]{00432325->79 02      }[00000287][        ][        ]|0028|VM_PUSH_CT
00000287:[        ][        ][        ]{00432327->79 05      }[00429500][        ][        ]|0024|VM_PUSH_CT
00000288:[        ][        ][        ]{00432329->79 0b      }[00429500][        ][        ]|0020|VM_PUSH_CT
00000289:[        ][        ][        ]{0043232B->79 0c      }[7ffde000][        ][        ]|0016|VM_PUSH_CT
00000290:[        ][        ][        ]{0043232D->79 06      }[00000001][        ][        ]|0012|VM_PUSH_CT
00000291:[        ][        ][        ]{0043232F->79 00      }[0012fd0c][        ][        ]|0008|VM_PUSH_CT
00000292:[        ][        ][        ]{00432331->79 0a      }[00000000][        ][        ]|0004|VM_PUSH_CT
VMM_PUSH_CT 10(1, 3, 8, 2, 5, B, D, 6, 0, A)
00000293:[00000000][        ][        ]{00432333->d0 0a      }[        ][        ][        ]|0008|VM_POP_CT
00000294:[0012fd0c][        ][        ]{00432335->d0 00      }[        ][        ][        ]|0012|VM_POP_CT
00000295:[00000001][        ][        ]{00432337->d0 04      }[        ][        ][        ]|0016|VM_POP_CT
00000296:[7ffde000][        ][        ]{00432339->95 06      }[        ][        ][        ]|0020|VM_POP_CT
00000297:[00429500][        ][        ]{0043233B->d0 0d      }[        ][        ][        ]|0024|VM_POP_CT
00000298:[00429500][        ][        ]{0043233D->d0 09      }[        ][        ][        ]|0028|VM_POP_CT
00000299:[00000287][        ][        ]{0043233F->d0 02      }[        ][        ][        ]|0032|VM_POP_CT
00000300:[0012fe04][        ][        ]{00432341->d0 0b      }[        ][        ][        ]|0036|VM_POP_CT
00000301:[771a3dbf][        ][        ]{00432343->95 08      }[        ][        ][        ]|0040|VM_POP_CT
00000302:[0012fe04][        ][        ]{00432345->d0 05      }[        ][        ][        ]|0044|VM_POP_CT
VMM_POP_CT 10(A, 0,4, 6, D, 9,2, B, 8, 5)
00000303:[00000114][        ][        ]{00432347->48         }[        ][        ][        ]|0048|VM_POP_ECX
VMM_POP_ECX(00000114H)
00000304:[0012fedc][        ][        ]{00432348->95 01      }[        ][        ][        ]|0052|VM_POP_CT
00000305:[771a3dbf][        ][        ]{0043234A->d0 03      }[        ][        ][        ]|0056|VM_POP_CT
00000306:[7ffde000][        ][        ]{0043234C->d0 05      }[        ][        ][        ]|0060|VM_POP_CT
VMM_POP_CT 3(1, 3, 5)
00000307:[        ][        ][        ]{0043234E->79 0b      }[0012fe04][        ][        ]|0056|VM_PUSH_CT
00000308:[0012fe04][        ][        ]{00432350->8f         }[        ][        ][        ]|0264|VM_POP_ESP
VMM_MOV ESP,CT0B
00000309:[0012fedc][        ][        ]{00432351->d0 06      }[        ][        ][        ]|0268|VM_POP_CT
VMM_POP CT06
00000310:[        ][        ][        ]{00432353->37         }[0012fe08][        ][        ]|0264|VM_PUSH_ESP
00000311:[0012fe08][        ][        ]{00432354->61         }[00411b5a][        ][        ]|0264|VM_MOV_B_SSA
VMX_PUSH_SSA
00000312:[        ][        ][        ]{00432355->37         }[0012fe04][        ][        ]|0260|VM_PUSH_ESP
00000313:[        ][        ][        ]{00432356->1f 08      }[00000008][        ][        ]|0256|VM_PUSH_IMMB
00000314:[00000008][0012fe04][        ]{00432358->12         }[0012fe0c][        ][        ]|0260|VM_ADD
VMM_ADD ESP,08H
00000315:[0012fe0c][        ][        ]{00432359->ab         }[00411b5a][        ][        ]|0268|VM_MOV_SSA_B
VMM_MOV [12FE0C],[esp]
00000316:[00411b5a][        ][        ]{0043235A->95 0b      }[        ][        ][        ]|0272|VM_POP_CT
VMM_MOV CT0B,[esp+8]
00000317:[        ][        ][        ]{0043235C->79 03      }[771a3dbf][        ][        ]|0268|VM_PUSH_CT
00000318:[        ][        ][        ]{0043235E->79 00      }[0012fd0c][        ][        ]|0264|VM_PUSH_CT
00000319:[        ][        ][        ]{00432360->79 0d      }[00429500][        ][        ]|0260|VM_PUSH_CT
00000320:[        ][        ][        ]{00432362->79 06      }[0012fedc][        ][        ]|0256|VM_PUSH_CT
00000321:[        ][        ][        ]{00432364->79 02      }[00000287][        ][        ]|0252|VM_PUSH_CT
00000322:[        ][        ][        ]{00432366->79 01      }[0012fedc][        ][        ]|0248|VM_PUSH_CT
00000323:[        ][        ][        ]{00432368->79 09      }[00429500][        ][        ]|0244|VM_PUSH_CT
00000324:[        ][        ][        ]{0043236A->79 05      }[7ffde000][        ][        ]|0240|VM_PUSH_CT
00000325:[        ][        ][        ]{0043236C->79 04      }[00000001][        ][        ]|0236|VM_PUSH_CT
00000326:[        ][        ][        ]{0043236E->79 0a      }[00000000][        ][        ]|0232|VM_PUSH_CT
VMM_PUSH_CT 10(1, 3, 8, 2, 5, B, C, 6, 0, A)
00000327:[        ][        ][        ]{00432370->8c         }[        ][        ][        ]|0272|VM_RETN
VMM_RETN

将上面的伪指令宏摘出来结果如下:
VMM_POP_CT 10(A, 8, B,0, 1, 2, 6, C, 4, 3)
VMM_POP_ECX(00000001)
VMM_MOV CT05,[C08-08H]        				 ;mov eax, [ebp-08]
VMM_MOV [CT05],00000000H     				 ;mov dword ptr [eax], 00000000
VMM_PUSH 0114H
VMM_PUSH_CT 10(1, 3, 8, 2, 5, B, D, 6, 0, A)
VMM_POP_CT 10(A, 0,4, 6, D, 9,2, B, 8, 5)
VMM_POP_ECX(00000114H)
VMM_POP_CT 3(1, 3, 5)							;pop edi,pop esi,pop ebx
VMM_MOV ESP,CT0B							;mov esp, ebp
VMM_POP CT06									;pop ebp
VMX_PUSH_SSA
VMM_ADD ESP,08H
VMM_MOV [12FE0C],[esp]
VMM_MOV CT0B,[esp+8]
VMM_PUSH_CT 10(1, 3, 8, 2, 5, B, C, 6, 0, A)
VMM_RETN


    注释的就是对应的最开始的加密的源代码。好像成绩不大,才仅仅是几条普通指令的识别,高手会笑话。可对我来说,当我看到这段时,是我几个月漂流中第一次见到陆地。
    这段代码没有什么NOP和太多的复杂的难分析的宏,如果想有成就感,就再把那三个加强的选项选上试试吧。
    另:tracer有个缺点,就是只能跟踪到部分实际运行的代码,这也是动态跟踪调试的缺点,所以还要结合静态分析,寻找jmp的分支点。下篇再讨论吧,Vmprotect的cmp和jmp比较复杂。。。。
上传的附件:
2007-12-6 21:55
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
9
第七节 Vmprotect中JMP和CMP的实现

    对Vmprotect的jmp和cmp其实我并没有彻底搞懂,半看半猜,肯定有错误,请大家用怀疑的目光来看本节,希望有朋友给些提示和指出错误。
    继续上节的分析。回顾一下上节的Jmp文件内容如下:
第0000次跳转,跳转到:0x00432285(VMInsBuff_00)
第0001次跳转,跳转到:0x004321AA(VMInsBuff_01)
第0002次跳转,跳转到:0x00432285(VMInsBuff_00)
第0003次跳转,跳转到:0x004322F8(VMInsBuff_03)

     共有3个伪指令块,其中VMInsBuff_00被执行了两次,先来看一下它完成了什么。
一、VMInsBuff_00(VMB_dispatcher)
   将该代码块使用伪指令宏简化表示:
00000000:[00000000][        ][        ]{00432285->95 0c      }[        ][        ][        ]|0004|VM_POP_CT
00000001:[00000001][        ][        ]{00432287->d0 0a      }[        ][        ][        ]|0008|VM_POP_CT
00000002:[7ffde000][        ][        ]{00432289->d0 0e      }[        ][        ][        ]|0012|VM_POP_CT
00000003:[cccccccc][        ][        ]{0043228B->95 05      }[        ][        ][        ]|0016|VM_POP_CT
00000004:[0012fe04][        ][        ]{0043228D->95 0d      }[        ][        ][        ]|0020|VM_POP_CT
00000005:[00000212][        ][        ]{0043228F->95 02      }[        ][        ][        ]|0024|VM_POP_CT
00000006:[0012fe04][        ][        ]{00432291->d0 06      }[        ][        ][        ]|0028|VM_POP_CT
00000007:[00429500][        ][        ]{00432293->d0 07      }[        ][        ][        ]|0032|VM_POP_CT
00000008:[771a3dbf][        ][        ]{00432295->95 04      }[        ][        ][        ]|0036|VM_POP_CT
00000009:[771a3dbf][        ][        ]{00432297->95 0b      }[        ][        ][        ]|0040|VM_POP_CT
00000010:[00432285][        ][        ]{00432299->95 01      }[        ][        ][        ]|0044|VM_POP_CT
VMM_POP_CT 11(C,A,E,5,D,2,6,7,4,B,1)
00000011:[        ][        ][        ]{0043229B->37         }[0012fd28][        ][        ]|0040|VM_PUSH_ESP
00000012:[0012fd28][        ][        ]{0043229C->61         }[2ef761c2][        ][        ]|0040|VM_MOV_B_SSA
00000013:[2ef761c2][2ef761c2][        ]{0043229D->10         }[d1089e3d][        ][        ]|0044|VM_NOR
VMM_NOT [esp](2ef761c2)= d1089e3d
00000014:[        ][        ][        ]{0043229E->8b e199c1f4}[e199c1f4][        ][        ]|0040|VM_PUSH_IMM
00000015:[e199c1f4][d1089e3d][        ]{004322A3->12         }[b2a26031][        ][        ]|0044|VM_ADD
00000016:[b2a26031][        ][        ]{004322A4->95 03      }[        ][        ][        ]|0048|VM_POP_CT
VMM_ADD e199c1f4,[esp]( d1089e3d)= b2a26031
VMM_POP CT03(b2a26031)
00000017:[        ][        ][        ]{004322A6->3e 14      }[    0014][        ][        ]|0046|VM_PUSHW_IMMB
00000018:[        ][        ][        ]{004322A8->79 03      }[b2a26031][        ][        ]|0042|VM_PUSH_CT
00000019:[        ][        ][        ]{004322AA->79 03      }[b2a26031][        ][        ]|0038|VM_PUSH_CT
00000020:[b2a26031][b2a26031][    0014]{004322AC->f2         }[    0202][031b2a26][        ]|0042|VM_SHLD_F
00000021:[    0202][        ][        ]{004322AD->5a 00      }[        ][        ][        ]|0044|VM_POPW_CTW
VMM_SHLD_F CT03(b2a26031),0014h=031b2a26
VMM_POPFW_CT00W
00000022:[        ][        ][        ]{004322AF->8b a70618da}[a70618da][        ][        ]|0040|VM_PUSH_IMM
00000023:[a70618da][031b2a26][        ]{004322B4->12         }[aa214300][        ][        ]|0044|VM_ADD
VMM_ADD a70618da, [esp]031b2a26= aa214300
00000024:[        ][        ][        ]{004322B5->37         }[0012fd28][        ][        ]|0040|VM_PUSH_ESP
00000025:[0012fd28][        ][        ]{004322B6->61         }[aa214300][        ][        ]|0040|VM_MOV_B_SSA
00000026:[aa214300][aa214300][        ]{004322B7->10         }[55debcff][        ][        ]|0044|VM_NOR
VMM_NOT [esp] aa214300=55debcff
00000027:[        ][        ][        ]{004322B8->1f 01      }[00000001][        ][        ]|0040|VM_PUSH_IMMB
00000028:[00000001][55debcff][        ]{004322BA->12         }[55debd00][        ][        ]|0044|VM_ADD
00000029:[        ][        ][        ]{004322BB->1f ff      }[ffffffff][        ][        ]|0040|VM_PUSH_IMMB
00000030:[ffffffff][55debd00][        ]{004322BD->12         }[55debcff][        ][        ]|0044|VM_ADD
VMM_NOP=VMM_INC,VMM_DEC
00000031:[55debcff][        ][        ]{004322BE->95 03      }[        ][        ][        ]|0048|VM_POP_CT
VMM_POP CT03(55debcff)
00000032:[        ][        ][        ]{004322C0->3e 08      }[    0008][        ][        ]|0046|VM_PUSHW_IMMB
00000033:[        ][        ][        ]{004322C2->79 03      }[55debcff][        ][        ]|0042|VM_PUSH_CT
00000034:[    bcff][        ][        ]{004322C4->2a         }[        ][        ][        ]|0044|VM_POPW_DX
00000035:[        ][        ][        ]{004322C5->37         }[0012fd28][        ][        ]|0040|VM_PUSH_ESP
00000036:[0012fd28][        ][        ]{004322C6->d6         }[    55de][        ][        ]|0042|VM_MOVW_B_SSA
00000037:[    55de][    55de][    0008]{004322C7->4b         }[de55de00][        ][        ]|0044|VM_SHL
00000038:[        ][        ][        ]{004322C8->3e 08      }[    0008][        ][        ]|0042|VM_PUSHW_IMMB
00000039:[        ][        ][        ]{004322CA->01 03      }[    bcff][        ][        ]|0040|VM_PUSHW_CTW
00000040:[        ][        ][        ]{004322CC->01 03      }[    bcff][        ][        ]|0038|VM_PUSHW_CTW
00000041:[    bcff][    bcff][    0008]{004322CE->4b         }[ffbcff00][        ][        ]|0040|VM_SHL
00000042:[    ff00][        ][        ]{004322CF->2a         }[        ][        ][        ]|0042|VM_POPW_DX
00000043:[        ][        ][        ]{004322D0->37         }[0012fd26][        ][        ]|0038|VM_PUSH_ESP
00000044:[        ][        ][        ]{004322D1->1f 04      }[00000004][        ][        ]|0034|VM_PUSH_IMMB
00000045:[00000004][0012fd26][        ]{004322D3->12         }[0012fd2a][        ][        ]|0038|VM_ADD
00000046:[0012fd2a][        ][        ]{004322D4->d6         }[    de55][        ][        ]|0040|VM_MOVW_B_SSA
00000047:[ffbcde55][        ][        ]{004322D5->d0 03      }[        ][        ][        ]|0044|VM_POP_CT
VMM_BSWAP CT03(55debcff)= ffbcde55
00000048:[de55de00][        ][        ]{004322D7->48         }[        ][        ][        ]|0048|VM_POP_ECX
VMM_POP ECX (de55de00)
00000049:[        ][        ][        ]{004322D8->79 03      }[ffbcde55][        ][        ]|0044|VM_PUSH_CT
00000050:[        ][        ][        ]{004322DA->37         }[0012fd28][        ][        ]|0040|VM_PUSH_ESP
00000051:[0012fd28][        ][        ]{004322DB->61         }[ffbcde55][        ][        ]|0040|VM_MOV_B_SSA
00000052:[ffbcde55][ffbcde55][        ]{004322DC->10         }[004321aa][        ][        ]|0044|VM_NOR
00000053:[004321aa][        ][        ]{004322DD->d0 03      }[        ][        ][        ]|0048|VM_POP_CT
VMM_NOT CT03(ffbcde55)= 004321aa
00000054:[        ][        ][        ]{004322DF->79 06      }[0012fe04][        ][        ]|0044|VM_PUSH_CT
00000055:[        ][        ][        ]{004322E1->79 0b      }[771a3dbf][        ][        ]|0040|VM_PUSH_CT
00000056:[        ][        ][        ]{004322E3->79 04      }[771a3dbf][        ][        ]|0036|VM_PUSH_CT
00000057:[        ][        ][        ]{004322E5->79 07      }[00429500][        ][        ]|0032|VM_PUSH_CT
00000058:[        ][        ][        ]{004322E7->79 06      }[0012fe04][        ][        ]|0028|VM_PUSH_CT
00000059:[        ][        ][        ]{004322E9->79 02      }[00000212][        ][        ]|0024|VM_PUSH_CT
00000060:[        ][        ][        ]{004322EB->79 0d      }[0012fe04][        ][        ]|0020|VM_PUSH_CT
00000061:[        ][        ][        ]{004322ED->79 05      }[cccccccc][        ][        ]|0016|VM_PUSH_CT
00000062:[        ][        ][        ]{004322EF->79 0e      }[7ffde000][        ][        ]|0012|VM_PUSH_CT
00000063:[        ][        ][        ]{004322F1->79 0a      }[00000001][        ][        ]|0008|VM_PUSH_CT
00000064:[        ][        ][        ]{004322F3->79 0c      }[00000000][        ][        ]|0004|VM_PUSH_CT
VMM_PUSH_CT 11(6,B,4,7,6,2,D,5,E,A,C)
00000065:[        ][        ][        ]{004322F5->79 03      }[004321aa][        ][        ]|0000|VM_PUSH_CT
00000066:[        ][        ][        ]{004322F7->1c         }[        ][        ][        ]|0004|VM_JMP
VMM_JMP CT03
同样,我们把伪指令宏摘出来,结果如下:
VMM_POP_CT 11(C,A,E,5,D,2,6,7,4,B,1)
VMM_NOT [esp](2ef761c2)= d1089e3d
VMM_ADD e199c1f4,[esp]( d1089e3d)= b2a26031
VMM_POP CT03(b2a26031)
VMM_SHLD_F CT03(b2a26031),0014h=031b2a26
VMM_POPFW_CT00W
VMM_ADD a70618da, [esp]031b2a26= aa214300
VMM_NOT [esp] aa214300=55debcff
VMM_POP CT03(55debcff)
VMM_BSWAP CT03(55debcff)= ffbcde55
VMM_POP ECX (de55de00)
VMM_NOT CT03(ffbcde55)= 004321aa
VMM_PUSH_CT 11(6,B,4,7,6,2,D,5,E,A,C)
VMM_JMP CT03

    首先我们看一下CT03这个位置,它是VM_Context这个结构的第三个字节,仔细观察发现,它像是个临时寄存器,用于保存中间数据。
    再看一下第二个伪指令宏的输入参数2ef761c2,这是进入虚拟机引擎时,压入栈的第一个参数,我把它成为虚拟机入口参数,(参看第一节的虚拟机框架图示)。可以把它看作是把开启虚拟机引擎的点火器。
    最后看一下最后一句VMM_JMP,它的跳转地址是CT03里面的数据。
    整个伪指令块VMInsBuff_00简单分析一下,可以看出,它完成的就是对入口参数进行一次变换,生成一个地址,以便VMM_JMP调用。如果这个伪指令块看作一个函数,那么它的输入参数就是2ef761c2,返回值是004321aa。所以我猜测,这是个地址解密功能块,它只起到一个控制程序流向的作用,可以视为一个调度功能模块,我把它叫做VMB_dipatcher。
    再看一下第二次进入这个伪指令块的那部分代码,验证了上面的猜测,此时它的输入参数是1ef75ce2,返回值是004322f8。
    这样,我们可以把这两个块也咔嚓掉(我们暂不管它是如何实现解密变换的,因为每次不同的加密都有些不同,只要知道其输入输出就好了),用两个伪指令块助记符分别表示为:
[00000000-00000066]:VMB_dipatcher(2ef761c2)= 004321aa
[00000065-00000065]:VMM_JMP CT03(004321aa)
……
[00000196-00000260]:VMB_dipatcher(1ef75ce2)= 004322f8
[00000261-00000262]:VMM_JMP CT03(004322f8)


二、VMInsBuff_01(cmp和jmp)
    因为我们已经分析了V MInsBuff_00, VMInsBuff_03,只差VMInsBuff_01这个伪指令块了。而我们未识别的代码只有下面这两句没有找到了:
// if(v>50)
00411A53 837D0832       cmp dword ptr [ebp+08], 32   
00411A57 7E0A           jle 00411A63

使用排除法,它们必定隐藏在VMInsBuff_01中。事实上我不是看出来的,是这样猜出来的,因为里面的一些标志位的复杂的逻辑运算我没大看懂。
我们使用同样的伪指令宏替代的方法,来看下这个代码块:
00000067:[00000000][        ][        ]{004321AA->d0 0c      }[        ][        ][        ]|0008|VM_POP_CT
00000068:[00000001][        ][        ]{004321AC->95 0a      }[        ][        ][        ]|0012|VM_POP_CT
00000069:[7ffde000][        ][        ]{004321AE->d0 0e      }[        ][        ][        ]|0016|VM_POP_CT
00000070:[cccccccc][        ][        ]{004321B0->95 05      }[        ][        ][        ]|0020|VM_POP_CT
00000071:[0012fe04][        ][        ]{004321B2->d0 0d      }[        ][        ][        ]|0024|VM_POP_CT
00000072:[00000212][        ][        ]{004321B4->d0 02      }[        ][        ][        ]|0028|VM_POP_CT
00000073:[0012fe04][        ][        ]{004321B6->d0 06      }[        ][        ][        ]|0032|VM_POP_CT
00000074:[00429500][        ][        ]{004321B8->95 07      }[        ][        ][        ]|0036|VM_POP_CT
00000075:[771a3dbf][        ][        ]{004321BA->d0 04      }[        ][        ][        ]|0040|VM_POP_CT
00000076:[771a3dbf][        ][        ]{004321BC->95 0b      }[        ][        ][        ]|0044|VM_POP_CT
00000077:[0012fe04][        ][        ]{004321BE->d0 00      }[        ][        ][        ]|0048|VM_POP_CT
VMM_POP_CT 11(C,A,E,5,D,2,6,7,4,B,0)

00000078:[        ][        ][        ]{004321C0->1f 32      }[00000032][        ][        ]|0044|VM_PUSH_IMMB
VMM_PUSH 00000032
00000079:[        ][        ][        ]{004321C2->79 06      }[0012fe04][        ][        ]|0040|VM_PUSH_CT
00000080:[        ][        ][        ]{004321C4->1f 08      }[00000008][        ][        ]|0036|VM_PUSH_IMMB
00000081:[00000008][0012fe04][        ]{004321C6->12         }[0012fe0c][        ][        ]|0040|VM_ADD
VMM_ADD 08h,CT06(0012fe04)= 0012fe0c
00000082:[0012fe0c][        ][        ]{004321C7->61         }[0000000a][        ][        ]|0040|VM_MOV_B_SSA
VMM_PUSH [CT06+08h](0012fe0c)
00000083:[        ][        ][        ]{004321C8->37         }[0012fd24][        ][        ]|0036|VM_PUSH_ESP
00000084:[0012fd24][        ][        ]{004321C9->61         }[0000000a][        ][        ]|0036|VM_MOV_B_SSA
00000085:[0000000a][0000000a][        ]{004321CA->10         }[fffffff5][        ][        ]|0040|VM_NOR
VMM_NOT [CT06+08H] (0000000a)= fffffff5
00000086:[fffffff5][00000032][        ]{004321CB->b6         }[    0207][00000027][        ]|0042|VM_ADD_F
VMM_SUB 00000032, [CT06+08H](0000000a)=00000027,FLAG=0207
00000087:[        ][        ][        ]{004321CC->4e fbff    }[    fbff][        ][        ]|0040|VM_PUSHW_IMMW
00000088:[        ][        ][        ]{004321CF->01 02      }[    0212][        ][        ]|0038|VM_PUSHW_CTW
00000089:[        ][        ][        ]{004321D1->37         }[0012fd22][        ][        ]|0034|VM_PUSH_ESP
00000090:[0012fd22][        ][        ]{004321D2->d6         }[    0212][        ][        ]|0036|VM_MOVW_B_SSA
00000091:[    0212][    0212][        ]{004321D3->5b         }[    fded][        ][        ]|0038|VM_NORW
00000092:[    fded][    fbff][        ]{004321D4->5b         }[    0000][        ][        ]|0040|VM_NORW
VMM_AND CTW02(0212),0400(DF)=0000;获得原DF标志位
00000093:[    0000][    0207][        ]{004321D5->7d         }[    0207][        ][        ]|0042|VM_ADDW
VMM_ADD 0207,0000=0207
00000094:[    0207][        ][        ]{004321D6->5a 02      }[        ][        ][        ]|0044|VM_POPW_CTW
VMM_POPW_CT02W(0207)
00000095:[        ][        ][        ]{004321D8->37         }[0012fd28][        ][        ]|0040|VM_PUSH_ESP
00000096:[0012fd28][        ][        ]{004321D9->61         }[00000027][        ][        ]|0040|VM_MOV_B_SSA
00000097:[00000027][00000027][        ]{004321DA->c8         }[    0286][ffffffd8][        ]|0042|VM_NOR_F
VMM_NOT [esp](00000027)= ffffffd8,FLAG=0286
00000098:[        ][        ][        ]{004321DB->37         }[0012fd26][        ][        ]|0038|VM_PUSH_ESP
00000099:[0012fd26][        ][        ]{004321DC->d6         }[    0286][        ][        ]|0040|VM_MOVW_B_SSA
00000100:[    0286][    0286][        ]{004321DD->5b         }[    fd79][        ][        ]|0042|VM_NORW
VMM_NOTW W[esp](0286)=fd79
00000101:[        ][        ][        ]{004321DE->4e 0815    }[    0815][        ][        ]|0040|VM_PUSHW_IMMW
00000102:[    0815][    fd79][        ]{004321E1->5b         }[    0282][        ][        ]|0042|VM_NORW
VMM_AND f7ea,286=0282(maskout OF,AF,PF,CF)
00000103:[        ][        ][        ]{004321E2->01 02      }[    0207][        ][        ]|0040|VM_PUSHW_CTW
00000104:[        ][        ][        ]{004321E4->01 02      }[    0207][        ][        ]|0038|VM_PUSHW_CTW
00000105:[    0207][    0207][        ]{004321E6->5b         }[    fdf8][        ][        ]|0040|VM_NORW
00000106:[        ][        ][        ]{004321E7->4e f3ea    }[    f3ea][        ][        ]|0038|VM_PUSHW_IMMW
00000107:[    f3ea][    fdf8][        ]{004321EA->5b         }[    0005][        ][        ]|0040|VM_NORW
VMM_AND 0c15,0207=0005(mask OF,DF,AF,PF,CF)
00000108:[    0005][    0282][        ]{004321EB->7d         }[    0287][        ][        ]|0042|VM_ADDW
VMM_ADD 0005,0282=0287
00000109:[    0287][        ][        ]{004321EC->5a 02      }[        ][        ][        ]|0044|VM_POPW_CTW
VMM_POPW_CT02W(0287);get VMM_SUB flags
00000110:[ffffffd8][        ][        ]{004321EE->48         }[        ][        ][        ]|0048|VM_POP_ECX
VMM_POP_ECX(ffffffd8);for stack balance?

00000111:[        ][        ][        ]{004321EF->8b 3ef75f22}[3ef75f22][        ][        ]|0044|VM_PUSH_IMM
00000112:[        ][        ][        ]{004321F4->8b 1ef75ce2}[1ef75ce2][        ][        ]|0040|VM_PUSH_IMM
VMM_PUSH 3ef75f22;加了密的跳转地址 jmpaddr0
VMM_PUSH 1ef75ce2;加了密的跳转地址jmpaddr1

00000113:[        ][        ][        ]{004321F9->01 02      }[    0287][        ][        ]|0038|VM_PUSHW_CTW
00000114:[        ][        ][        ]{004321FB->01 02      }[    0287][        ][        ]|0036|VM_PUSHW_CTW
00000115:[    0287][    0287][        ]{004321FD->5b         }[    fd78][        ][        ]|0038|VM_NORW
VMM_NOTW CT02W(0287)=fd78
00000116:[        ][        ][        ]{004321FE->4e ff7f    }[    ff7f][        ][        ]|0036|VM_PUSHW_IMMW
00000117:[    ff7f][    fd78][        ]{00432201->b8         }[    0202][    0080][        ]|0036|VM_NORW_F
VMM_AND_F CT02W(0287),0080(SF)=0080;取符号标志位
00000118:[    0202][        ][        ]{00432202->b4 03      }[        ][        ][        ]|0038|VM_POPW_CTB0
VMM_POPW_CT03B0(0202);获取符号标志位时的FLAG
00000119:[    0080][        ][        ]{00432204->2a         }[        ][        ][        ]|0040|VM_POPW_DX
VMM_POPW_DX(0080) ;for stack balance?

00000120:[        ][        ][        ]{00432205->4e f7ff    }[    f7ff][        ][        ]|0038|VM_PUSHW_IMMW
00000121:[        ][        ][        ]{00432208->01 02      }[    0287][        ][        ]|0036|VM_PUSHW_CTW
00000122:[        ][        ][        ]{0043220A->01 02      }[    0287][        ][        ]|0034|VM_PUSHW_CTW
00000123:[    0287][    0287][        ]{0043220C->5b         }[    fd78][        ][        ]|0036|VM_NORW
00000124:[    fd78][    f7ff][        ]{0043220D->b8         }[    0246][    0000][        ]|0036|VM_NORW_F
VMM_ANDW_F 0287,0800(DF)=0000,flag=0246;取方向标志位,
00000125:[    0246][        ][        ]{0043220E->31 03      }[        ][        ][        ]|0038|VM_POPW_CTB1
VMM_POPW_CT03B1(46);获取方向标志位时的FLAG
00000126:[    0000][        ][        ]{00432210->5a 00      }[        ][        ][        ]|0040|VM_POPW_CTW
VMM_POPW_CT00W(0000);保存了方向标志位
  
00000127:[        ][        ][        ]{00432212->ef 03      }[    0002][        ][        ]|0038|VM_PUSHW_CTB0
00000128:[        ][        ][        ]{00432214->cd 03      }[    0046][        ][        ]|0036|VM_PUSHW_CTB1
00000129:[    0046][    0002][        ]{00432216->87         }[    00b9][        ][        ]|0038|VM_NORB
VMM_NORB CT02B0(0002),CT02B1(0046)=00b9
00000130:[        ][        ][        ]{00432217->cd 03      }[    0046][        ][        ]|0036|VM_PUSHW_CTB1
00000131:[        ][        ][        ]{00432219->cd 03      }[    0046][        ][        ]|0034|VM_PUSHW_CTB1
00000132:[    0046][    0046][        ]{0043221B->71         }[    00b9][        ][        ]|0036|VM_NORB
VMM_NOTB CT03B1(0046)=00b9
00000133:[        ][        ][        ]{0043221C->ef 03      }[    0002][        ][        ]|0034|VM_PUSHW_CTB0
00000134:[        ][        ][        ]{0043221E->ef 03      }[    0002][        ][        ]|0032|VM_PUSHW_CTB0
00000135:[    0002][    0002][        ]{00432220->71         }[    00fd][        ][        ]|0034|VM_NORB
VMM_NOTB CT03B0(0002)=00fd
00000136:[    00fd][    00b9][        ]{00432221->71         }[    0002][        ][        ]|0036|VM_NORB
VMM_ANDB CT03B1,CT03B0=0002
00000137:[    0002][    00b9][        ]{00432222->87         }[    0044][        ][        ]|0038|VM_NORB
VMM_XORB CT03B1(46),CT03B0(02)=0044(ZF,PF)
00000138:[        ][        ][        ]{00432223->37         }[0012fd22][        ][        ]|0034|VM_PUSH_ESP
00000139:[0012fd22][        ][        ]{00432224->f8         }[      44][        ][        ]|0036|VM_MOVB_B_SSA
00000140:[    0044][        ][        ]{00432225->b4 03      }[        ][        ][        ]|0038|VM_POPW_CTB0
VMM_MOV CT03B0,[esp](0044)

00000141:[        ][        ][        ]{00432227->37         }[0012fd22][        ][        ]|0034|VM_PUSH_ESP
00000142:[0012fd22][        ][        ]{00432228->f8         }[      44][        ][        ]|0036|VM_MOVB_B_SSA
00000143:[    0044][    0044][        ]{00432229->87         }[    00bb][        ][        ]|0038|VM_NORB
VMM_NOTB B[esp](44)=00bb
00000144:[    00bb][        ][        ]{0043222A->b4 03      }[        ][        ][        ]|0040|VM_POPW_CTB0
VMM_POPW_CT03B0(00bb)

00000145:[        ][        ][        ]{0043222C->01 02      }[    0287][        ][        ]|0038|VM_PUSHW_CTW
00000146:[        ][        ][        ]{0043222E->37         }[0012fd22][        ][        ]|0034|VM_PUSH_ESP
00000147:[0012fd22][        ][        ]{0043222F->d6         }[    0287][        ][        ]|0036|VM_MOVW_B_SSA
00000148:[    0287][    0287][        ]{00432230->5b         }[    fd78][        ][        ]|0038|VM_NORW
VMM_NOT CT02W(0287)=fd78
00000149:[        ][        ][        ]{00432231->4e ffbf    }[    ffbf][        ][        ]|0036|VM_PUSHW_IMMW
00000150:[    ffbf][    fd78][        ]{00432234->b8         }[    0246][    0000][        ]|0036|VM_NORW_F
VMM_AND 0287,0040(PF)=0000;取奇偶标志位,
00000151:[    0246][        ][        ]{00432235->31 03      }[        ][        ][        ]|0038|VM_POPW_CTB1
VMM_POPW_CT03B1(0246) ;取奇偶标志位的flag
00000152:[    0000][        ][        ]{00432237->5a 00      }[        ][        ][        ]|0040|VM_POPW_CTW
VMM_POPW_CT00W(0000);保存奇偶标志位结果到CT00W

00000153:[        ][        ][        ]{00432239->51 bb      }[    00bb][        ][        ]|0038|VM_PUSHW_CTB0
VMM_PUSHW_CT03B0(00bb)
00000154:[        ][        ][        ]{0043223B->37         }[0012fd22][        ][        ]|0034|VM_PUSH_ESP
00000155:[0012fd22][        ][        ]{0043223C->f8         }[      bb][        ][        ]|0036|VM_MOVB_B_SSA
00000156:[    00bb][    00bb][        ]{0043223D->87         }[    0044][        ][        ]|0038|VM_NORB
VMM_NOT CT03B0(00bb)=0044
00000157:[        ][        ][        ]{0043223E->cd 03      }[    0046][        ][        ]|0036|VM_PUSHW_CTB1
00000158:[        ][        ][        ]{00432240->cd 03      }[    0046][        ][        ]|0034|VM_PUSHW_CTB1
00000159:[    0046][    0046][        ]{00432242->71         }[    00b9][        ][        ]|0036|VM_NORB
VMM_NOT CT03B1(0046)=00b9
00000160:[    00b9][    0044][        ]{00432243->87         }[    0002][        ][        ]|0038|VM_NORB
VMM_ANDB CT03B0(00bb),CT03B1(0046)=0002
00000161:[    0002][        ][        ]{00432244->b4 03      }[        ][        ][        ]|0040|VM_POPW_CTB0
VMM_POPW_CT03B0=0002
00000162:[        ][        ][        ]{00432246->4e ffbf    }[    ffbf][        ][        ]|0038|VM_PUSHW_IMMW
00000163:[        ][        ][        ]{00432249->01 03      }[    4602][        ][        ]|0036|VM_PUSHW_CTW
00000164:[        ][        ][        ]{0043224B->01 03      }[    4602][        ][        ]|0034|VM_PUSHW_CTW
00000165:[    4602][    4602][        ]{0043224D->5b         }[    b9fd][        ][        ]|0036|VM_NORW
VMM_NOTW CT03W(4602)=b9fd
00000166:[    b9fd][    ffbf][        ]{0043224E->5b         }[    0000][        ][        ]|0038|VM_NORW
VMM_ANDW CT03W(4602),0040(PF)=0000
00000167:[    0000][        ][        ]{0043224F->5a 03      }[        ][        ][        ]|0040|VM_POPW_CTW
VMM_POPW_CT03W(0000)
00000168:[        ][        ][        ]{00432251->3e 04      }[    0004][        ][        ]|0038|VM_PUSHW_IMMB
00000169:[        ][        ][        ]{00432253->01 03      }[    0000][        ][        ]|0036|VM_PUSHW_CTW
00000170:[      00][      00][    0004]{00432255->44         }[    0000][        ][        ]|0038|VM_SHRW
00000171:[    0000][        ][        ]{00432256->5a 03      }[        ][        ][        ]|0040|VM_POPW_CTW
VMM_SHRW CT03W(0000),0004=0000
00000172:[        ][        ][        ]{00432258->37         }[0012fd24][        ][        ]|0036|VM_PUSH_ESP
00000173:[        ][        ][        ]{00432259->3e 00      }[    0000][        ][        ]|0034|VM_PUSHW_IMMB
00000174:[        ][        ][        ]{0043225B->01 03      }[    0000][        ][        ]|0032|VM_PUSHW_CTW
00000175:[00000000][0012fd24][        ]{0043225D->12         }[0012fd24][        ][        ]|0036|VM_ADD
VMM_ADD esp,(CT03W,0000)= 0012fd24
00000176:[0012fd24][        ][        ]{0043225E->61         }[1ef75ce2][        ][        ]|0036|VM_MOV_B_SSA
VMM_PUSH [esp+CT03W,0000]=VMM_PUSH_SSA(1ef75ce2)
00000177:[1ef75ce2][        ][        ]{0043225F->95 03      }[        ][        ][        ]|0040|VM_POP_CT
VMM_POP_CT03(1ef75ce2)
00000178:[1ef75ce2][        ][        ]{00432261->48         }[        ][        ][        ]|0044|VM_POP_ECX
VMM_POP_ECX(1ef75ce2)
00000179:[3ef75f22][        ][        ]{00432262->d0 00      }[        ][        ][        ]|0048|VM_POP_CT
VMM_POP_CT00(3ef75f22)
00000180:[        ][        ][        ]{00432264->79 03      }[1ef75ce2][        ][        ]|0044|VM_PUSH_CT
VMM_PUSH_CT03(1ef75ce2)
00000181:[        ][        ][        ]{00432266->8b 00432285}[00432285][        ][        ]|0040|VM_PUSH_IMM
00000182:[00432285][        ][        ]{0043226B->d0 04      }[        ][        ][        ]|0044|VM_POP_CT
VMM_MOV CT04, 00432285;VMM_dipather
00000183:[        ][        ][        ]{0043226D->79 06      }[0012fe04][        ][        ]|0040|VM_PUSH_CT
00000184:[        ][        ][        ]{0043226F->79 0b      }[771a3dbf][        ][        ]|0036|VM_PUSH_CT
00000185:[        ][        ][        ]{00432271->79 05      }[cccccccc][        ][        ]|0032|VM_PUSH_CT
00000186:[        ][        ][        ]{00432273->79 0e      }[7ffde000][        ][        ]|0028|VM_PUSH_CT
00000187:[        ][        ][        ]{00432275->79 0a      }[00000001][        ][        ]|0024|VM_PUSH_CT
00000188:[        ][        ][        ]{00432277->79 02      }[00000287][        ][        ]|0020|VM_PUSH_CT
00000189:[        ][        ][        ]{00432279->79 0d      }[0012fe04][        ][        ]|0016|VM_PUSH_CT
00000190:[        ][        ][        ]{0043227B->37         }[0012fd0c][        ][        ]|0012|VM_PUSH_ESP
00000191:[        ][        ][        ]{0043227C->79 07      }[00429500][        ][        ]|0008|VM_PUSH_CT
00000192:[        ][        ][        ]{0043227E->79 06      }[0012fe04][        ][        ]|0004|VM_PUSH_CT
00000193:[        ][        ][        ]{00432280->79 0c      }[00000000][        ][        ]|0000|VM_PUSH_CT
VMM_PUSH_CT 11(6,B,5,E,A,2,D,ESP,7,6,C)

00000194:[        ][        ][        ]{00432282->79 04      }[00432285][        ][        ]|-004|VM_PUSH_CT
00000195:[        ][        ][        ]{00432284->1c         }[        ][        ][        ]|0000|VM_JMP
VMM_JMP CT04(00432285)
    同样把简化完成的伪指令宏摘录出来,结果如下,为便于说明,我给每个宏编了序号:
1        VMM_POP_CT 11(C,A,E,5,D,2,6,7,4,B,0)       
2        VMM_SUB 32, [CT06+08H](0a)=27        ;FLAG=0207
3        VMM_AND CTW02(0212),0400(DF)=0000         ;获得原DF标志位
4        VMM_ADD 0207,0000=0207       
5        VMM_POPW_CT02W(0207)       
6        VMM_NOT [esp](00000027)= ffffffd8        ;FLAG=0286
7        VMM_AND f7ea,286=0282        ;maskout OF,AF,PF,CF
8        VMM_AND 0c15,0207=0005        ;mask OF,DF,AF,PF,CF
9        VMM_POPW_CT02W(0287)        ;get VMM_SUB flags
10        VMM_PUSH 3ef75f22        ;加了密的跳转地址 jmpaddr0
11        VMM_PUSH 1ef75ce2        ;加了密的跳转地址jmpaddr1
12        VMM_AND_F CT02W(0287),0080(SF)=0080         ;取符号标志位
13        VMM_POPW_CT03B0(0202)        ;获取符号标志位时的FLAG
14        VMM_ANDW_F 0287,0800(DF)=0000,flag=0246        ;取方向标志位,
15        VMM_POPW_CT03B1(46)        ;获取方向标志位时的FLAG
16        VMM_POPW_CT00W(0000)         ;保存了方向标志位
17        VMM_XORB CT03B1(46),CT03B0(02)=0044        ;(ZF,PF)
18        VMM_MOV CT03B0,[esp](0044)       
19        VMM_NOTB B[esp](44)=00bb       
20        VMM_POPW_CT03B0(00bb)       
21        VMM_AND 0287,0040(PF)=0000        ;取奇偶标志位,
22        VMM_POPW_CT03B1(0246)         ;取奇偶标志位的flag
23        VMM_POPW_CT00W(0000)        ;保存奇偶标志位结果到CT00W
24        VMM_ANDB CT03B0(00bb),CT03B1(0046)=0002       
25        VMM_POPW_CT03B0=0002       
26        VMM_ANDW CT03W(4602),0040(PF)=0000       
27        VMM_POPW_CT03W(0000)       
28        VMM_SHRW CT03W(0000),0004=0000       
29        VMM_PUSH [esp+CT03W,0000]        ;=VMM_PUSH_SSA(1ef75ce2)
30        VMM_POP_CT03(1ef75ce2)       
31        VMM_POP_ECX(1ef75ce2)       
32        VMM_POP_CT00(3ef75f22)       
33        VMM_PUSH_CT03(1ef75ce2)       
34        VMM_MOV CT04, 00432285;VMB_dispatcher       
35        VMM_PUSH_CT 11(6,B,5,E,A,2,D,ESP,7,6,C)       
36        VMM_JMP CT04(00432285)        ;跳转到VMB_dispatcher
    分析如下:
    1、第2条是SUB 32h,[CT06+08H](0a)完成CMP功能,
    2、3-9条获得CMP的标志位
    3、10条和11条,分别是条件跳转两个分支的地址(加了密的,需使用VMB_dispatcher功能块解密处实际跳转地址)
    4、12条到33条,根据前面生成的CMP标志位,在10和11条的两个地址中二选一,并将该地址压栈。
    5、34-36调用VMB_dispatcher进行地址解密。
    综上分析,可看出这里就是
00411A53 837D0832       cmp dword ptr [ebp+08], 32   
00411A57 7E0A           jle 00411A63

    先看CMP的具体实现,它先使用VMM_SUB宏,然后生成该CMP的标志寄存器(有点复杂,只能看出大体生成方法,细节没搞懂),并保存到CONTEXT里。
    条件跳转的实现,是根据标志位在两个跳转地址中二选一,然后送给地址解密功能块(VMB_dispatcher),再跳到相应伪指令块中。
   在本例,我们的“伪指令记录插件”只能跟踪到进一个分支(bughoho提示),这是tracer的缺点。不过我们已经算是找到cmp和jmp了。如果想爆破,或是想使用插件跟踪到另一分支,控制程序的流向,可使用下面方法:
    1、使用插件运行到VMM_SUB 32h, [CT06+08H](0a)处,修改寄存器的数值,比如修改32h为09h,或修改0ah为33h。
    2、或是直接该跳转地址,将1ef75ce2这个压入栈的数据修改为3ef75f22,就可以了。

三、猜测
    精力和能力有限,我没有跟踪太多的程序,做个猜测,希望大家帮忙验证:
    VMB_dispather这个伪指令块控制程序的流向,通过jmp文件记录通常可以看出程序大致的流向,也基本可以确定哪些伪指令块是完成这个功能的,我想应该是那些最常出现的,位于多个伪指令块之首的那个。也可能是所有的第1,3,5….的伪指令块,也就是说可能每个具体的功能块之前都有这么一个VMB_dispatcher。
    VMB_disaptcher内容不复杂,我跟了几个VMB_dispatcher内容大同小异同,如果真的如上猜测,可能爆破VMProtect就简单了。
2007-12-6 21:55
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
10

    暂告一段落,我这个瓶子里的半瓶水已一滴不剩。没想到会被置顶示众,估计是各节题目比较唬人,恐怕让大家失望了。其实题目有点大,我只看了1.20,1.22,上面的例子也主要都是1.20的,其它版本都没有试。
   多谢那几个帮我占位的朋友,不知会不会有人帮我续写,嘿嘿。后面的计划是学学编程、学学反调试、还有脱壳。发现了论坛上很多好文章,还没来的及学习。
2007-12-6 21:56
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
11
好慢的网速,和爬行差不多。
2007-12-6 21:56
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
12
此楼招租~~
2007-12-7 00:11
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
13
今天搞到这里,争取周末搞完,下周好去深圳玩下。
2007-12-7 00:27
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
看来VMProtect要倒下了!
2007-12-7 08:24
0
雪    币: 203
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
江山代有才人出啊,后生可畏
2007-12-7 08:46
0
雪    币: 1946
活跃值: (243)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
16
巨作啊,此贴必火。估计能赶上softworm那篇。
2007-12-7 08:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
期待更新,继续关注
2007-12-7 09:12
0
雪    币: 1946
活跃值: (243)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
18
堆栈传递参数的概念来自于基于堆栈的虚拟机,wangdell可以看看Ruby、Python和.Net的虚拟机
2007-12-7 09:19
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
19
占  位  !
2007-12-7 09:21
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
20
又一个火星人
2007-12-7 10:35
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
21
搞房地产之前预演一下
2007-12-7 10:39
0
雪    币: 2003
活跃值: (61)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
我跟你混 lol
2007-12-7 16:13
0
雪    币: 10500
活跃值: (2159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
我也占个位置 强贴留我名
2007-12-7 16:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
very good!
2007-12-7 18:17
0
雪    币: 44229
活跃值: (19960)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
25
VMProtect 1.2x倒下来了~
2007-12-7 21:18
0
游客
登录 | 注册 方可回帖
返回
//