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程序的脱壳和修复!
参考链接: