VMP3.5工具化脱壳

VMP3.5工具化脱壳

之前分析带VMP壳程序时一直用的是动调,一步步单步找函数调用,分析起来相当麻烦,在网上找了相关资料,整理好尝试一下对vmp3.5脱壳静态分析。

源程序编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>

void get_flag()
{
MessageBox(NULL, TEXT("wowYourAreGreatVMPCracker"), NULL, NULL);
}

int main()
{
printf("this is Kvancy Test\n");
char info[] = "please input your flag:";
printf("%s",info);
char input[128];
char flag[26] = "wowYourAreGreatVMPCracker";
scanf("%s", input);
if (strlen(input) != 25)
{
printf("length error\n");
}

if (!strcmp(input, flag))
{
get_flag();
}
return 0;
}

编译环境:gcc

1
gcc .\main.cpp -o vmpTest

DIE结果如下:

image-20241028204249544

IDA结果如下:

image-20241028204154535

VMP3.5正常模式加壳

image-20241028204532098

加壳后的程序DIE效果图:

image-20241028204638325

脱壳分析

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

image-20241028213003531

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

image-20241028213616313

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

image-20241028213913666

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

image-20241028213946707

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

image-20241028214132296

到这再往上回溯就没有用户层代码了,明显004012E0就是OEP了,有了OEP,我们就可以进行脱壳了。

脱壳并修复

这里要用到四个工具,分别是CFF Explorer、vmp3-import-fixImports FixerUIF。用这些工具一步一步来dump和修复。

vmp3-import-fix修复进程IAT

前文我们找到了OEP,接着我们要将代码运行到OEP处,直接在xdbg中设置EIP到OEP处。

image-20241028215741615

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

image-20241028215856520

查看修复效果,修复前:

image-20241028220651534

修复后:

image-20241028220740448

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

image-20241028221034533

得到vmpTest.vmp_dump.exe文件。

CFF设置重定位属性为否

如果vmpTest.vmp_dump.exe文件的DLL can move属性为是,需要修改成否,如图:

image-20241028221428308

保存文件后退出。

UIF 进一步修复进程IAT(可选)

这一步可选,对于一些情况不用UIF修复反而效果更好,实测会因为UIF修复导致程序脱壳后无法运行。

在xdbg的内存布局窗口中找到这两处地址

image-20241028221950968

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

image-20241028221838121

Imports Fixer修复导出文件的IAT

Imports Fixer 主要用于修复程序(通常是 PE 文件)的导入表,这有助于软件逆向工程师在分析软件内部结构或者去除软件保护时,能够使程序在脱壳后仍能正常运行。

以管理员身份运行Imports Fixer,选择vmpTest.vmp.exe进程,在xdbg里复制OEP对应的RVA,这里对应的是12E0,在IT&IAT窗口中修复dump文件,这里是vmpTest.vmp_dump.exe文件

image-20241028222716298

脱壳效果

脱壳后DIE结果:

image-20241028224507327

脱壳后IDA反编译结果:

image-20241028222846175

image-20241028222851725

脱壳后程序运行结果:

image-20241028224419616

成功完成VMP3.5程序的脱壳和修复!

参考链接:

https://www.52pojie.cn/thread-1764028-1-1.html