特点
不同的压缩壳会先将 pe 文件压缩,载入内存后进行解压缩(TLS函数内)然后运行,而 vmp 是修改 pe文件中的汇编指令为一种 “伪指令” ,这些伪指令被虚拟机引擎解析,代替cpu去执行这些指令(如JVM和.NET),一般一条正常指令会对应多条伪指令(多是些无意义的跳转),所以被 vmp 加壳的程序速度会变慢。
不同的虚拟机支持的 “伪指令” 不同,原则上只要虚拟指令集一变动,那原本的伪指令的解释就会发生变化。,所以很难针对所有 vmp 壳写出一个通用的注册机。要逆向被VM SDK保护起来的原始代码,只有手工分析这段虚拟指令,找到虚拟指令和原始汇编的对应关系,然后重写出原始程序的代码,完成算法的逆向和分析。
举例
比如这是一个正常的x86函数调用:
push uType
push lpCaption
push lpText
push hWnd,
call MessageBox
被 vm 之后:
vPushMem uType
vPushMem lpCaption
vPushMem lpText
vPushMem hWnd,
vCall vCode
此时的虚拟指令只能被VM虚拟解释器执行,普通cpu无法解析,所以我们用调试器看到的被vm后的就是一大堆的无意义的代码。