VMP分析之VMP2.13流程分析(三)
作者:互联网
文章目录
VMP2.X版本特点
2.X版本的VMP相对于1.0版本来说有下面的变化
- 自我膨胀,增加了大量混淆指令
- VM_Context的存放方式由内存改为栈,vmp1区段也没有了
- 有专门分析插件,可以帮助分析和理解
- 整体结构有所变化
VMP2.13加壳
这次利用插件来对VMP2.13.8版本进行分析,首先对目标程序进行加壳,选择最小保护,只分析VM的虚拟机部分
VMP2.13代码分析
进入VM虚拟机
和之前一样,进入虚拟机开始压入了一个指令流解密Key和密钥,区别之前的1.0版本,这个指令流解密Key是加密后的。
0042DAE3 9C pushfd
0042DAE4 883424 mov byte ptr [esp], dh
0042DAE7 9C pushfd
0042DAE8 66:894C24 04 mov word ptr [esp+4], cx
0042DAED 8D6424 08 lea esp, dword ptr [esp+8] ; esp=esp+8
中间的这一串指令都是混淆代码,执行前后堆栈没有发生改变,没有的实际用处。
保存堆栈
到这里按照之前的经验应该开始保存寄存器环境了,这里记录下进入VM后的栈情况。
相对于1.0版本来说,2.X版本保存堆栈相对比较复杂,刚开始分析起来有点晕。
$-8 > 502585E5--->第二个解密Key
$-4 > 92766AB7--->指令流解密Key
$ ==> > 0019FF30--->进入VM时的ESP
保存eflags和edx
继续往下分析,VM开始将edx保存到堆栈,此时堆栈环境如下:
$-10 > 00650F90--->edx
$-C > 00000302--->eflags
$-8 > 502585E5--->第二个解密Key
$-4 > 92766AB7--->指令流解密Key
$ ==> > 0019FF30--->进入VM时的ESP
保存ecx和edi
继续往下,VM保存了edi和ecx。中间的花指令用来干扰我们分析,不需要深究,实时关注堆栈变化就行。此时的堆栈情况如下:
$-18 > 00000000--->ecx
$-14 > 0019FED8--->edi
$-10 > 00650F90--->edx
$-C > 00000302--->eflags
$-8 > 502585E5--->第二个解密Key
$-4 > 92766AB7--->指令流解密Key
$ ==> > 0019FF30--->进入VM时的ESP
保存ebx
接着保存ebx
$-1C > 003FC000--->ebx
$-18 > 00000000--->ecx
$-14 > 0019FED8--->edi
$-10 > 00650F90--->edx
$-C > 00000302--->eflags
$-8 > 502585E5--->第二个解密Key
$-4 > 92766AB7--->指令流解密Key
$ ==> > 0019FF30--->进入VM时的ESP
保存eax
接着继续保存eax
$-20 > CCCCCCCC--->eax
$-1C > 003FC000--->ebx
$-18 > 00000000--->ecx
$-14 > 0019FED8--->edi
$-10 > 00650F90--->edx
$-C > 00000302--->eflags
$-8 > 502585E5--->第二个解密Key
$-4 > 92766AB7--->指令流解密Key
$ ==> > 0019FF30--->进入VM时的ESP
保存ebx ebp和esi
接着保存ebx ebp和esi
$-2C > 0019FE8C--->esi
$-28 > 0019FED8--->ebp
$-24 > 003FC000--->ebx
$-20 > CCCCCCCC--->eax
$-1C > 003FC000--->ebx
$-18 > 00000000--->ecx
$-14 > 0019FED8--->edi
$-10 > 00650F90--->edx
$-C > 00000302--->eflags
$-8 > 502585E5--->第二个解密Key
$-4 > 92766AB7--->指令流解密Key
$ ==> > 0019FF30--->进入VM时的ESP
至此,堆栈保存完毕,开始进入VM解码循环
VM解码循环
区别于1.0的版本,2.X版本的VM解码循环需要将指令流解密Key进行解密。
解密指令流key
接着将esi和第一次压入的Key相加,开始解密esi
esi解密完成后的地址所指向的内容就是VM的指令流。
解密操作码
接着开始从指令流中取操作码
然后解密操作码
取加密过的handler
让vmEip指向下一个指令流之后,开始取handler,这个handler是经过加密的,需要解密以后才能跳转到正确的地址执行代码
解密handler
handler经过解密后,指向了正确的跳转地址
然后用push+ret的方式跳转到handler
解密操作数
跳转到handler之前,继续从指令流中取操作数并解密,解密完成后更新解密Key
执行handler功能
解密Key更新完成,开始执行handler功能,让vpEip++
执行完成后,跳转到解码循环开始的位置,开始新的解码循环。
VMP2.13流程总结
VMP2.13版本的代码流程总结如下:
- 进入VM虚拟机
- 保存堆栈环境
- 解密指向指令流的Key
- 解密操作码
- 取加密过的handler
- 解密handler
- 解密操作数
- 执行handler功能代码
- 开始新的VM解码循环
- 还原堆栈,退出VM虚拟机
标签:分析,VMP2.13,解密,VM,---,指令流,handler,Key,VMP 来源: https://blog.csdn.net/qq_38474570/article/details/120687366