Qq: 2746074413 微信:vmp520888个人空间 75bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6M7r3q4U0k6g2)9J5k6h3u0A6L8r3W2T1K9h3I4A6i4K6u0W2j5$3!0E0i4K6u0r3x3K6f1@1y4U0V1#2y4U0j5$3y4o6p5@1y4U0j5H3x3b7`.`.终于到了可以开始分析VmProtect.3.9.4了,像极了玩游戏来到了最终boss环节,我们玩过游戏的都知道,打boss是一件不容易的是请,因为作为整个游戏里最强大的生物,他的血量防御极其高,但是打赢了通关之后还是很有成就感的。要做到能够完全分析他还有很长的一段路要走,从1.6到这个版本只是分析他的一个分支[虚拟化],千里之行始于足下,我们没有办法做到一口气,把全部知识点都消化了,但是我们可以像愚公移山一样,所谓量变引起质变,就是这个意思。这次给大家的附件依旧没有虚拟机主程序,然后我说下,设置啥的,首先加密的是入口点后面的的下面两行代码,和上篇帖子一样加密的是0040A5C6 B8 78563412 mov eax,0x12345678和0040A5CB 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从低版本到高版本的代码虚拟化分支分析系列全部结束了。
堆栈地址
寄存器值
寄存器名称
0019FF50
D1D1D1D1
edi
0019FF54
relocation
0019FF58
BBBBBBBB
ebx
0019FF5C
eflags
0019FF60
esi
0019FF64
0019FF80
ebp
0019FF68
DDDDDDDD
edx
0019FF6C
CCCCCCCC
ecx
0019FF70
AAAAAAAA
eax
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288681.htm