【文章标题】: Code Virtualizer虚拟机代码还原
【作者邮箱】: machinesy@gmail.com
【软件名称】: Code Virtualizer
【下载地址】: 自己搜索下载
【加壳方式】: CV
【保护方式】: VM
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  http://bbs.pediy.com/showthread.php?t=124732 blueapplez 的这篇一定读读
  http://bbs.pediy.com/showthread.php?t=121412 理想哥的篇也一定要读读
  如果你读懂了,那么下面的东西就是浮云了。
  
  
  我先写了断汇编代码:
    VIRTUALIZER_START
    invoke GetModuleHandle,NULL
    mov hInstance,eax
    xor eax,eax
    invoke ExitProcess,0
    VIRTUALIZER_END
  然后我下载了CV虚拟机在这里
  Code Virtualizer 1.3.1.0new
  http://www.pediy.com/tools/packers.htm
  
  然后我用这个虚拟机给它加了个壳。
  
  
  CV虚拟机做的相当的单纯,单纯到虚拟机就是虚拟机这样的境界。
  
  EDI-----虚拟机寄存器寄存器
  ESI-----虚拟机EIP寄存器
  
  004052E8    5F              pop     edi
  004052E9    81EF E8524000   sub     edi, 004052E8
  004052EF    8BC7            mov     eax, edi
  004052F1    81C7 00504000   add     edi, 00405000
  004052F7    3B47 2C         cmp     eax, dword ptr [edi+2C]
  
  初使EDI
  
  
  0040532C    8B7424 24       mov     esi, dword ptr [esp+24]
  00405330    8BDE            mov     ebx, esi
  00405332    03F0            add     esi, eax
  00405334    B9 01000000     mov     ecx, 1
  
  
  初始ESI
  
  
  00405340  ^\75 F7           jnz     short 00405339
  00405342    AC              lods    byte ptr [esi]
  00405343    E9 A8090000     jmp     00405CF0
  
  读取第一个字节码,然后解析,然后到VM_Dispatch
  
  004057E0   /E9 64210000     jmp     00407949
  004057E5   |FF2487          jmp     dword ptr [edi+eax*4]            ; GUI.004098A8
  004057E8   |61              popad
  004057E9   |C3              retn
  
  
  VM_Dispatch
  
  
  
  
  VM虚拟机代码如果想看的不清不楚的话,就可以只关系以下一些东西。EDI,ESI,VM_Dispathc,VM_PUBLIC.
  VM_PUBLIC是我自己取的名字,实际上它是一个分界线。每一个VM_HANDLE执行完后,都会先走到VM_PUBLIC,然后再回到VM_Dispatch,
  我们可以使用IDA,直接不停的命名过程函数,找到VM_PUBLIC..其实人肉看,也很容易看出来。我建议使用IDA。
  
  
  我们在VM_Dispatch下段,来看每一个VM_HANDLE的执行流程。如下:
  
  CV虚拟机大多数运算还是依然使用原始ESP,下面我们进入第一个VM_HANDLE
  004098A8    AC              lods    byte ptr [esi]     VM_PLUS_MEMREGADDR
  004098A9    52              push    edx
  004098AA    B6 DB           mov     dh, 0DB
  004098AC    28F0            sub     al, dh
  004098AE    5A              pop     edx
  
  这个HANDLE其实就就是PLUS一个内存里边模拟的寄存器地址到ESP。打个比方说,VM_EAX的内存地址是0x40501c,那么虚拟机的执行过程就是
  先从ESI取出着个地址,然后plus到esp.随后进行下边这个操作
  
  
  
  00405A6D    FF3424          push    dword ptr [esp]                  ; GUI.0040501C  VM_POP_ESP_TOEDX
  00405A70    5A              pop     edx
  00405A71    55              push    ebp
  00405A72    89E5            mov     ebp, esp
  00405A74    81C5 04000000   add     ebp, 4
  00405A7A    81C5 04000000   add     ebp, 4
  00405A80    E9 B30F0000     jmp     00406A38
  00405A85    05 2609D901     add     eax, 1D90926
  
  刚刚plus的那个地址,到EDX
  
  随后进行下边这个操作
  
  00405E70    8F02            pop     dword ptr [edx]  VM_POPDATE to EDX
  00405E72  ^ E9 CBF4FFFF     jmp     00405342
  00405E77    50              push    eax
  00405E78    B8 A64F0972     mov     eax, 72094FA6
  
  弹出一个ESP到EDX。这三句其实就构成了一个真汇编的MOV XXX.
  这三句的是这样的
  
  
  VM_PLUS_MEMREGADDR
  VM_POP_ESP_TOEDX
  VM_POPDATE 
  
  程序一开始就先执行了这样8个这样的流程,就像是在巴pushad的数据全部复制到内存里边的模拟寄存器里。
  
  
  大家脑袋里一定要明确下边这几个概念:
  1.
  EDI-----虚拟机寄存器寄存器
  ESI-----虚拟机EIP寄存器
  2.
  CV的保护没有VM那么强大,十分单纯,很多运算还是直接观察ESP就能得到结论的。所以要使用这Lock ESP,观察ESP。
  3.
  如果你没有必要全部分析清楚的话,你不用去还原每一个VM_HANDLE,直接看ESP,看EDI,ESI你就能明白程序的大概了。
  
  未完待续..........
  
  
  
  
  我刚刚才看到softworm已经说的很清楚了...所以我就不再继续写这个帖子了。慢点我去学习他的。
  
  
  
  
  
  
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2011年02月23日 19:27:51

上传的附件 GUI.zip