首页
社区
课程
招聘
[原创]VmProtect.3.9.4分析之虚拟机流程
发表于: 2025-10-4 20:41 5061

[原创]VmProtect.3.9.4分析之虚拟机流程

2025-10-4 20:41
5061

终于到了可以开始分析VmProtect.3.9.4了,像极了玩游戏来到了最终boss环节,我们玩过游戏的都知道,打boss是一件不容易的是请,因为作为整个游戏里最强大的生物,他的血量防御极其高,但是打赢了通关之后还是很有成就感的。要做到能够完全分析他还有很长的一段路要走,从1.6到这个版本只是分析他的一个分支[虚拟化],千里之行始于足下,我们没有办法做到一口气,把全部知识点都消化了,但是我们可以像愚公移山一样,所谓量变引起质变,就是这个意思。

这次给大家的附件依旧没有虚拟机主程序,然后我说下,设置啥的,首先加密的是入口点后面的的下面两行代码,和上篇帖子一样

加密的是0040A5C6 B8 78563412 mov eax,0x123456780040A5CB E9 65AA0000 jmp 123.00415035这两条代码,然后选项那边,把是都改成否,英文版的,yes全改no,其他的都不要动。我们把编译成功的123.vmp.exe拖到OD上

我们可以看到这里又变了,我们之前分析的版本都是开头改成jmp指令,我们单步走往下看,

执行到这里就完成了寄存器入栈和其他初始化操作了,现在我们可以大致分析出来,ebx作用是存放密钥,esp是存放虚拟寄存器基地址,ebp用于存放handler的地址,esi存放伪代码的指针,edi的作用是参与堆栈的读写操作,类似执行真实指令时候的esp。下面就是寄存器入栈后在堆栈上的分布表

我们来看第一条handler

这条handler填充了三个虚拟寄存器,然后第二条要执行的handler地址还是0050AA79,这边我就不再分析了,记录一下填充的虚拟寄存器就行了,分别是,将eflags的值存放到偏移为0x8虚拟寄存器中,将esi的值存放到偏移为0x1c虚拟寄存器中,将ebp的值存放到偏移为0x40虚拟寄存器中,接着第三条要执行的handler地址还是0050AA79,再记录一下填充的虚拟寄存器,分别是,将edx的值存放到偏移为0x3c虚拟寄存器中,将ecx的值存放到偏移为0x20虚拟寄存器中,将eax的值存放到偏移为0xC虚拟寄存器中。到这里所有虚拟寄存器全部填充完毕。这里我制作一个表格记录一下虚拟寄存器的分布图

第四要执行的handler地址是004A5D91,我们接着往下看

上面这条handler就干了一件事,将我们vm的第一条指令的immediate给存放到虚拟寄存器中,我们继续看第五条handler

上面这条handler就做了一件事,将displacement 存放在 19ff70。我们再看第六条handler

上面这条handler就做了一件事,将12345678存放在 0019FF6C。我们再看第七条handler

上面这条handler就做了两件事,将vm_ecx的值存放在19ff68和将vm_edx的值存放在19ff64。我们再看第八条handler ,第八条handler地址还是004D55D9,这边我就不再分析了,记录一下操作, 将vm_ebp的值存放在19ff60和将vm_esi的值存放在19ff5c。我们再看第九条handler ,第九条handler地址还是004D55D9,记录一下操作, 将vm_eflags的值存放在19ff58和将vm_ebx的值存放在19ff54。我们再看第十条handler ,第十条handler地址是 00494549

上面这条handler就干了一件事,将vm_edi的值存放在19ff50 ,我们接着看第十一条handler

到此为止全部代码分析完成了,同时也是VmProtect从低版本到高版本的代码虚拟化分支分析系列全部结束了。

0040A5A8 >  B8 AAAAAAAA     mov eax,0xAAAAAAAA
0040A5AD    BB BBBBBBBB     mov ebx,0xBBBBBBBB
0040A5B2    B9 CCCCCCCC     mov ecx,0xCCCCCCCC
0040A5B7    BA DDDDDDDD     mov edx,0xDDDDDDDD
0040A5BC    BE 51515151     mov esi,0x51515151
0040A5C1    BF D1D1D1D1     mov edi,0xD1D1D1D1
0040A5C6    B8 78563412     mov eax,0x12345678 
0040A5CB    E9 65AA0000     jmp 123.00415035
0040A5D0    C3              retn
0040A5D1    90              nop
0040A5A8 >  B8 AAAAAAAA     mov eax,0xAAAAAAAA
0040A5AD    BB BBBBBBBB     mov ebx,0xBBBBBBBB
0040A5B2    B9 CCCCCCCC     mov ecx,0xCCCCCCCC
0040A5B7    BA DDDDDDDD     mov edx,0xDDDDDDDD
0040A5BC    BE 51515151     mov esi,0x51515151
0040A5C1    BF D1D1D1D1     mov edi,0xD1D1D1D1
0040A5C6    B8 78563412     mov eax,0x12345678 
0040A5CB    E9 65AA0000     jmp 123.00415035
0040A5D0    C3              retn
0040A5D1    90              nop
0040A5C6  |.  57            push edi
0040A5C7  |.  53            push ebx 
0040A5C8  |.  E8 B4AB0B00   call 123_vmp.004C5181
0040A5CD  |.  59            pop ecx        
0040A5CE  \.- FFE5          jmp ebp
0040A5C6  |.  57            push edi
0040A5C7  |.  53            push ebx 
0040A5C8  |.  E8 B4AB0B00   call 123_vmp.004C5181
0040A5CD  |.  59            pop ecx        
0040A5CE  \.- FFE5          jmp ebp
004C5181    9C              pushfd 
004C5182    BF 9C9C823B     mov edi,0x3B829C9C
004C5187    BB 8C0F063D     mov ebx,0x3D060F8C
004C518C    81F3 A36618C2   xor ebx,0xC21866A3
;执行完eflags值变化了
004C5192    8BBC3C 70637DC4 mov edi,dword ptr ss:[esp+edi-0x3B829C90]
;可简化成 mov edi,dword ptr ss:[esp+0xC]
;这里也使用了我一篇帖子讲的dsp加密,这里dsp = 0xc
;执行完edi值又恢复成D1D1D1D1
004C5199    C74424 0C 0895A>mov dword ptr ss:[esp+0xC],0x8BA49508
;执行完 0019FF70存放8BA49508
004C51A1    8B5C24 08       mov ebx,dword ptr ss:[esp+0x8]
;执行完edi值又恢复成BBBBBBBB
004C51A5    E8 3294FFFF     call 123_vmp.004BE5DC
004C5181    9C              pushfd 
004C5182    BF 9C9C823B     mov edi,0x3B829C9C
004C5187    BB 8C0F063D     mov ebx,0x3D060F8C
004C518C    81F3 A36618C2   xor ebx,0xC21866A3
;执行完eflags值变化了
004C5192    8BBC3C 70637DC4 mov edi,dword ptr ss:[esp+edi-0x3B829C90]
;可简化成 mov edi,dword ptr ss:[esp+0xC]
;这里也使用了我一篇帖子讲的dsp加密,这里dsp = 0xc
;执行完edi值又恢复成D1D1D1D1
004C5199    C74424 0C 0895A>mov dword ptr ss:[esp+0xC],0x8BA49508
;执行完 0019FF70存放8BA49508
004C51A1    8B5C24 08       mov ebx,dword ptr ss:[esp+0x8]
;执行完edi值又恢复成BBBBBBBB
004C51A5    E8 3294FFFF     call 123_vmp.004BE5DC
004BE5DC    FF7424 04       push dword ptr ss:[esp+0x4]
;执行完 0019FF5C存放00000246
004BE5E0    9D              popfd
;执行完  eflags值恢复成 0246
004BE5E1    8D6424 10       lea esp,dword ptr ss:[esp+0x10]
;可简化成 add esp,10
004BE5E5    E8 4C7F0300     call 123_vmp.004F6536
004BE5DC    FF7424 04       push dword ptr ss:[esp+0x4]
;执行完 0019FF5C存放00000246
004BE5E0    9D              popfd
;执行完  eflags值恢复成 0246
004BE5E1    8D6424 10       lea esp,dword ptr ss:[esp+0x10]
;可简化成 add esp,10
004BE5E5    E8 4C7F0300     call 123_vmp.004F6536
004F6536  ^\E9 6C6DFEFF     jmp 123_vmp.004DD2A7
004F6536  ^\E9 6C6DFEFF     jmp 123_vmp.004DD2A7
004DD2A7    52              push edx  ;edx入栈
004DD2A8    E8 72250100     call 123_vmp.004EF81F
004DD2A7    52              push edx  ;edx入栈
004DD2A8    E8 72250100     call 123_vmp.004EF81F
004EF81F    896C24 00       mov dword ptr ss:[esp],ebp ;ebp入栈
004EF823  ^ E9 273CFAFF     jmp 123_vmp.0049344F
004EF81F    896C24 00       mov dword ptr ss:[esp],ebp ;ebp入栈
004EF823  ^ E9 273CFAFF     jmp 123_vmp.0049344F
0049344F    E8 85530000     call 123_vmp.004987D9
0049344F    E8 85530000     call 123_vmp.004987D9
004987D9    897424 00       mov dword ptr ss:[esp],esi  ;esi入栈
004987DD    9C              pushfd ;eflags入栈
004987DE    894C24 10       mov dword ptr ss:[esp+0x10],ecx ;ecx入栈
004987E2    BD A9203EC7     mov ebp,0xC73E20A9
004987E7    0FBFD5          movsx edx,bp
004987EA    0FBECA          movsx ecx,dl
004987ED    BD 00000000     mov ebp,0x0
004987F2  ^ E9 AF47FFFF     jmp 123_vmp.0048CFA6
004987D9    897424 00       mov dword ptr ss:[esp],esi  ;esi入栈
004987DD    9C              pushfd ;eflags入栈
004987DE    894C24 10       mov dword ptr ss:[esp+0x10],ecx ;ecx入栈
004987E2    BD A9203EC7     mov ebp,0xC73E20A9
004987E7    0FBFD5          movsx edx,bp
004987EA    0FBECA          movsx ecx,dl
004987ED    BD 00000000     mov ebp,0x0
004987F2  ^ E9 AF47FFFF     jmp 123_vmp.0048CFA6
0048CFA6    53              push ebx   ;ebx入栈
0048CFA7    8BF2            mov esi,edx
0048CFA9  ^ E9 169EFFFF     jmp 123_vmp.00486DC4
0048CFA6    53              push ebx   ;ebx入栈
0048CFA7    8BF2            mov esi,edx
0048CFA9  ^ E9 169EFFFF     jmp 123_vmp.00486DC4
00486DC4    55              push ebp ;relocation(重定位寄存器)入栈
00486DC5    F7D1            not ecx
00486DC7    0FBEDA          movsx ebx,dl
00486DCA    57              push edi  ;edi入栈
00486DCB    8BB454 CEBEFFFF mov esi,dword ptr ss:[esp+edx*2-0x4132]
;可简化成 mov esi,dword ptr ss:[esp+0x20]
00486DD2    8DB41E 5FA00588 lea esi,dword ptr ds:[esi+ebx-0x77FA5FA1]
;执行完 esi = 13AA3510
00486DD9    81F6 1ABD17EC   xor esi,0xEC17BD1A
00486DDF    F7D6            not esi
00486DE1    0FA3C9          bt ecx,ecx
00486DE4    66:2BD3         sub dx,bx
00486DE7    0FBEFB          movsx edi,bl
00486DEA    46              inc esi
00486DEB    66:23FB         and di,bx
00486DEE    0F8C 53360600   jl 123_vmp.004EA447   ;永远跳转
00486DC4    55              push ebp ;relocation(重定位寄存器)入栈
00486DC5    F7D1            not ecx
00486DC7    0FBEDA          movsx ebx,dl
00486DCA    57              push edi  ;edi入栈
00486DCB    8BB454 CEBEFFFF mov esi,dword ptr ss:[esp+edx*2-0x4132]
;可简化成 mov esi,dword ptr ss:[esp+0x20]
00486DD2    8DB41E 5FA00588 lea esi,dword ptr ds:[esi+ebx-0x77FA5FA1]
;执行完 esi = 13AA3510
00486DD9    81F6 1ABD17EC   xor esi,0xEC17BD1A
00486DDF    F7D6            not esi
00486DE1    0FA3C9          bt ecx,ecx
00486DE4    66:2BD3         sub dx,bx
00486DE7    0FBEFB          movsx edi,bl
00486DEA    46              inc esi
00486DEB    66:23FB         and di,bx
00486DEE    0F8C 53360600   jl 123_vmp.004EA447   ;永远跳转
004EA447    13F5            adc esi,ebp
;esi重定位,这里重定位值ebp = 0
004EA449    898454 20BEFFFF mov dword ptr ss:[esp+edx*2-0x41E0],eax
;eax入栈
004EA450    8BFC            mov edi,esp
004EA452    0FB7C2          movzx eax,dx
004EA455    c1e1 b2         shl ecx,0xb2
004EA458  ^ 0F82 E54AFAFF   jb 123_vmp.0048EF43  ;永远不跳
004EA45E    8D9C57 3CBDFFFF lea ebx,dword ptr ds:[edi+edx*2-0x42C4]
;指令可以拆分为,sub edi,C4 和 mov ebx,edi 执行完ebx = 0019FE8C
004EA465    66:0FBAE9 2E    bts cx,0x2E
004EA46A    51              push ecx
004EA46B    8BE3            mov esp,ebx
; ebx 赋值给 esp ,esp = 0019FE8C
004EA46D  ^ E9 6834F9FF     jmp 123_vmp.0047D8DA
004EA447    13F5            adc esi,ebp
;esi重定位,这里重定位值ebp = 0
004EA449    898454 20BEFFFF mov dword ptr ss:[esp+edx*2-0x41E0],eax
;eax入栈
004EA450    8BFC            mov edi,esp
004EA452    0FB7C2          movzx eax,dx
004EA455    c1e1 b2         shl ecx,0xb2
004EA458  ^ 0F82 E54AFAFF   jb 123_vmp.0048EF43  ;永远不跳
004EA45E    8D9C57 3CBDFFFF lea ebx,dword ptr ds:[edi+edx*2-0x42C4]
;指令可以拆分为,sub edi,C4 和 mov ebx,edi 执行完ebx = 0019FE8C
004EA465    66:0FBAE9 2E    bts cx,0x2E
004EA46A    51              push ecx
004EA46B    8BE3            mov esp,ebx
; ebx 赋值给 esp ,esp = 0019FE8C
004EA46D  ^ E9 6834F9FF     jmp 123_vmp.0047D8DA
0047D8DA    BD 3FCD892B     mov ebp,0x2B89CD3F
0047D8DF    8BDE            mov ebx,esi
;将伪代码地址给ebx,ebx存放密钥
0047D8E1    B9 00000000     mov ecx,0x0
0047D8E6    8D94AD 1AB329E2 lea edx,dword ptr ss:[ebp+ebp*4-0x1DD64CE6]
;执行完 edx = BBDAB555
0047D8ED    0FBFC5          movsx eax,bp
0047D8F0    2BD9            sub ebx,ecx ;垃圾指令
0047D8F2    BD BEB1BAF8     mov ebp,0xF8BAB1BE
0047D8F7    0FB7CD          movzx ecx,bp
0047D8FA    8D2D F2D84700   lea ebp,dword ptr ds:[0x47D8F2]
;将代码中的某个地址0047D8F2存放到ebp,参与解密下一条handler
0047D900    22C9            and cl,cl
0047D902    0FB7C1          movzx eax,cx
0047D905    8DB486 0439FDFF lea esi,dword ptr ds:[esi+eax*4-0x2C6FC]
;可简化成 sub esi,4
0047D90C    66:98           cbw
0047D90E    8B940E 424EFFFF mov edx,dword ptr ds:[esi+ecx-0xB1BE]
;可简化成 mov edx,dword ptr ds:[esi]
;从伪代码读取4字节到edx
0047D915    0FBAE0 97       bt eax,0x97
0047D919    33D3            xor edx,ebx
;开始解密handler地址相加数
;值得注意的是这里的密钥ebx的值和上一篇帖子分析3.8.1有一点区别
;首次解密密钥ebx = esi初始值,但是这里的密钥ebx = esi初始值 + 4
;结合后面的分析伪代码是倒着存放的,esi的初始值应该是 当前esi + 4
0047D91B    33C9            xor ecx,ecx
0047D91D    86C8            xchg al,cl
0047D91F    c1c1 cc         rol ecx,0xcc
0047D922    F7DA            neg edx
0047D924    86CD            xchg ch,cl
0047D926  ^ E9 DC29FFFF     jmp 123_vmp.00470307
0047D8DA    BD 3FCD892B     mov ebp,0x2B89CD3F
0047D8DF    8BDE            mov ebx,esi
;将伪代码地址给ebx,ebx存放密钥
0047D8E1    B9 00000000     mov ecx,0x0
0047D8E6    8D94AD 1AB329E2 lea edx,dword ptr ss:[ebp+ebp*4-0x1DD64CE6]
;执行完 edx = BBDAB555
0047D8ED    0FBFC5          movsx eax,bp
0047D8F0    2BD9            sub ebx,ecx ;垃圾指令
0047D8F2    BD BEB1BAF8     mov ebp,0xF8BAB1BE
0047D8F7    0FB7CD          movzx ecx,bp
0047D8FA    8D2D F2D84700   lea ebp,dword ptr ds:[0x47D8F2]
;将代码中的某个地址0047D8F2存放到ebp,参与解密下一条handler
0047D900    22C9            and cl,cl
0047D902    0FB7C1          movzx eax,cx
0047D905    8DB486 0439FDFF lea esi,dword ptr ds:[esi+eax*4-0x2C6FC]
;可简化成 sub esi,4
0047D90C    66:98           cbw
0047D90E    8B940E 424EFFFF mov edx,dword ptr ds:[esi+ecx-0xB1BE]
;可简化成 mov edx,dword ptr ds:[esi]
;从伪代码读取4字节到edx
0047D915    0FBAE0 97       bt eax,0x97
0047D919    33D3            xor edx,ebx
;开始解密handler地址相加数
;值得注意的是这里的密钥ebx的值和上一篇帖子分析3.8.1有一点区别
;首次解密密钥ebx = esi初始值,但是这里的密钥ebx = esi初始值 + 4
;结合后面的分析伪代码是倒着存放的,esi的初始值应该是 当前esi + 4
0047D91B    33C9            xor ecx,ecx
0047D91D    86C8            xchg al,cl
0047D91F    c1c1 cc         rol ecx,0xcc
0047D922    F7DA            neg edx
0047D924    86CD            xchg ch,cl
0047D926  ^ E9 DC29FFFF     jmp 123_vmp.00470307
00470307    42              inc edx
00470308    0FB3C0          btr eax,eax
0047030B    F7D2            not edx
0047030D    49              dec ecx
0047030E    E8 655B0700     call 123_vmp.004E5E78
00470307    42              inc edx
00470308    0FB3C0          btr eax,eax
0047030B    F7D2            not edx
0047030D    49              dec ecx
0047030E    E8 655B0700     call 123_vmp.004E5E78
004E5E78    03C9            add ecx,ecx
004E5E7A    F7DA            neg edx
004E5E7C    0FCA            bswap edx
004E5E7E    c1e8 d1         shr eax,0xd1
004E5E81    F7DA            neg edx        ;解密handler地址相加数完成
004E5E83    F6D8            neg al
004E5E85    0FBAE9 08       bts ecx,0x8
004E5E89    33DA            xor ebx,edx   ;生成新的密钥
004E5E8B    C7840C 42FEE9FF>mov dword ptr ss:[esp+ecx-0x1601BE],0x540F46B2
004E5E96    03EA            add ebp,edx   ;算出下一条handler地址 0050AA79
004E5E98    99              cdq
004E5E99    58              pop eax     
004E5E9A    50              push eax
004E5E9B    89AC04 4EB9F0AB mov dword ptr ss:[esp+eax-0x540F46B2],ebp  
004E5EA2    C3              retn          ;执行下一条handler
004E5E78    03C9            add ecx,ecx
004E5E7A    F7DA            neg edx
004E5E7C    0FCA            bswap edx
004E5E7E    c1e8 d1         shr eax,0xd1
004E5E81    F7DA            neg edx        ;解密handler地址相加数完成
004E5E83    F6D8            neg al
004E5E85    0FBAE9 08       bts ecx,0x8
004E5E89    33DA            xor ebx,edx   ;生成新的密钥
004E5E8B    C7840C 42FEE9FF>mov dword ptr ss:[esp+ecx-0x1601BE],0x540F46B2
004E5E96    03EA            add ebp,edx   ;算出下一条handler地址 0050AA79
004E5E98    99              cdq
004E5E99    58              pop eax     
004E5E9A    50              push eax
004E5E9B    89AC04 4EB9F0AB mov dword ptr ss:[esp+eax-0x540F46B2],ebp  
004E5EA2    C3              retn          ;执行下一条handler
堆栈地址 寄存器值 寄存器名称
0019FF50 D1D1D1D1 edi
0019FF54 00000000 relocation
0019FF58 BBBBBBBB ebx
0019FF5C 00000246 eflags
0019FF60 51515151 esi
0019FF64 0019FF80 ebp
0019FF68 DDDDDDDD edx
0019FF6C CCCCCCCC ecx
0019FF70 AAAAAAAA eax
0050AA79    8B4E FC         mov ecx,dword ptr ds:[esi-0x4]
;这里从 esi - 4 取出4字节给ecx,结合前面0047D919上代码执行时
;ebx的值,我们可以推断伪代码存放顺序是倒着的
0050AA7C    B8 879910BE     mov eax,0xBE109987
0050AA81    0FB6D0          movzx edx,al
0050AA84    33CB            xor ecx,ebx  ;开始解密handler地址相加数
0050AA86    92              xchg eax,edx
0050AA87    F7D1            not ecx
0050AA89    0FB3C2          btr edx,eax
0050AA8C    D1C1            rol ecx,1
0050AA8E    c0e2 e6         shl dl,0xe6
0050AA91    66:c1e2 8c      shl dx,0x8c
0050AA95    c0e0 e3         shl al,0xe3
0050AA98    49              dec ecx
0050AA99    0AC0            or al,al
0050AA9B    F7D9            neg ecx      ;解密handler地址相加数完成
0050AA9D    33D9            xor ebx,ecx  ;生成新的密钥
0050AA9F    03E9            add ebp,ecx  ;算出下一条handler地址 0050AA79
0050AAA1    66:0FA3D2       bt dx,dx
0050AAA5    8B5407 C8       mov edx,dword ptr ds:[edi+eax-0x38]
;从堆栈中取出edi的值
0050AAA9    c1c8 77         ror eax,0x77
0050AAAC    66:13C0         adc ax,ax
0050AAAF    0FB68C06 FB1FFF>movzx ecx,byte ptr ds:[esi+eax-0xE005]
;从伪代码读取1字节到ecx
0050AAB7    32CB            xor cl,bl ;开始解密虚拟寄存器偏移
0050AAB9    98              cwde
0050AABA    D0C1            rol cl,1
0050AABC    F6D9            neg cl
0050AABE    25 14AD1DED     and eax,0xED1DAD14
0050AAC3    80D1 9A         adc cl,0x9A
0050AAC6    D0C9            ror cl,1
0050AAC8    23C0            and eax,eax
0050AACA    80F1 87         xor cl,0x87
0050AACD    FEC9            dec cl     ;解密虚拟寄存器偏移完成
0050AACF    c1f8 2b         sar eax,0x2b
0050AAD2    32D9            xor bl,cl ;生成新的密钥
0050AAD4    0AC4            or al,ah
0050AAD6    c1e0 8b         shl eax,0x8b
0050AAD9    03CC            add ecx,esp
;算出偏移为0x4虚拟寄存器地址
0050AADB    66:0BC0         or ax,ax
0050AADE    891421          mov dword ptr ds:[ecx],edx
;将edi的值存放到偏移为0x4虚拟寄存器中
;这个虚拟寄存器我们叫做vm_edi
0050AAE1    0FBBC0          btc eax,eax
0050AAE4    50              push eax
0050AAE5    c17c24 00 5f    sar dword ptr ss:[esp],0x5f
0050AAEA    8B4427 04       mov eax,dword ptr ds:[edi+0x4]
;从堆栈中取出relocation(重定位值 0)的值到eax
0050AAEE    0FB64E FA       movzx ecx,byte ptr ds:[esi-0x6]
;从伪代码读取1字节到ecx
0050AAF2    32CB            xor cl,bl  ;开始解密虚拟寄存器偏移
0050AAF4    E8 53A1FCFF     call 123_vmp.004D4C4C
0050AA79    8B4E FC         mov ecx,dword ptr ds:[esi-0x4]
;这里从 esi - 4 取出4字节给ecx,结合前面0047D919上代码执行时
;ebx的值,我们可以推断伪代码存放顺序是倒着的
0050AA7C    B8 879910BE     mov eax,0xBE109987
0050AA81    0FB6D0          movzx edx,al
0050AA84    33CB            xor ecx,ebx  ;开始解密handler地址相加数
0050AA86    92              xchg eax,edx
0050AA87    F7D1            not ecx
0050AA89    0FB3C2          btr edx,eax
0050AA8C    D1C1            rol ecx,1
0050AA8E    c0e2 e6         shl dl,0xe6
0050AA91    66:c1e2 8c      shl dx,0x8c
0050AA95    c0e0 e3         shl al,0xe3
0050AA98    49              dec ecx
0050AA99    0AC0            or al,al
0050AA9B    F7D9            neg ecx      ;解密handler地址相加数完成
0050AA9D    33D9            xor ebx,ecx  ;生成新的密钥
0050AA9F    03E9            add ebp,ecx  ;算出下一条handler地址 0050AA79
0050AAA1    66:0FA3D2       bt dx,dx
0050AAA5    8B5407 C8       mov edx,dword ptr ds:[edi+eax-0x38]
;从堆栈中取出edi的值
0050AAA9    c1c8 77         ror eax,0x77
0050AAAC    66:13C0         adc ax,ax
0050AAAF    0FB68C06 FB1FFF>movzx ecx,byte ptr ds:[esi+eax-0xE005]
;从伪代码读取1字节到ecx
0050AAB7    32CB            xor cl,bl ;开始解密虚拟寄存器偏移
0050AAB9    98              cwde
0050AABA    D0C1            rol cl,1
0050AABC    F6D9            neg cl
0050AABE    25 14AD1DED     and eax,0xED1DAD14
0050AAC3    80D1 9A         adc cl,0x9A
0050AAC6    D0C9            ror cl,1
0050AAC8    23C0            and eax,eax
0050AACA    80F1 87         xor cl,0x87
0050AACD    FEC9            dec cl     ;解密虚拟寄存器偏移完成
0050AACF    c1f8 2b         sar eax,0x2b
0050AAD2    32D9            xor bl,cl ;生成新的密钥
0050AAD4    0AC4            or al,ah
0050AAD6    c1e0 8b         shl eax,0x8b
0050AAD9    03CC            add ecx,esp
;算出偏移为0x4虚拟寄存器地址
0050AADB    66:0BC0         or ax,ax
0050AADE    891421          mov dword ptr ds:[ecx],edx
;将edi的值存放到偏移为0x4虚拟寄存器中
;这个虚拟寄存器我们叫做vm_edi
0050AAE1    0FBBC0          btc eax,eax
0050AAE4    50              push eax
0050AAE5    c17c24 00 5f    sar dword ptr ss:[esp],0x5f
0050AAEA    8B4427 04       mov eax,dword ptr ds:[edi+0x4]
;从堆栈中取出relocation(重定位值 0)的值到eax
0050AAEE    0FB64E FA       movzx ecx,byte ptr ds:[esi-0x6]
;从伪代码读取1字节到ecx
0050AAF2    32CB            xor cl,bl  ;开始解密虚拟寄存器偏移
0050AAF4    E8 53A1FCFF     call 123_vmp.004D4C4C
004D4C4C    80C1 3B         add cl,0x3B
004D4C4F    FF4424 04       inc dword ptr ss:[esp+0x4]
004D4C53    D0C1            rol cl,1
004D4C55    66:c14c24 06 6a ror word ptr ss:[esp+0x6],0x6a
004D4C5B    68 178C28B7     push 0xB7288C17
004D4C60    8B5424 00       mov edx,dword ptr ss:[esp]   
004D4C64    80D9 B3         sbb cl,0xB3
004D4C67    D0C1            rol cl,1
004D4C69    875424 04       xchg dword ptr ss:[esp+0x4],edx
;取出上一个执行的call压入的返回地址参与算出下一个代码块的地址
004D4C6D    81C2 3B5CFFFF   add edx,0xFFFF5C3B
004D4C73  - FFE2            jmp edx
;这里在我分析3.0.0讲过这里不是去执行handler
;这个jmp指令起到连接代码作用
004D4C4C    80C1 3B         add cl,0x3B
004D4C4F    FF4424 04       inc dword ptr ss:[esp+0x4]
004D4C53    D0C1            rol cl,1
004D4C55    66:c14c24 06 6a ror word ptr ss:[esp+0x6],0x6a
004D4C5B    68 178C28B7     push 0xB7288C17
004D4C60    8B5424 00       mov edx,dword ptr ss:[esp]   
004D4C64    80D9 B3         sbb cl,0xB3
004D4C67    D0C1            rol cl,1
004D4C69    875424 04       xchg dword ptr ss:[esp+0x4],edx
;取出上一个执行的call压入的返回地址参与算出下一个代码块的地址
004D4C6D    81C2 3B5CFFFF   add edx,0xFFFF5C3B
004D4C73  - FFE2            jmp edx
;这里在我分析3.0.0讲过这里不是去执行handler
;这个jmp指令起到连接代码作用
00500734  ^\E9 2E75FBFF     jmp 123_vmp.004B7C67
00500734  ^\E9 2E75FBFF     jmp 123_vmp.004B7C67
004B7C67    FEC1            inc cl     ;解密虚拟寄存器偏移完成
004B7C69    8B5424 08       mov edx,dword ptr ss:[esp+0x8]
004B7C6D    32D9            xor bl,cl  ;生成新的密钥
004B7C6F    FF4414 01       inc dword ptr ss:[esp+edx+0x1]
004B7C73    E8 0B26FBFF     call 123_vmp.0046A283
004B7C67    FEC1            inc cl     ;解密虚拟寄存器偏移完成
004B7C69    8B5424 08       mov edx,dword ptr ss:[esp+0x8]
004B7C6D    32D9            xor bl,cl  ;生成新的密钥
004B7C6F    FF4414 01       inc dword ptr ss:[esp+edx+0x1]
004B7C73    E8 0B26FBFF     call 123_vmp.0046A283
0046A283    2AD2            sub dl,dl
0046A285    8D4C0C 10       lea ecx,dword ptr ss:[esp+ecx+0x10]
;虽然说esp是虚拟寄存器基地址,但是这里经常执行call指令
;导致esp值变化所以这里的dsp值10也就是平衡前面的堆栈变化
;esp + 0x10 = 0019FE8C,这个值也就是虚拟寄存器基地址
;算出偏移为0x2c虚拟寄存器地址
0046A289    4A              dec edx
0046A28A    135424 06       adc edx,dword ptr ss:[esp+0x6]
0046A28E    1BD2            sbb edx,edx
0046A290    890421          mov dword ptr ds:[ecx],eax
;将relocation的值存放到偏移为0x2c虚拟寄存器中
;这个虚拟寄存器我们叫做vm_relocation
0046A293    0FB64424 0C     movzx eax,byte ptr ss:[esp+0xC]
0046A298    8B5447 08       mov edx,dword ptr ds:[edi+eax*2+0x8]
;从堆栈中取出ebx的值
0046A29C    0F964484 09     setbe byte ptr ss:[esp+eax*4+0x9]
0046A2A1    8D8C00 A6DB0B28 lea ecx,dword ptr ds:[eax+eax+0x280BDBA6]
0046A2A8    8D7C38 0C       lea edi,dword ptr ds:[eax+edi+0xC]
0046A2AC    0FC0C8          xadd al,cl
0046A2AF    898404 5AFFFFFF mov dword ptr ss:[esp+eax-0xA6],eax
0046A2B6    8A8430 53FFFFFF mov al,byte ptr ds:[eax+esi-0xAD]
;从伪代码读取1字节到al
0046A2BD    c1f9 45         sar ecx,0x45
0046A2C0    1B8C8C A984FEFA sbb ecx,dword ptr ss:[esp+ecx*4-0x5017B57]
0046A2C7    59              pop ecx    
0046A2C8    8DB44E ADFEFFFF lea esi,dword ptr ds:[esi+ecx*2-0x153]
;更新esi的值
0046A2CF    c0bc8c 6bfdffff>sar byte ptr ss:[ecx*4+esp-0x295],0x23
0046A2D7    32CD            xor cl,ch
0046A2D9    32C3            xor al,bl ;开始解密虚拟寄存器偏移
0046A2DB    66:D3C9         ror cx,cl
0046A2DE    0f93c1          setae cl
0046A2E1    0f93840c 0568ff>setae byte ptr ss:[ecx+esp+0xffff6805]
0046A2E9    1AC1            sbb al,cl
0046A2EB    66:0FB3C9       btr cx,cx
0046A2EF    49              dec ecx
0046A2F0    c0c1 67         rol cl,0x67
0046A2F3    F6D8            neg al
0046A2F5    2AC1            sub al,cl
0046A2F7    F6D8            neg al   ;解密虚拟寄存器偏移完成
0046A2F9    FEC9            dec cl
0046A2FB    FEC9            dec cl
0046A2FD    51              push ecx
0046A2FE    32D8            xor bl,al   ;生成新的密钥
0046A300    8D4404 10       lea eax,dword ptr ss:[esp+eax+0x10]
;算出偏移为0x38虚拟寄存器地址
0046A304    D3C1            rol ecx,cl
0046A306    D34C24 00       ror dword ptr ss:[esp],cl
0046A30A    0FC04C24 08     xadd byte ptr ss:[esp+0x8],cl
0046A30F    891420          mov dword ptr ds:[eax],edx
;将ebx的值存放到偏移为0x38虚拟寄存器中,这个虚拟寄存器我们叫做vm_ebx
0046A312    81D9 23EAA807   sbb ecx,0x7A8EA23
0046A318    8D9489 BBCB8F2A lea edx,dword ptr ds:[ecx+ecx*4+0x2A8FCBBB]
0046A31F    0F82 A5690300   jb 123_vmp.004A0CCA    ;永远不跳
0046A325    89AC54 0CD978B7 mov dword ptr ss:[esp+edx*2-0x488726F4],ebp 
0046A32C    C2 0C00         retn 0xC ;执行下一条handler
0046A283    2AD2            sub dl,dl
0046A285    8D4C0C 10       lea ecx,dword ptr ss:[esp+ecx+0x10]
;虽然说esp是虚拟寄存器基地址,但是这里经常执行call指令
;导致esp值变化所以这里的dsp值10也就是平衡前面的堆栈变化
;esp + 0x10 = 0019FE8C,这个值也就是虚拟寄存器基地址
;算出偏移为0x2c虚拟寄存器地址
0046A289    4A              dec edx
0046A28A    135424 06       adc edx,dword ptr ss:[esp+0x6]
0046A28E    1BD2            sbb edx,edx
0046A290    890421          mov dword ptr ds:[ecx],eax
;将relocation的值存放到偏移为0x2c虚拟寄存器中
;这个虚拟寄存器我们叫做vm_relocation
0046A293    0FB64424 0C     movzx eax,byte ptr ss:[esp+0xC]
0046A298    8B5447 08       mov edx,dword ptr ds:[edi+eax*2+0x8]
;从堆栈中取出ebx的值
0046A29C    0F964484 09     setbe byte ptr ss:[esp+eax*4+0x9]
0046A2A1    8D8C00 A6DB0B28 lea ecx,dword ptr ds:[eax+eax+0x280BDBA6]
0046A2A8    8D7C38 0C       lea edi,dword ptr ds:[eax+edi+0xC]
0046A2AC    0FC0C8          xadd al,cl
0046A2AF    898404 5AFFFFFF mov dword ptr ss:[esp+eax-0xA6],eax
0046A2B6    8A8430 53FFFFFF mov al,byte ptr ds:[eax+esi-0xAD]
;从伪代码读取1字节到al
0046A2BD    c1f9 45         sar ecx,0x45
0046A2C0    1B8C8C A984FEFA sbb ecx,dword ptr ss:[esp+ecx*4-0x5017B57]
0046A2C7    59              pop ecx    
0046A2C8    8DB44E ADFEFFFF lea esi,dword ptr ds:[esi+ecx*2-0x153]
;更新esi的值
0046A2CF    c0bc8c 6bfdffff>sar byte ptr ss:[ecx*4+esp-0x295],0x23
0046A2D7    32CD            xor cl,ch
0046A2D9    32C3            xor al,bl ;开始解密虚拟寄存器偏移
0046A2DB    66:D3C9         ror cx,cl
0046A2DE    0f93c1          setae cl
0046A2E1    0f93840c 0568ff>setae byte ptr ss:[ecx+esp+0xffff6805]
0046A2E9    1AC1            sbb al,cl
0046A2EB    66:0FB3C9       btr cx,cx
0046A2EF    49              dec ecx
0046A2F0    c0c1 67         rol cl,0x67
0046A2F3    F6D8            neg al
0046A2F5    2AC1            sub al,cl
0046A2F7    F6D8            neg al   ;解密虚拟寄存器偏移完成
0046A2F9    FEC9            dec cl
0046A2FB    FEC9            dec cl
0046A2FD    51              push ecx
0046A2FE    32D8            xor bl,al   ;生成新的密钥
0046A300    8D4404 10       lea eax,dword ptr ss:[esp+eax+0x10]
;算出偏移为0x38虚拟寄存器地址
0046A304    D3C1            rol ecx,cl
0046A306    D34C24 00       ror dword ptr ss:[esp],cl
0046A30A    0FC04C24 08     xadd byte ptr ss:[esp+0x8],cl
0046A30F    891420          mov dword ptr ds:[eax],edx
;将ebx的值存放到偏移为0x38虚拟寄存器中,这个虚拟寄存器我们叫做vm_ebx
0046A312    81D9 23EAA807   sbb ecx,0x7A8EA23
0046A318    8D9489 BBCB8F2A lea edx,dword ptr ds:[ecx+ecx*4+0x2A8FCBBB]
0046A31F    0F82 A5690300   jb 123_vmp.004A0CCA    ;永远不跳
0046A325    89AC54 0CD978B7 mov dword ptr ss:[esp+edx*2-0x488726F4],ebp 
0046A32C    C2 0C00         retn 0xC ;执行下一条handler
堆栈地址 虚拟寄存器 虚拟寄存器 虚拟寄存器 虚拟寄存器
19fe8c 未占用 edi eflags eax
19fe9c 未占用 未占用 未占用 esi
19feac ecx 未占用 未占用 vm_relocation
19febc 未占用 未占用 ebx edx
19fecc ebp 未占用 未占用 未占用
004A5D91    8B4E FC         mov ecx,dword ptr ds:[esi-0x4]
;从伪代码读取4字节到ecx
004A5D94    B8 A97FAEBA     mov eax,0xBAAE7FA9
004A5D99    0FB7D0          movzx edx,ax
004A5D9C    0FC0E0          xadd al,ah
004A5D9F    33CB            xor ecx,ebx
;开始解密我们vm的第一条指令中immediate,也就是12345678
004A5DA1    E9 CB560000     jmp 123_vmp.004AB471
004A5D91    8B4E FC         mov ecx,dword ptr ds:[esi-0x4]
;从伪代码读取4字节到ecx
004A5D94    B8 A97FAEBA     mov eax,0xBAAE7FA9
004A5D99    0FB7D0          movzx edx,ax
004A5D9C    0FC0E0          xadd al,ah
004A5D9F    33CB            xor ecx,ebx
;开始解密我们vm的第一条指令中immediate,也就是12345678
004A5DA1    E9 CB560000     jmp 123_vmp.004AB471
004AB471    c0fa c2         sar dl,0xc2
004AB474    C1C9 02         ror ecx,0x2
004AB477    FEC8            dec al
004AB479    0AC2            or al,dl
004AB47B    0FC9            bswap ecx
004AB47D    41              inc ecx
004AB47E    D1C1            rol ecx,1 ;解密immediate完成
004AB480    2AC4            sub al,ah
004AB482    33D9            xor ebx,ecx  ;生成新的密钥
004AB484    898C17 1280FFFF mov dword ptr ds:[edi+edx-0x7FEE],ecx
;将immediate存放在 0019FF70
004AB48B    E8 DD38FFFF     call 123_vmp.0049ED6D
004AB471    c0fa c2         sar dl,0xc2
004AB474    C1C9 02         ror ecx,0x2
004AB477    FEC8            dec al
004AB479    0AC2            or al,dl
004AB47B    0FC9            bswap ecx
004AB47D    41              inc ecx
004AB47E    D1C1            rol ecx,1 ;解密immediate完成
004AB480    2AC4            sub al,ah
004AB482    33D9            xor ebx,ecx  ;生成新的密钥
004AB484    898C17 1280FFFF mov dword ptr ds:[edi+edx-0x7FEE],ecx
;将immediate存放在 0019FF70
004AB48B    E8 DD38FFFF     call 123_vmp.0049ED6D
0049ED6D    58              pop eax     
0049ED6E    05 364FFBFF     add eax,0xFFFB4F36
0049ED73  - FFE0            jmp eax ;下一个代码块地址为 004603C6
0049ED6D    58              pop eax     
0049ED6E    05 364FFBFF     add eax,0xFFFB4F36
0049ED73  - FFE0            jmp eax ;下一个代码块地址为 004603C6
004603C6    8B8C16 0E80FFFF mov ecx,dword ptr ds:[esi+edx-0x7FF2]
;从伪代码读取4字节到ecx
004603CD    0FB6C2          movzx eax,dl
004603D0    0FABC2          bts edx,eax  
004603D3    13C0            adc eax,eax  
004603D5    33CB            xor ecx,ebx ;开始解密handler地址相加数
004603D7    66:c1ea e8      shr dx,0xe8
004603DB    8D84C2 005E9AFA lea eax,dword ptr ds:[edx+eax*8-0x565A200]
004603E2    F7D1            not ecx
004603E4    1BD0            sbb edx,eax  
004603E6    c1c8 d0         ror eax,0xd0
004603E9    E8 BAED0A00     call 123_vmp.0050F1A8
004603C6    8B8C16 0E80FFFF mov ecx,dword ptr ds:[esi+edx-0x7FF2]
;从伪代码读取4字节到ecx
004603CD    0FB6C2          movzx eax,dl
004603D0    0FABC2          bts edx,eax  
004603D3    13C0            adc eax,eax  
004603D5    33CB            xor ecx,ebx ;开始解密handler地址相加数
004603D7    66:c1ea e8      shr dx,0xe8
004603DB    8D84C2 005E9AFA lea eax,dword ptr ds:[edx+eax*8-0x565A200]
004603E2    F7D1            not ecx
004603E4    1BD0            sbb edx,eax  
004603E6    c1c8 d0         ror eax,0xd0
004603E9    E8 BAED0A00     call 123_vmp.0050F1A8
0050F1A8    D1C1            rol ecx,1
0050F1AA    58              pop eax        
0050F1AB    05 4C5D0000     add eax,0x5D4C
0050F1B0  - FFE0            jmp eax ;下一个代码块地址为 0046613A
0050F1A8    D1C1            rol ecx,1
0050F1AA    58              pop eax        
0050F1AB    05 4C5D0000     add eax,0x5D4C
0050F1B0  - FFE0            jmp eax ;下一个代码块地址为 0046613A
0046613A    8D9492 3F98159E lea edx,dword ptr ds:[edx+edx*4-0x61EA67C1]
00466141    c1c2 db         rol edx,0xdb
00466144    49              dec ecx
00466145    8BC2            mov eax,edx
00466147    F7D9            neg ecx      ;解密handler地址相加数完成
00466149    66:33D2         xor dx,dx
0046614C    0FBAFA 16       btc edx,0x16
00466150    33D9            xor ebx,ecx  ;生成新的密钥
00466152    80EA 8B         sub dl,0x8B
00466155    03E9            add ebp,ecx  ;算出下一条handler地址 004D24DD
00466157    E8 D5B30000     call 123_vmp.00471531
0046613A    8D9492 3F98159E lea edx,dword ptr ds:[edx+edx*4-0x61EA67C1]
00466141    c1c2 db         rol edx,0xdb
00466144    49              dec ecx
00466145    8BC2            mov eax,edx
00466147    F7D9            neg ecx      ;解密handler地址相加数完成
00466149    66:33D2         xor dx,dx
0046614C    0FBAFA 16       btc edx,0x16
00466150    33D9            xor ebx,ecx  ;生成新的密钥
00466152    80EA 8B         sub dl,0x8B
00466155    03E9            add ebp,ecx  ;算出下一条handler地址 004D24DD
00466157    E8 D5B30000     call 123_vmp.00471531
00471531    5A              pop edx                   
00471532    81C2 3693FEFF   add edx,0xFFFE9336
00471538  - FFE2            jmp edx ;下一个代码块地址为 0044F492
00471531    5A              pop edx                   
00471532    81C2 3693FEFF   add edx,0xFFFE9336
00471538  - FFE2            jmp edx ;下一个代码块地址为 0044F492
0044F492    0FBFC8          movsx ecx,ax
0044F495    8B4C27 FC       mov ecx,dword ptr ds:[edi-0x4]
;取出immediate存放在ecx
0044F499    0FB64426 F7     movzx eax,byte ptr ds:[esi-0x9]
;从伪代码读取1字节到eax
0044F49E    BA 3C25BCAF     mov edx,0xAFBC253C
0044F4A3    F6D2            not dl
0044F4A5    66:c1f2 8f      sal dx,0x8f
0044F4A9    83D6 F6         adc esi,-0xA ;更新esi的值
0044F4AC    E9 C3060800     jmp 123_vmp.004CFB74
0044F492    0FBFC8          movsx ecx,ax
0044F495    8B4C27 FC       mov ecx,dword ptr ds:[edi-0x4]
;取出immediate存放在ecx
0044F499    0FB64426 F7     movzx eax,byte ptr ds:[esi-0x9]
;从伪代码读取1字节到eax
0044F49E    BA 3C25BCAF     mov edx,0xAFBC253C
0044F4A3    F6D2            not dl
0044F4A5    66:c1f2 8f      sal dx,0x8f
0044F4A9    83D6 F6         adc esi,-0xA ;更新esi的值
0044F4AC    E9 C3060800     jmp 123_vmp.004CFB74
004CFB74    32C3            xor al,bl ;开始解密虚拟寄存器偏移
004CFB76    FEC0            inc al
004CFB78    52              push edx
004CFB79    66:0B5424 01    or dx,word ptr ss:[esp+0x1]
004CFB7E    5A              pop edx
004CFB7F    D0C0            rol al,1
004CFB81    32D6            xor dl,dh
004CFB83    FEC0            inc al
004CFB85    FECA            dec dl
004CFB87    23D2            and edx,edx
004CFB89    c1ea 42         shr edx,0x42
004CFB8C    F6D8            neg al
004CFB8E    0FBAE2 9C       bt edx,0x9C
004CFB92    1C 37           sbb al,0x37
004CFB94    0FA3D2          bt edx,edx
004CFB97    F6D8            neg al
004CFB99    8D94D2 2221380C lea edx,dword ptr ds:[edx+edx*8+0xC382122]
004CFBA0    c0f2 42         sal dl,0x42
004CFBA3    D0C0            rol al,1
004CFBA5    66:F7DA         neg dx
004CFBA8    F6DA            neg dl
004CFBAA    FEC8            dec al
004CFBAC    81F2 155AB82D   xor edx,0x2DB85A15
004CFBB2    4A              dec edx
004CFBB3    F6D8            neg al
004CFBB5    0AD6            or dl,dh
004CFBB7    F6D2            not dl
004CFBB9    c0c2 27         rol dl,0x27
004CFBBC    D0C8            ror al,1
004CFBBE    66:c1ca 69      ror dx,0x69
004CFBC2    FEC0            inc al
004CFBC4    8D9412 919A9CE3 lea edx,dword ptr ds:[edx+edx-0x1C63656F]
004CFBCB    34 B8           xor al,0xB8   ;解密虚拟寄存器偏移完成
004CFBCD    E8 6EF5FEFF     call 123_vmp.004BF140
004CFB74    32C3            xor al,bl ;开始解密虚拟寄存器偏移
004CFB76    FEC0            inc al
004CFB78    52              push edx
004CFB79    66:0B5424 01    or dx,word ptr ss:[esp+0x1]
004CFB7E    5A              pop edx
004CFB7F    D0C0            rol al,1
004CFB81    32D6            xor dl,dh
004CFB83    FEC0            inc al
004CFB85    FECA            dec dl
004CFB87    23D2            and edx,edx
004CFB89    c1ea 42         shr edx,0x42
004CFB8C    F6D8            neg al
004CFB8E    0FBAE2 9C       bt edx,0x9C
004CFB92    1C 37           sbb al,0x37
004CFB94    0FA3D2          bt edx,edx
004CFB97    F6D8            neg al
004CFB99    8D94D2 2221380C lea edx,dword ptr ds:[edx+edx*8+0xC382122]
004CFBA0    c0f2 42         sal dl,0x42
004CFBA3    D0C0            rol al,1
004CFBA5    66:F7DA         neg dx
004CFBA8    F6DA            neg dl
004CFBAA    FEC8            dec al
004CFBAC    81F2 155AB82D   xor edx,0x2DB85A15
004CFBB2    4A              dec edx
004CFBB3    F6D8            neg al
004CFBB5    0AD6            or dl,dh
004CFBB7    F6D2            not dl
004CFBB9    c0c2 27         rol dl,0x27
004CFBBC    D0C8            ror al,1
004CFBBE    66:c1ca 69      ror dx,0x69
004CFBC2    FEC0            inc al
004CFBC4    8D9412 919A9CE3 lea edx,dword ptr ds:[edx+edx-0x1C63656F]
004CFBCB    34 B8           xor al,0xB8   ;解密虚拟寄存器偏移完成
004CFBCD    E8 6EF5FEFF     call 123_vmp.004BF140
004BF140    c1f2 3c         sal edx,0x3c
004BF143    32D8            xor bl,al  ;生成新的密钥
004BF145    0FB3D2          btr edx,edx
004BF148    8D4404 04       lea eax,dword ptr ss:[esp+eax+0x4]
;算出偏移为0x10虚拟寄存器地址
004BF14C    C78414 00000090>mov dword ptr ss:[esp+edx-0x70000000],0xBEAA0B07
004BF157    8D1455 B4FD3F97 lea edx,dword ptr ds:[edx*2-0x68C0024C]
004BF15E    898C10 4C02C088 mov dword ptr ds:[eax+edx-0x773FFDB4],ecx
;将immediate的值存放到偏移为0x10虚拟寄存器中,这个虚拟寄存器参与还原我们vm的第一条指令
004BF165    0FB7CA          movzx ecx,dx
004BF168    89AC14 4C02C088 mov dword ptr ss:[esp+edx-0x773FFDB4],ebp 
004BF16F    C3              retn   ;执行下一条handler 004D24DD
004BF140    c1f2 3c         sal edx,0x3c
004BF143    32D8            xor bl,al  ;生成新的密钥
004BF145    0FB3D2          btr edx,edx
004BF148    8D4404 04       lea eax,dword ptr ss:[esp+eax+0x4]
;算出偏移为0x10虚拟寄存器地址
004BF14C    C78414 00000090>mov dword ptr ss:[esp+edx-0x70000000],0xBEAA0B07
004BF157    8D1455 B4FD3F97 lea edx,dword ptr ds:[edx*2-0x68C0024C]
004BF15E    898C10 4C02C088 mov dword ptr ds:[eax+edx-0x773FFDB4],ecx
;将immediate的值存放到偏移为0x10虚拟寄存器中,这个虚拟寄存器参与还原我们vm的第一条指令
004BF165    0FB7CA          movzx ecx,dx
004BF168    89AC14 4C02C088 mov dword ptr ss:[esp+edx-0x773FFDB4],ebp 
004BF16F    C3              retn   ;执行下一条handler 004D24DD
004D24DD    B9 BD5E15C1     mov ecx,0xC1155EBD
004D24E2    E8 F73CF9FF     call 123_vmp.004661DE
004D24DD    B9 BD5E15C1     mov ecx,0xC1155EBD
004D24E2    E8 F73CF9FF     call 123_vmp.004661DE
004661DE    8D048D A43E85C5 lea eax,dword ptr ds:[ecx*4-0x3A7AC15C]
004661E5    81EE 04000000   sub esi,0x4 ;更新esi的值
004661EB    98              cwde
004661EC    BA 98679C71     mov edx,0x719C6798
004661F1    C78414 6898638E>mov dword ptr ss:[esp+edx-0x719C6798],0x840A4532
004661FC    8B8416 6898638E mov eax,dword ptr ds:[esi+edx-0x719C6798]
;从伪代码读取4字节到eax
00466203    49              dec ecx
00466204    33C3            xor eax,ebx
;开始解密第二条vm的指令的displacement部分也就jmp后面的地址00415035
00466206    C1C8 02         ror eax,0x2
00466209    66:899414 68986>mov word ptr ss:[esp+edx-0x719C6798],dx
00466211    59              pop ecx      
00466212    66:0FA3D2       bt dx,dx
00466216    0FC8            bswap eax
00466218    81F1 343F0D02   xor ecx,0x20D3F34
0046621E    0F93C1          setnb cl
00466221    40              inc eax
00466222    D3F1            sal ecx,cl
00466224    D1C0            rol eax,1 ;解密displacement完成
00466226    33D8            xor ebx,eax  ;生成新的密钥
00466228    8DBC39 FA4FF1F3 lea edi,dword ptr ds:[ecx+edi-0xC0EB006]
0046622F    8984CF F07F8A9F mov dword ptr ds:[edi+ecx*8-0x60758010],eax
;将displacement 存放在 19ff70
00466236    8DB44E F89FE2E7 lea esi,dword ptr ds:[esi+ecx*2-0x181D6008]
;更新esi的值
0046623D    D3F2            sal edx,cl
0046623F    8B8C4E FC9FE2E7 mov ecx,dword ptr ds:[esi+ecx*2-0x181D6004]
;从伪代码读取4字节到ecx
00466246    8D8492 913921BA lea eax,dword ptr ds:[edx+edx*4-0x45DEC66F]
0046624D    66:c1f8 4f      sar ax,0x4f
00466251    33CB            xor ecx,ebx ;开始解密handler地址相加数
00466253    C1C1 03         rol ecx,0x3
00466256    F7D2            not edx               
00466258    66:0FBBC2       btc dx,ax
0046625C    49              dec ecx
0046625D    E9 A4330A00     jmp 123_vmp.00509606
004661DE    8D048D A43E85C5 lea eax,dword ptr ds:[ecx*4-0x3A7AC15C]
004661E5    81EE 04000000   sub esi,0x4 ;更新esi的值
004661EB    98              cwde
004661EC    BA 98679C71     mov edx,0x719C6798
004661F1    C78414 6898638E>mov dword ptr ss:[esp+edx-0x719C6798],0x840A4532
004661FC    8B8416 6898638E mov eax,dword ptr ds:[esi+edx-0x719C6798]
;从伪代码读取4字节到eax
00466203    49              dec ecx
00466204    33C3            xor eax,ebx
;开始解密第二条vm的指令的displacement部分也就jmp后面的地址00415035
00466206    C1C8 02         ror eax,0x2
00466209    66:899414 68986>mov word ptr ss:[esp+edx-0x719C6798],dx
00466211    59              pop ecx      
00466212    66:0FA3D2       bt dx,dx
00466216    0FC8            bswap eax
00466218    81F1 343F0D02   xor ecx,0x20D3F34
0046621E    0F93C1          setnb cl
00466221    40              inc eax
00466222    D3F1            sal ecx,cl
00466224    D1C0            rol eax,1 ;解密displacement完成
00466226    33D8            xor ebx,eax  ;生成新的密钥
00466228    8DBC39 FA4FF1F3 lea edi,dword ptr ds:[ecx+edi-0xC0EB006]
0046622F    8984CF F07F8A9F mov dword ptr ds:[edi+ecx*8-0x60758010],eax
;将displacement 存放在 19ff70

[培训]传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 112
支持
分享
最新回复 (56)
雪    币: 153
活跃值: (1003)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你的分享对大家帮助很大,非常感谢!
2025-10-4 20:56
0
雪    币: 58
活跃值: (180)
能力值: ( LV2,RANK:19 )
在线值:
发帖
回帖
粉丝
3
看看你的分享
2025-10-4 21:41
0
雪    币: 31
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2025-10-4 23:00
0
雪    币: 221
活跃值: (3106)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
非常感谢! 
2025-10-4 23:05
0
雪    币: 5615
活跃值: (6855)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
既然都分析了,是否可以送佛送到西写一个IDA插件来简化大家以后分析vmp时的痛苦及验证分析的全面可靠性。
2025-10-5 05:05
1
雪    币: 477
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
感谢你的贡献,论坛因你而更加精彩!
2025-10-5 06:51
0
雪    币: 491
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
2025-10-5 11:17
1
雪    币: 1762
活跃值: (1205)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
感谢
2025-10-5 15:05
0
雪    币: 16460
活跃值: (4925)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢分享。
2025-10-5 19:53
0
雪    币: 206
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
thanks
2025-10-6 01:04
0
雪    币: 144
活跃值: (1518)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
thanks
2025-10-6 01:08
0
雪    币: 13711
活跃值: (5893)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
thanks
2025-10-6 20:44
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
thanks
2025-10-6 22:40
0
雪    币: 550
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
thanks
2025-10-7 21:16
0
雪    币: 6
活跃值: (2058)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
666
2025-10-7 22:56
0
雪    币: 13
活跃值: (2712)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
thank you
2025-10-8 10:02
0
雪    币: 2313
活跃值: (4440)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
666
2025-10-8 12:56
0
雪    币: 337
活跃值: (4465)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
感谢分享
2025-10-8 14:39
0
雪    币: 1272
活跃值: (6663)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
20
1
2025-10-9 09:16
0
雪    币: 397
活跃值: (2718)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
感谢分享
2025-10-9 11:34
0
雪    币: 1583
活跃值: (1972)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
感谢分享
2025-10-9 17:01
0
雪    币: 1858
活跃值: (930)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
23
感谢分享
2025-10-10 10:08
0
雪    币: 290
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
666666
2025-10-10 17:38
0
雪    币: 6079
活跃值: (3005)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
感谢分享
2025-10-10 18:12
0
游客
登录 | 注册 方可回帖
返回