首页 > 解决方案 > 挂钩 LoadLibrary,如何检索有关正在加载的文件名的信息?

问题描述

我正在学习挂钩,并决定尝试挂钩 Win32 API 函数LoadLibraryA,以查看是否有东西通过CreateRemoteThreadand注入 DLL LoadLibrary。我正在连接我自己想要保护的控制台应用程序。

我能够检测到我的应用程序的进程空间内的某些东西正在调用LoadLibrary,但是我如何找到有关已加载内容的更多信息?例如,我可以获取 DLL 路径和名称吗?

定义 LoadLibrary 的原型:

typedef HMODULE(__stdcall* LoadLibraryType) (LPCSTR fileName);

实例化 LoadLibraryType:

static LoadLibraryType loadlib;

拦截呼叫的功能:

HMODULE __stdcall LoadLibraryHook(LPCSTR fileName) {

    printf("\nLoadLibraryA has been called !!!\n");

    return loadlib(fileName);
}

InitializeLoadLibraryCheck()将从主函数调用。

void InitializeLoadLibraryCheck()
{

    HMODULE moduleHandle = LoadLibraryA("kernel32.dll");

    LoadLibraryType realFuncAddy = (LoadLibraryType)GetProcAddress(moduleHandle, "LoadLibraryA");

    loadlib = (LoadLibraryType)(CUtils::DetourFunc((PBYTE) realFuncAddy, (PBYTE) LoadLibraryHook, 5));

    DWORD dwOld = 0;

    BOOL bProtectRet = VirtualProtect(loadlib, 5, PAGE_EXECUTE_READWRITE, &dwOld);
}

编辑:忘记添加绕行功能:

PVOID CUtils::DetourFunc(BYTE *src, const BYTE *dst, const int len)
{
    BYTE *jmp = (BYTE*)malloc(len + 5);

    DWORD dwback;
    VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);

    memcpy(jmp, src, len);
    jmp += len;

    jmp[0] = 0xE9;
    //relative address from trampoline to orig function + 5
    *(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5;

    src[0] = 0xE9;
    *(DWORD*)(src + 1) = (DWORD)(dst - src) - 5;

    VirtualProtect(src, len, dwback, &dwback);

    //address to trampoline
    return (jmp - len);
}

标签: c++winapi

解决方案


如何找到有关已加载内容的更多信息?例如,我可以获取 DLL 路径和名称吗?

只需使用fileName给定的参数。这是正在加载的 DLL 的路径,例如:

HMODULE __stdcall LoadLibraryHook(LPCSTR fileName) {

    printf("\nLoadLibraryA has been called !!!\nfileName: %s\n", fileName);

    return loadlib(fileName);
}

推荐阅读