菜鸟玩简单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
沙发学习了 感谢LZ发布原创精品文章:victory: 这壳分析的好,虽然我看得不太明白,呵呵,慢慢再看下 结构很清晰啊. 支持啊 //学习了 菜鸟也能玩这高级玩意啊? 漫漫来看吧。。才学习! 我等菜菜来学习了 ...... 好好理解下,谢谢
页:
[1]
2