下面是菜鸟脱Execryptor2.0.26主程序的脱壳笔记,大牛就不要看了,如果看了请勿嘲笑。呵呵。。只是大体介绍下自己理解的一个简单的VM(也不知道是不是。。)的框架。。。这里的框架是

call VM
VMdata  // 8字节VM需要的数据  --> 被VM掉的数据
....         // 继续原来的代码

这个简单VM的过程:
1. 保存寄存器环境
2. 解密一个DWORD 数据... 这里的最后一个字节作为索引操作指令用..  
3. 解密获取相关的数据
4. 获取操作索引值.. (switch ..case用).. 执行对应的操作
5. 恢复寄存器环境
6. 退出VM。。继续原来的代码..


==> 其实这个壳的这个版本(其他的还未研究到) 还是处理那些  代码乱序。。 代码变形。。 最烦。。 等清到光光后。。最后剩下的有用的就几行代码。。VM的框架和原理也就很容易看出来了(只是这个版本的这个壳)。。。



//***************************************************************************************************************
//
//
//                                VM 虚拟机  ---> call    00517ECB  --> 接在CALL后的是虚拟机解码需要的数据
//
//                                参考文献: ExeCryptor v2.2.6虚拟机不完全分析
//
//*****************************************************************************************************************      


// 这个CALL开始进入虚拟机  ---> 下面代码都是经过处理的。。去掉乱序和变形代码...

00529E63    E8 63E0FEFF     call    00517ECB                         ; 进入虚拟机?
00529E68    68 1EAEC82E     push    2EC8AE1E                         ; 接CALL后的是加密后的数据,虚拟机用到
00529E6D    05 002FE9E2     add     eax, E2E92F00
00529E72    6E              outs    dx, byte ptr es:[edi]
00529E73    FC              cld
00529E74    FFC3            inc     ebx

======================================================================================

// 下面是虚拟机代码... 
//
// 下面的前几行代码保存寄存器当前环境
//
//  edi  --> [53774C]
//  esi  --> [537750]
//  eax  --> [537DE0]
//  ecx  --> [537DF4]
//  edx  --> [537DF8]
//  ebx  --> [537DFC]
//  esp  --> [537E00]
//  ebp  --> [537E04]


00517ECB    9C                        pushfd                                 ;

00517ECC    893D 4C775300         mov     dword ptr [53774C], edi         ; 保存edi
0053EE5D                          pop    edi                              ; 进入虚拟机前的EFLAGS

0053EE5E    8935 50775300         mov     dword ptr [537750], esi         
00541BE9                          pop    esi                              ; call VM的返回地址--> 这里作为传递给VM解码的数据地址

00541BEA    8905 E07D5300         mov     dword ptr [537DE0], eax         ; 保存 eax
00541BF0    890D F47D5300         mov     dword ptr [537DF4], ecx                ; 保存 ecx
    
00541BF6    51                    push    ecx                             ; 
00541BF7                          mov     ecx, 537DF8                     ; 
004F4640    8911                  mov     dword ptr [ecx], edx            ; 保存 edx
00517A59    59                    pop     ecx                             

00517A5A    51                    push    ecx                             
0054EA7B                          mov     ecx, 537DFC                     
0052EEC4    8919                  mov     dword ptr [ecx], ebx            ; 保存 ebx
0052EEC6    59                    pop     ecx     
                        
0052EEC7    89E0                  mov     eax, esp                                
005270D1    53                    push    ebx                             
005270D2                          mov     ebx, 537E00                    
00532272    8903                  mov     dword ptr [ebx], eax            ; 保存 esp
00532274    5B                    pop     ebx                             
00532275    892D 047E5300         mov     dword ptr [537E04], ebp       

============================================================================================
  
00541764                          push    0051135A                        ; Morph instruction


// esi = 00529E68 -- 是接在 00529E63 CALL后面的数据... 所以下面的代码在解密数据...

004F0633    8B06                  mov     eax, dword ptr [esi]        
    
004F0636                          mov     edx, eax                        ; Morph instruction
004F0637    C1C8 10               ror     eax, 10                         
00527E16    66:C1C2 03            rol     dx, 3                           
0051FB9D                          add     edx, 4889224D                   ; Morph instruction
0051FB9E    81F2 A49F1C1F         xor     edx, 1F1C9FA4                   
005531C4    66:33C2               xor     ax, dx-------------------------------------------------------------------------------------------

                 

005531C8                          mov     edx, eax                        ; Morph instruction

005531C9    C1C8 10               ror     eax, 10                         

005531CC    66:C1C2 03            rol     dx, 3                           

00529811    81C2 754DA536         add     edx, 36A54D75                   

0051E97A                          xor     edx, 1D2B587A                   ; Morph instruction

0051E97B    66:33C2               xor     ax, dx      



-------------------------------------------------------------------------------------------

                    

00553AE4                          mov     edx, eax                        ; Morph instruction

00553AE5    C1C8 10               ror     eax, 10                         

00553AE8    66:C1C2 03            rol     dx, 3                           

005306C4                          add     edx, 1410774C                   ; Morph instruction

0052A22C                          xor     edx, 299D9F3E                   ; Morph instruction

004F25ED    66:33C2               xor     ax, dx    

           

-------------------------------------------------------------------------------------------

           

004F25F1                          mov     edx, eax                        ; Morph instruction

004F25F2    C1C8 10               ror     eax, 10                         

004F25F5    66:C1C2 03            rol     dx, 3                           

0053ABE0                          add     edx, 5CB9E32A                   ; Morph instruction

005299DC                          xor     edx, A181E438                   ; Morph instruction

005299DD    66:33C2               xor     ax, dx       



-------------------------------------------------------------------------------------------

                   

005299E1                          mov     edx, edi                        ; Morph instruction



0052F3DE    53                    push    ebx                             

0052F3DF                          mov     ebx, 1                          ; ebx = 1

0052F3F1    84F3                  test    bl, dh                          

0052F3F3    5B                    pop     ebx                             

0053FFA6    0F95C1                setne   cl      

                        

0053FFA9    D3C8                  ror     eax, cl                         

00518139                          and     edx, 000008C1                   ; Morph instruction

004F2479                          or      edx, FFFFF73E                   ; Morph instruction

004F247A    23C2                  and     eax, edx                        



-------------------------------------------------------------------------------------------



004F247D                          mov     edx, eax                        ; Morph instruction

004F247E    C1C8 10               ror     eax, 10                         

004F2481    66:C1C2 03            rol     dx, 3                           

00511730                          add     edx, 51E9F8E2                   ; Morph instruction

00511731    81F2 5AAE07E4         xor     edx, E407AE5A                   

00511737    66:33C2               xor     ax, dx            



-------------------------------------------------------------------------------------------

              

0051AEF5                          mov     edx, eax                        ; Morph instruction

0051AEF6    C1C8 10               ror     eax, 10                         

0051AEF9    66:C1C2 03            rol     dx, 3                           

005225E9                          add     edx, 219A547D                   ; Morph instruction

005458A8                          xor     edx, 01921774                   ; Morph instruction

004ED3A7    66:33C2               xor     ax, dx    



-------------------------------------------------------------------------------------------

                      

004ED3AB                          mov     edx, eax                        ; Morph instruction

004ED3AC    C1C8 10               ror     eax, 10                         

004ED3AF    66:C1C2 03            rol     dx, 3                           

005354C4                          add     edx, F4B28C92                   ; Morph instruction

00516E52                          xor     edx, DBE32FB2                   ; Morph instruction

00516E53    66:33C2               xor     ax, dx     



-------------------------------------------------------------------------------------------

                     

0055093C                          mov     edx, eax                        ; Morph instruction

0055093D    C1C8 10               ror     eax, 10                         

00550940    66:C1C2 03            rol     dx, 3                           

00512DBD                          add     edx, E7E88668                   ; Morph instruction

00546855                          xor     edx, 25EC81D8                   ; Morph instruction

00546856    66:33C2               xor     ax, dx   



-------------------------------------------------------------------------------------------

                       

005313E4                          mov     edx, eax                        ; Morph instruction

005313E5    C1C8 10               ror     eax, 10                         

005313E8    66:C1C2 03            rol     dx, 3                           

00532511                          add     edx, 120EEB2D                   ; Morph instruction

00518D50                          xor     edx, 590B433B                   ; Morph instruction

00518D51    66:33C2               xor     ax, dx    



-------------------------------------------------------------------------------------------

                      

00530561                          mov     edx, eax                        ; Morph instruction

00530562    C1C8 10               ror     eax, 10                         

0052B63D    66:C1C2 03            rol     dx, 3                           

0052ECA7                          add     edx, 1EBB3670                   ; Morph instruction

0053AE1C                          xor     edx, AE63A431                   ; Morph instruction

005218D7    66:33C2               xor     ax, dx      



-------------------------------------------------------------------------------------------

                    

005218DB                          mov     edx, eax                        ; Morph instruction

005218DC    C1C8 10               ror     eax, 10                         

005218DF    66:C1C2 03            rol     dx, 3                           

005177FE                          add     edx, 124CD82C                   ; Morph instruction

005177FF    81F2 E7C3F64D         xor     edx, 4DF6C3E7                   

00517805    66:33C2               xor     ax, dx             



-------------------------------------------------------------------------------------------

             

00517809                          mov     edx, eax                        ; Morph instruction

0051780A    C1C8 10               ror     eax, 10                         

0053D6CB    66:C1C2 03            rol     dx, 3                           

0053D6CF    81C2 DF243CB3         add     edx, B33C24DF                   

0053D6D5    81F2 2B9A1177         xor     edx, 77119A2B                   

0053D6DB    66:33C2               xor     ax, dx      



-------------------------------------------------------------------------------------------

                    

0053FCD8    8BD0                  mov     edx, eax                        

0053FCDA    C1C8 10               ror     eax, 10                         

0053FCDD    66:C1C2 03            rol     dx, 3                           

0051E444                          add     edx, 05B11F3F                   ; Morph instruction

0052B820                          xor     edx, 4F692D35                   ; Morph instruction

0052B821    66:33C2               xor     ax, dx         



-------------------------------------------------------------------------------------------                 



0052DDAE                          mov     edx, eax                        ; Morph instruction

0052DDAF    C1C8 10               ror     eax, 10                         

0052DDB2    66:C1C2 03            rol     dx, 3                           

004EF6E7    81C2 957C6C36         add     edx, 366C7C95                   

004EF6ED    81F2 74802F82         xor     edx, 822F8074                   

004EF6F3    66:33C2               xor     ax, dx       



-------------------------------------------------------------------------------------------

                  

004EF6F7                          mov     edx, eax                        ; Morph instruction

004EF6F8    C1C8 10               ror     eax, 10                         

00527C47    66:C1C2 03            rol     dx, 3                           

00527C4B    81C2 EA29CCB8         add     edx, B8CC29EA                   

0053624E                          xor     edx, 8C7AB3B6                   ; Morph instruction

0053624F    66:33C2               xor     ax, dx         



-------------------------------------------------------------------------------------------

                 

00536253                          mov     edx, eax                        ; Morph instruction

00536254    C1C8 10               ror     eax, 10                         

004F867B    66:C1C2 03            rol     dx, 3                           

0054D15C                          add     edx, B6A422AE                   ; Morph instruction

005193FA                          xor     edx, BAEB5274                   ; Morph instruction

005193FB    66:33C2               xor     ax, dx        



-------------------------------------------------------------------------------------------

                  

00527A95    8BD0                  mov     edx, eax                        

00527A97    C1C8 10               ror     eax, 10                         

00527A9A    66:C1C2 03            rol     dx, 3                           

004F098E                          add     edx, 4B3B50EE                   ; Morph instruction

004F098F    81F2 32EBE83B         xor     edx, 3BE8EB32                   

004F0995    66:33C2               xor     ax, dx           



-------------------------------------------------------------------------------------------

               

0051F2D1    8BD0                  mov     edx, eax                        

0051F2D3    C1C8 10               ror     eax, 10                         

0051F2D6    66:C1C2 03            rol     dx, 3                           

00514315                          add     edx, F0BABDAC                   ; Morph instruction

0052E612                          xor     edx, 8311B436                   ; Morph instruction

0052E613    66:33C2               xor     ax, dx         



-------------------------------------------------------------------------------------------

                 

0052E616    8BD0                  mov     edx, eax                        

0052E618    C1C8 10               ror     eax, 10                         

0052E61B    66:C1C2 03            rol     dx, 3                           

00537262                          add     edx, C58A8C26                   ; Morph instruction

0053F4B2                          xor     edx, 656F399F                   ; Morph instruction

0053F4B3    66:33C2               xor     ax, dx  



-------------------------------------------------------------------------------------------

                      

00539200                          mov     edx, eax                        ; Morph instruction

00541613    C1C8 10               ror     eax, 10                         

00541616    66:C1C2 03            rol     dx, 3                           

0054161A    81C2 2D09A1D0         add     edx, D0A1092D                   

005133F0                          xor     edx, 06320EA3                   ; Morph instruction

005133F1    66:33C2               xor     ax, dx         



-------------------------------------------------------------------------------------------

                 

005133F5                          mov     edx, eax                        ; Morph instruction

00550AE3    C1C8 10               ror     eax, 10                         

00550AE6    66:C1C2 03            rol     dx, 3                           

00550AEA    81C2 047BB65A         add     edx, 5AB67B04                   

00529418                          xor     edx, 5165898E                   ; Morph instruction

00529419    66:33C2               xor     ax, dx      



-------------------------------------------------------------------------------------------

                    

0052941D                          mov     edx, eax                        ; Morph instruction

0052941E    C1C8 10               ror     eax, 10                         

00529421    66:C1C2 03            rol     dx, 3                           

00511599                          add     edx, 8CFFBC82                   ; Morph instruction

0051159A    81F2 3FE6623A         xor     edx, 3A62E63F                   

005115A0    66:33C2               xor     ax, dx        



-------------------------------------------------------------------------------------------

                  

005115A4                          mov     edx, eax                        ; Morph instruction

005115A5    C1C8 10               ror     eax, 10                         

005115A8    66:C1C2 03            rol     dx, 3                           

004ED000    81C2 4612534A         add     edx, 4A531246                   

004ED006    81F2 DB336C52         xor     edx, 526C33DB                   

004ED00C    66:33C2               xor     ax, dx      



-------------------------------------------------------------------------------------------

                    

004ED010                          mov     edx, eax                        ; Morph instruction

004ED011    C1C8 10               ror     eax, 10                         

0053638E    66:C1C2 03            rol     dx, 3                           

00534B46                          add     edx, F2709C42                   ; Morph instruction

0054B76F                          xor     edx, C562285A                   ; Morph instruction

0054B770    66:33C2               xor     ax, dx   



-------------------------------------------------------------------------------------------

                       

005497AA                          mov     edx, eax                        ; Morph instruction

004EDAC1    C1C8 10               ror     eax, 10                         

004EDAC4    66:C1C2 03            rol     dx, 3                           

0051903A                          add     edx, F512087B                   ; Morph instruction

00515E66                          xor     edx, 3DB4864D                   ; Morph instruction

00515E67    66:33C2               xor     ax, dx     



-------------------------------------------------------------------------------------------

                     

0052A8BD                          mov     edx, eax                        ; Morph instruction

0052A8BE    C1C8 10               ror     eax, 10                         

004EE60C    66:C1C2 03            rol     dx, 3                           

005217F0                          add     edx, 5118442F                   ; Morph instruction

0052011A                          xor     edx, 3A3F8FCE                   ; Morph instruction

0052011B    66:33C2               xor     ax, dx           



-------------------------------------------------------------------------------------------

               

0052011E    8BD0                  mov     edx, eax                        

00520120    C1C8 10               ror     eax, 10                         

00548A58    66:C1C2 03            rol     dx, 3                           

00533E68                          add     edx, 9625A089                   ; Morph instruction

0051D4A6                          xor     edx, 30FCCA86                   ; Morph instruction

0051D4A7    66:33C2               xor     ax, dx    



-------------------------------------------------------------------------------------------



                      

00552F9C                          mov     edx, eax                        ; Morph instruction

00552F9D    C1C8 10               ror     eax, 10                         

00552FA0    66:C1C2 03            rol     dx, 3                           

00528AA0                          add     edx, 982AE9F7                   ; Morph instruction

0053242B    81F2 07C81BDC         xor     edx, DC1BC807                   

00532431    66:33C2               xor     ax, dx       



-------------------------------------------------------------------------------------------

                  

00532434    8BD0                  mov     edx, eax                        

00532436    C1C8 10               ror     eax, 10                         

00532439    66:C1C2 03            rol     dx, 3                           

00529AE2                          add     edx, 9D1CB852                   ; Morph instruction

00529AE3    81F2 5B71DE9B         xor     edx, 9BDE715B                   

005152A4    66:33C2               xor     ax, dx        



-------------------------------------------------------------------------------------------

                  

005152A8                          mov     edx, eax                        ; Morph instruction

005152A9    C1C8 10               ror     eax, 10                         

005152AC    66:C1C2 03            rol     dx, 3                           

0051A12C    81C2 966B6B75         add     edx, 756B6B96                   

0051A132    81F2 1C3A3A47         xor     edx, 473A3A1C                   

0051A138    66:33C2               xor     ax, dx       



-------------------------------------------------------------------------------------------

                   

0051A13C                          mov     edx, eax                        ; Morph instruction

0051A13D    C1C8 10               ror     eax, 10                         

0051A140    66:C1C2 03            rol     dx, 3                           

0051A144    81C2 89981061         add     edx, 61109889                   

00547524                          xor     edx, C0D1C3F1                   ; Morph instruction

00547525    66:33C2               xor     ax, dx            



-------------------------------------------------------------------------------------------

              

00547529                          mov     edx, eax                        ; Morph instruction

0052C522    C1C8 10               ror     eax, 10                         

0052C525    66:C1C2 03            rol     dx, 3                           

0052C529    81C2 439E0CA8         add     edx, A80C9E43                   

0052C52F    81F2 A9FDF85F         xor     edx, 5FF8FDA9                   

0052C535    66:33C2               xor     ax, dx  
复制代码===============================================================================================

// 解密完成。。到达下面的代码....   --> 计算结果 eax = 1AA2EC84
//
//
// [51B108]  ---> 存储解密算法计算出来的数值 eax = 1AA2EC84
//
// [51B114]  ---> 解密出来的一个地址 (作为操作数?)
//
//
// esi --> 指向的结构数据定义
//
struct stData
{
        DWORD val1;        // 通过该数值经过解密算法计算出一个数值
        DWORD val2;        // val1 val2  ==> 计算出该次调用VM解析后的 返回地址... (返回到哪里是通过这两个数值计算出来的)
};

stData VMData;

1AA 2EC 84  -> val1 解密出来的数据
2F000 52E   -> val2

==> 52E 2EC (按位组合)

================================================================================================
                        
0052C538    51                    push    ecx                             
0052C539                          mov     ecx, 51B108                     ; ecx = 51B108
004EED0B    8901                  mov     dword ptr [ecx], eax              ; eax = 1AA2EC84 --> 上面解密算法计算出来的数据        
004EED0D    59                    pop     ecx           
004EED0E    0F89 16D70200         jns     0051C42A                        

0051C42A    83C6 04               add     esi, 4                              ; esi --> CALL VM后的数据地址..(那个返回地址)
                     
0051C42D    53                    push    ebx            
005395A9                          mov     ebx, E0000000                  ; ebx = E0000000
0052FCEB    85C3                  test    ebx, eax                          ; eax = 1AA2EC84   --> 解密出来的数值          
0052FCED    5B                    pop     ebx                             

0052FCEE    0F84 FF270000         je      005324F3                            ; 一个分支跳转
                     
005324F3    A9 C0000000           test    eax, 0C0                           
005324F8    0F84 46520000         je      00537744                         ; 一个分支跳转 
0054C6A4    0F85 6D7EFDFF         jnz     00524517                      ; 一个分支跳转 

00524517    8B16                  mov     edx, dword ptr [esi]             ; VMData.val2

===========================================================================================
//
// 下面是计算出 此处VM解析完毕后的 返回地址
    
00524519    C1E8 08               shr     eax, 8                             ; eax = 1AA2EC84  ==> eax = 001AA2EC
0052451C    25 FF0F0000           and     eax, 0FFF                          ; eax = 001AA2EC  ==> eax = 2EC
                     
0053E502                          and     edx, 000FFFFF                 ; edx = 2F00052E  ==> 52E
0053E503    C1E2 0C               shl     edx, 0C                           ; edx = 52E          ==> 52E000              
0053E506    09D0                  or      eax, edx                          ; eax = 52E2EC    ==> 这个是此次 VM 指令 操作数?


0053E508    53                    push    ebx                             
0051995F                          mov     ebx, 51B114                   ; 
00546C35    8903                  mov     dword ptr [ebx], eax          ; eax = 52E2EC 
00546C37    5B                    pop     ebx   
                          
0053BF4D    83C6 04               add     esi, 4                          ; ===> VM执行完返回地址 (被虚拟掉的代码接下去的代码)
              
0053BF50                          mov     eax, 51B108                   ; eax = 51B108  [eax] = 1AA2EC84
0052708D    8B00                  mov     eax, dword ptr [eax]    

=======================================================================================
//
// 下面跟据 1AA2EC84 (前面解密出来的数据) 的最后一个字节判段 此处VM是做什么的--> 对应的x86汇编指令
       
0052708F    A9 80000000           test    eax, 80                        ; 1AA2EC84 --> 最后一个字节是否等于 0x80
00527094    0F84 AA060100         je      00537744                        
0051DB5C    0F85 B63A0300         jnz     00551618            
            
00551618    8D05 18165500         lea     eax, dword ptr [551618]       ; eax = 551618
00537736    8D15 18165500         lea     edx, dword ptr [551618]         
0053773C    29C2                  sub     edx, eax                        
0053773E    0115 14B15100         add     dword ptr [51B114], edx       ;  [51B114] --> 存储 计算出来的一个地址

00537744    C3                    retn                                   ; 返回到 0051135A
                         
0051135A    8B05 08B15100         mov     eax, dword ptr [51B108]       ;  解密算法计算出来的数值 eax = 1AA2EC84
00511360    89C3                  mov     ebx, eax                            

00511362    25 FF000000           and     eax, 0FF                            ; 最后一个字节 eax = 0x84 (VM的opcode..指示对应什么汇编操作)                   
00511367    C1EB 08               shr     ebx, 8                          ; ebx = 1AA2EC84 ==> ebx = 1AA2EC
                    
0054D3EA    56                    push    esi                             
0054D3EB                          mov     esi, 0                        ; VMOpcode == 0 ? (专业术语,不懂....)
004EF056    3BC6                  cmp     eax, esi                        
0055156F    5E                    pop     esi      
                       
00551570    0F85 8FCCFEFF         jnz     0053E205  
                      
0053E205    57                    push    edi                             
0053E206                          mov     edi, 1                        ; VMOpcode == 1 ? 
004F8D95    3BC7                  cmp     eax, edi                        
004F8D97    5F                    pop     edi    
                         
004F8D98    0F85 88AA0100         jnz     00513826  
                      
00513826    56                    push    esi                             
00513800                          mov     esi, 2                        ;  VMOpcode == 2 ? 
0054CE22    3BC6                  cmp     eax, esi                        
0054CE24    5E                    pop     esi             
                
0054CE25    0F85 9379FFFF         jnz     005447BE                        
005447BE    83F8 03               cmp     eax, 3                         ;  VMOpcode == 3 ?         
005447C1    0F85 9BF4FDFF         jnz     00523C62  
                      
0054451D    53                    push    ebx                             
0054451E                          mov     ebx, 4                        ; VMOpcode == 4 ? 
005511AA    3BC3                  cmp     eax, ebx                        
005511AC    5B                    pop     ebx       
                      
005511AD    0F85 6DADFDFF         jnz     0052BF20     
                   
0052BF20    53                    push    ebx                             
0052BF21                          mov     ebx, 5                         ;  VMOpcode == 5 ?
00516917    3BC3                  cmp     eax, ebx                        
004EE4DC    5B                    pop     ebx      
                       
004EE4DD    0F85 82300300         jnz     00521565 
                      
00521565    53                    push    ebx                             
00521566                          mov     ebx, 6                         ; VMOpcode == 6 ? 
0052A71D    3BC3                  cmp     eax, ebx                        
0052A71F    5B                    pop     ebx             
                
0052A720    0F85 2BCBFCFF         jnz     004F7251        
                
004F7251    83F8 07               cmp     eax, 7                          ;  VMOpcode == 7 ?                 
004F7254    0F85 76EE0200         jnz     005260D0      
                  
005260D0    3D C0000000           cmp     eax, 0C0                         ;  VMOpcode == C0 ?       
005260D5    0F85 73550100         jnz     0053B64E   
                     
0053B64E    3D 82000000           cmp     eax, 82                       ;  VMOpcode == 82 ? 
0053B653    0F85 0D99FBFF         jnz     004F4F66        
                
004F4F66    56                    push    esi                             
005347BF                          mov     esi, 44                       ;  VMOpcode == 44 ? 
004F32A0    3BC6                  cmp     eax, esi          
004F32A2    5E                    pop     esi             
                
004F32A3    0F84 7EE20500         je      00551527         
               
0055151C    3D 84000000           cmp     eax, 84                       ;  VMOpcode == 84  --> 此次VM对应的操作...          
00551521    0F85 36F6FEFF         jnz     00540B5D        
                
===============================================================================================
// 
// 此处VM对应的汇编指令 -->  VMOpcode = 0x84  ---> 这里可以看出是汇编指令  <<< push 0052E2EC >>>


00551527    57                    push    edi                             
00551528                          mov     edi, 51B114                     ; edi = 51B114
00535E36    8B3F                  mov     edi, dword ptr [edi]           ; [edi] = 0052E2EC  --> 计算出来的地址 ( VM掉的代码 )
00535E38    873C24                xchg    dword ptr [esp], edi           ; 入栈地址

00535E3B    832D 007E5300 04      sub     dword ptr [537E00], 4            ; [537E00]存储进入VM前的ESP值..  --> 这里减去4.. 入栈操作 esp - 4
       
00535E42                          mov     eax, 537E00                    ; eax = 537E00
00551BB3    8B00                  mov     eax, dword ptr [eax]             ; 入栈后的ESP值...  
        
00551BB5    89C4                  mov     esp, eax                            ; 恢复esp

     
// 以下恢复 VMContext  --> 进入虚拟前的寄存器环境.. --> eax ecx edx ebx ebp esi edi

00551BB7                          mov     eax, 537DE0                     ; eax = 537DE0
00535077    8B00                  mov     eax, dword ptr [eax]            
0051658D                          mov     ecx, 537DF4                     ; ecx = 537DF4
00514490    8B09                  mov     ecx, dword ptr [ecx]            
00514493                          mov     edx, 537DF8                     ; edx = 537DF8
004F0B9A    8B12                  mov     edx, dword ptr [edx]    

004F0B9D                          mov     ebx, 537DFC                     ; ebx = 537DFC
00549ABC    8B1B                  mov     ebx, dword ptr [ebx]            
0051FFFF                          mov     ebp, 537E04                     ; ebp = 537E04
00532CA0    8B6D 00               mov     ebp, dword ptr [ebp]            

// call VM 下的 8个字节是数据是给VM解析代码用的... 前面自己定义的结构 stData

00532CA6                          push    esi                             ; 代码中被VM掉的数据 接下来的数据 --> call VM下来的数据--> +8个字节...

00532CA9    8B35 50775300         mov     esi, dword ptr [537750]         
00514357                          push    edi                             ; 恢复 esi
0051435A                          mov     edi, 53774C                     ;
0052F0C5    8B3F                  mov     edi, dword ptr [edi]            ; 恢复 edi

00540B5C    C3                    retn                                        ;  返回到   call VM下来的数据--> +8个字节...        


==========================================================================
//
//        退出 VM解析代码.... 返回继续原来的代码....
//
00529E70  - E9 E26EFCFF     jmp     004F0D57
00529E75    C3              retn
00529E76    E8 6E170000     call    0052B5E9


=============================================================================
// 
// 所以 nop掉对应的虚拟机代码 --->   push 0052E2EC
//
//
//
00529E63    E8 63E0FEFF     call    00517ECB                         ; 进入虚拟机?
00529E68    90              nop                                      ; 接CALL后的是加密后的数据,虚拟机用到 (这里NOP掉。比较好看)
00529E69    90              nop
00529E6A    90              nop
00529E6B    90              nop
00529E6C    90              nop
00529E6D    90              nop
00529E6E    90              nop
00529E6F    90              nop
00529E70  - E9 E26EFCFF     jmp     004F0D57                            ; 虚拟机处理完毕返回继续..
00529E75    C3              retn