WinAPI将CreateFileW挂在记事本中

时间:2018-12-01 23:29:52

标签: c++ winapi hook stack-overflow detours

我制作了一个DLL,该DLL应该可将CreateFileW挂接到记事本中,但是会崩溃。调试之后,我发现它在HookedCreateFile函数的第一行中导致了堆栈溢出:

Screenshot

(它说它在地址处引起异常错误...)

异常处的调用栈:

Callstack?

我的代码:

typedef HANDLE(WINAPI * CreateFileFn)(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile);

CreateFileFn oCreateFile = (CreateFileFn)GetProcAddress(GetModuleHandleA("kernel32.dll"), "CreateFileW");

HANDLE WINAPI HookedCreateFile(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile)
{
    //std::cout << "Hello!" << std::endl;

    return oCreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}

我正在使用Microsoft Detours中的DetourFunction

DetourFunction((PBYTE)oCreateFile, (PBYTE)HookedCreateFile);

1 个答案:

答案 0 :(得分:5)

首先,DetourFunction()很旧,已被DetourAttach()取代。您应该更新代码以使用Detours库的新版本。请访问Using Detours上的Microsoft Wiki。

第二,当您绕开某个功能时,您将使用跳转到hook函数中来代替该功能的前几个指令。 DetourFunction()返回一个蹦床,您必须使用它来调用原始函数。蹦床执行被替换的指令,然后跳转到原始函数的其余未连接代码。

但是,您的钩子根本没有使用蹦床,因此每次调用oCreateFile时,它最终都会无休止地递归循环。这就是导致堆栈溢出错误的原因,因为每个调用都会将输入参数的另一个副本推入调用堆栈。最终,调用堆栈将耗尽可用空间。

尝试以下方法:

CreateFileFn origCreateFile = (CreateFileFn) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateFileW");
CreateFileFn trampCreateFile;

HANDLE WINAPI HookedCreateFile(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile)
{
    //std::cout << "Hello!" << std::endl;
    return trampCreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
}

...

trampCreateFile = (CreateFileFn) DetourFunction((PBYTE)origCreateFile, (PBYTE)HookedCreateFile);