Qq: 2746074413 微信:vmp520888个人空间 639K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6M7r3q4U0k6g2)9J5k6h3u0A6L8r3W2T1K9h3I4A6i4K6u0W2j5$3!0E0i4K6u0r3x3K6f1@1y4U0V1#2y4U0j5$3y4o6p5@1y4U0j5H3x3b7`.`.上一篇我分析了VmProtect.3.0.0的例子,然后这篇我将为大家带来VmProtect.3.8.1虚拟机流程分析的例子,有的小伙伴就纳闷了,这跳级也跳的太快了,VmProtect.3.0.0版本的所有知识你弄懂了没,当然没有,比如什么是指令变异,反调试,内存保护等,这些还是需要大量的时间去研究,有的人喜欢把他们全都弄懂在去研究下个版本,但是这不是我的风格。为啥要选择VmProtect.3.8.1版本呢,我能够找到的版本里面VmProtect.3.8.1版本选项里面开始多了好多个选项,其中开头的那三个,一个是版本选择框,有两个选项分别是VMProtect 2.X 和 默认,第二个是Instances(实例),这个我看不出是什么东西,第三个是Complexity(复杂程序),默认是填了20%。所以说这个版本和之前的比起来又进行了稍微大点的升级。OK,我们进入正题。这次给大家的附件依旧没有虚拟机主程序,然后我说下,设置啥的,首先加密的是入口点后面的的下面两行代码,和上篇帖子一样加密的是0040A5C6和0040A5CB这两条代码,然后选项那边,把是都改成否,英文版的,yes全改no,然后前面我讲到的多出来的三个设置不动,最后Compilation Type(编译类型),这边选择Virtualization(虚拟化)。我们把编译成功的123.vmp.exe拖到OD上0040A5C6这边的代码被替换成了jmp指令,0040A5CB这边的代码可能是被替换成某个handler的一部分了吧。我们接着往下单步这条代码块根据以前经验,执行完应该把相应的寄存器都入栈了还有执行其他初始化了的,但是这里并没有这样做。只入栈了部分寄存器,根据分析下一条代码块,得出结论,它被拆分成了两条代码块用jmp edi相连,共同完成压入寄存器和一些初始化的操作。我们看下一个代码块分析到这里我们推断出某些寄存器对应的作用,ebx是用来存放密钥的,esp是存放虚拟寄存器的基地址的,ebp相当于3.0.0版本的edi,用于计算handler的地址,esi相当于3.0.0版本的ebp,用于数据的存取和计算,虚拟机中ebp的作用和真实指令的esp作用差不多,最后这个edi相当于3.0.0版本的esi,用于存放伪代码的指针。这个版本的垃圾指令并不多,很多看似是像的其实是参与解密DSP用的。
这里我们可以看到esi指向的堆栈对应寄存器分布至此所有寄存器的入栈,和其他的初始化完成了,下面就是去执行handler了,这条handler完成了vm_eax(偏移是0x24),Vm_ebx(偏移是0x4),Vm_ebp(偏移是0x30)的填充,我们再看下一条handler。这条handler是我们上一条执行的handler,完成了vm_relocation(偏移是0x28),Vm_esi(偏移是0x2c),Vm_edx(偏移是0x20)的填充,我们再看下一条handler。这条handler是我们上一条执行的handler,完成了vm_edi(偏移是0xC),Vm_eflags(偏移是0x10),Vm_ecx(偏移是0x40)的填充, 这个Vm_ecx的偏移是0x40,这和我们以前分析虚拟寄存器不一样,我们以前分析的虚拟寄存器总共16个,总的大小是0x40,只能解释这个版本的虚拟寄存器大小和个数变得更大了。到这边就已经填充虚拟寄存器结束了,我们再看下一条handler。上面这条handler执行下来,做了两件事将0x33e43063写入偏移为0的虚拟寄存器中和将0x493a1d写入偏移为0x44的虚拟寄存器中,这里我把写入的两个值修改了也不影响运行,所以这条handler,应该就是干扰我们分析的,前面做那么多注释浪费我大量的时间,这里基本上用的一些手段都明白了,后面我就标记一些关键的部分了,主要看伪代码读取数据后解密完成之后做了什么。我们看下一条handler。这条handler做了两件事,将解密出来的00415035在0019FF70,将vm_ecx取出来存放在0019FF6C。我们接着看下一条handler。这条handler做了两件事,将解密出来的12345678存入偏移为0的虚拟寄存器,将vm_eflags取出来存放在19ff68。我们接着看下一条handler。这条handler做了两件事,将vm_edi的值存放在19ff64,将vm_edx的值存放在19ff60。我们接着看下一条handler。这条handler做了两件事,将将vm_esi的值存放在19ff5C,将将vm_ebp的值存放在19ff58 。我们接着看下一条handler。这条handler做了两件事,将将vm_ebx的值存放在19ff54,将 12345678 存放在19ff50。我们接着看下一条handler。到此为止全部代码分析完成了,感觉和分析3.0.0版本还是费劲不少,主要就是dsp加密,搞得代码看起来很不舒服,但是也是有规律可循,分析久了,那些代码可以跳过,哪些代码需要留意,也能总结出来,熟能生巧应该嘛。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 .- E9 22940800 jmp 123_vmp.004939ED
0040A5CB . E8 78400900 call 123_vmp.0049E648
004939ED 9C pushfd
;存放标志寄存器eflags到堆栈,后面会用到
[0019FF70] = 00000246
004939EE 52 push edx
;压入edx,[0019FF6C] = DDDDDDDD
004939EF BA 18B28448 mov edx,0x4884B218
004939F4 F7C2 063C3D78 test edx,0x783D3C06
;这条指令执行完
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288666.htm