hkfans007 发表于 2010-3-3 10:48

菜鸟玩简单VM--> Execryptor


下面是菜鸟脱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:
00529E73    FC            cld
00529E74    FFC3            inc   ebx

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

// 下面是虚拟机代码...
//
// 下面的前几行代码保存寄存器当前环境
//
//edi-->
//esi-->
//eax-->
//ecx-->
//edx-->
//ebx-->
//esp-->
//ebp-->


00517ECB    9C                        pushfd                                 ;

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

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

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

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

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

00541764                        push    0051135A                        ; Morph instruction


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

004F0633    8B06                  mov   eax, dword ptr       
   
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
//
//
// ---> 存储解密算法计算出来的数值 eax = 1AA2EC84
//
// ---> 解密出来的一个地址 (作为操作数?)
//
//
// 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 , 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              ; 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 , eax          ; eax = 52E2EC
00546C37    5B                  pop   ebx   
                        
0053BF4D    83C6 04               add   esi, 4                        ; ===> VM执行完返回地址 (被虚拟掉的代码接下去的代码)
            
0053BF50                        mov   eax, 51B108                   ; eax = 51B108 = 1AA2EC84
0052708D    8B00                  mov   eax, dword ptr    

=======================================================================================
//
// 下面跟据 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        ; eax = 551618
00537736    8D15 18165500         lea   edx, dword ptr          
0053773C    29C2                  sub   edx, eax                        
0053773E    0115 14B15100         add   dword ptr , edx       ; --> 存储 计算出来的一个地址

00537744    C3                  retn                                 ; 返回到 0051135A
                        
0051135A    8B05 08B15100         mov   eax, dword ptr        ;解密算法计算出来的数值 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          ; = 0052E2EC--> 计算出来的地址 ( VM掉的代码 )
00535E38    873C24                xchg    dword ptr , edi         ; 入栈地址

00535E3B    832D 007E5300 04      sub   dword ptr , 4            ; 存储进入VM前的ESP值..--> 这里减去4.. 入栈操作 esp - 4
      
00535E42                        mov   eax, 537E00                  ; eax = 537E00
00551BB3    8B00                  mov   eax, dword ptr              ; 入栈后的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             
0051658D                        mov   ecx, 537DF4                     ; ecx = 537DF4
00514490    8B09                  mov   ecx, dword ptr             
00514493                        mov   edx, 537DF8                     ; edx = 537DF8
004F0B9A    8B12                  mov   edx, dword ptr    

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

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

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

00532CA9    8B35 50775300         mov   esi, dword ptr          
00514357                        push    edi                           ; 恢复 esi
0051435A                        mov   edi, 53774C                     ;
0052F0C5    8B3F                  mov   edi, dword ptr             ; 恢复 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

蓝雪儿 发表于 2010-3-3 11:03

沙发学习了

CHHSun 发表于 2010-3-3 11:46

感谢LZ发布原创精品文章:victory:

疯子韩 发表于 2010-3-3 12:11

这壳分析的好,虽然我看得不太明白,呵呵,慢慢再看下

Hmily 发表于 2010-3-3 13:24

结构很清晰啊.

waterwood 发表于 2010-3-4 09:41

支持啊 //学习了

李东国 发表于 2010-3-5 06:20

菜鸟也能玩这高级玩意啊?

www137709554 发表于 2010-3-7 21:43

漫漫来看吧。。才学习!

justu 发表于 2010-4-29 18:08

我等菜菜来学习了 ......

firetiger 发表于 2010-4-30 15:03

好好理解下,谢谢
页: [1] 2
查看完整版本: 菜鸟玩简单VM--> Execryptor