VMP3.5工具化脱壳
之前分析带VMP壳程序时一直用的是动调,一步步单步找函数调用,分析起来相当麻烦,在网上找了相关资料,整理好尝试一下对vmp3.5脱壳静态分析。
源程序编译
1 |
|
编译环境:gcc
1 | gcc .\main.cpp -o vmpTest |
DIE结果如下:

IDA结果如下:

VMP3.5正常模式加壳

加壳后的程序DIE效果图:

脱壳分析
找到程序可能会调用的api,比如MSVC编译得到的程序在start函数附近会调用__security_init_cookie,从而调用GetSystemTimeAsFileTime以及QueryPerformanceCounter函数,而在gcc里就不一定会调用这两个函数了,通过观察源程序的IDA代码,我们可以发现gcc编译的程序在start附近会调用SetUnhandledExceptionFilter函数,而且MSVC编译的程序也会调用。

因为我们已知程序会打印提示信息,甚至也可以对puts函数下断,只要能在解密后的text段断下即可。这里我在xdbg32中对加壳程序的SetUnhandledExceptionFilter函数下断,成功断下。

回溯一层看看是不是text段代码,如果不是text段代码,而是vmp0,vmp1代码,则继续运行直到是text段。

在这个地址右键转到内存布局中查看是否是text段。

发现确实是text段,然后再继续堆栈回溯找到OEP

到这再往上回溯就没有用户层代码了,明显004012E0就是OEP了,有了OEP,我们就可以进行脱壳了。
脱壳并修复
这里要用到四个工具,分别是CFF Explorer、vmp3-import-fix、Imports Fixer、UIF。用这些工具一步一步来dump和修复。
vmp3-import-fix修复进程IAT
前文我们找到了OEP,接着我们要将代码运行到OEP处,直接在xdbg中设置EIP到OEP处。

命令行中运行vmp3-import-fix程序, .\vmp3-import-fix.exe -p 19004,19004指向的是vmpTest.vmp.exe进程,64位程序即运行vmp3-import-fix-x64.exe

查看修复效果,修复前:

修复后:

利用xdbg自带的Scylla来dump文件即可(进程先别关,后面有用)

得到vmpTest.vmp_dump.exe文件。
CFF设置重定位属性为否
如果vmpTest.vmp_dump.exe文件的DLL can move属性为是,需要修改成否,如图:

保存文件后退出。
UIF 进一步修复进程IAT(可选)
这一步可选,对于一些情况不用UIF修复反而效果更好,实测会因为UIF修复导致程序脱壳后无法运行。
在xdbg的内存布局窗口中找到这两处地址

分别作为code start和code end在UIF里

Imports Fixer修复导出文件的IAT
Imports Fixer 主要用于修复程序(通常是 PE 文件)的导入表,这有助于软件逆向工程师在分析软件内部结构或者去除软件保护时,能够使程序在脱壳后仍能正常运行。
以管理员身份运行Imports Fixer,选择vmpTest.vmp.exe进程,在xdbg里复制OEP对应的RVA,这里对应的是12E0,在IT&IAT窗口中修复dump文件,这里是vmpTest.vmp_dump.exe文件

脱壳效果
脱壳后DIE结果:

脱壳后IDA反编译结果:


脱壳后程序运行结果:

成功完成VMP3.5程序的脱壳和修复!
参考链接:
