某信的白加黑研究
前言
本来想着挖掘一个白加黑,通过已经加载的DLL,给他替换掉,然后利用的这个过程,随后就有了这篇文章。
1.分析程序
1.1签名验证?
前面的操作就不说了,发现加载了的DLL中有两个DLL,然后放在一起,我们运行后发现了,会提示签名验证失败。
这里我看了下,验证他的签名是对的,但是为什么会这样,随后我注意到了它加载的DLL可能会很多,也注意到了,对于一些加载的dll他都会验证签名:
并且会出现一个弹窗,如何解决呢?
1.2解决办法
1.2.1修改程序把窗口处理掉
会破坏签名,毕竟修改一点都不行。虽然可以去掉窗口。
1.2.2HOOK去掉窗口
这里需要找到在他加载DLL之后,在弹窗之前,去修改内存空间,把它的弹窗去掉即可。
1.3具体分析
通过定位弹窗,找到了位置,然后通过代码给他填充即可。把它判断弹出窗口和结束进程的地方给他nop掉,就不会再有窗口了。(最方便简单)
1.3.1定位地址
首先要找到ImageBase地址,然后计算偏移量,相减找到Messagebox和TerminateProcess地址,填充即可。
ImageBase地址可以看代码,动态获取,这里是
0x00B40000
偏移地址这里举个例子:
messagebox地址此时:
0x00B8DFCA
相减就是:
4DFCA
然后通过动态获取的:
ImageBase地址 + 4DFCA
此时我们需要对这个地址填充6个:
0x90
取消下面的TerminateProcess只需要相同步骤即可
2.成功截图
没有弹窗了,并且可以后续继续执行我们的代码。
2.1总结
- 解决了弹窗的问题。
- 解决了只加载签名DLL的问题。原理就是他会加载一些DLL,然后判断是否签名,然后再加载一些dll。我们只需要使用它检测之前的时候使用的DLL,从而HOOK即可。
3.代码问题
3.1解决c4996
#define _CRT_SECURE_NO_WARNINGS 1
3.2获取程序ImageBase
DWORD GetProcessImageBase(DWORD dwProcessId) {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwProcessId);
if (hSnapshot == INVALID_HANDLE_VALUE) {
printf("CreateToolhelp32Snapshot failed.\n");
return 0;
}
MODULEENTRY32 me32;
me32.dwSize = sizeof(MODULEENTRY32);
if (!Module32First(hSnapshot, &me32)) {
CloseHandle(hSnapshot);
printf("Module32First failed.\n");
return 0;
}
CloseHandle(hSnapshot);
return (DWORD)me32.modBaseAddr;
}
3.3修改内存空间内容
//打开进程
handle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessId);
//读取空间内容
ReadProcessMemory(handle, (LPVOID)dwImageBase, &value, sizeof(value), &bytesRead);
printf("%x\n", value);
//写入空间内容
WriteProcessMemory(handle, (LPVOID)dwImageBase, buff, 6, NULL);
//这里是写入了6个byte为0x90,也就是nop掉给他
这里成功的给他nop了两个地方。
0 条评论
可输入 255 字