某信的白加黑研究
cmrex 发表于 广东 二进制安全 1097浏览 · 2024-04-26 02:50

前言

本来想着挖掘一个白加黑,通过已经加载的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总结

  1. 解决了弹窗的问题。
  2. 解决了只加载签名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