WinAPI 在记事本中挂钩 CreateFileW
WinAPI Hooking CreateFileW in Notepad
我制作了一个 DLL,它应该从记事本挂钩 CreateFileW
但是它崩溃了。调试后我发现它在 HookedCreateFile
函数的第一行导致堆栈溢出:
(它说它在地址处导致异常错误...)
异常点调用栈:
我的代码:
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);
首先,DetourFunction()
是旧的,已被DetourAttach()
取代。您应该更新您的代码以使用新版本的 Detours 库。请参阅 Using Detours.
上的 Microsoft wiki
其次,当你绕过一个函数时,你是在用一个跳转到你的钩子函数来替换函数的前几条指令。 DetourFunction()
returns 一个 trampoline,你必须使用它来调用 original 函数。 trampoline 执行被替换的指令,然后跳转到原始函数剩余的未挂钩代码。
但是,你的 hook 根本没有使用 trampoline,所以每次调用 oCreateFile
时,它都会在无休止的递归循环中一遍又一遍地回调自己。这就是导致堆栈溢出错误的原因,因为每次调用都会将输入参数的另一个副本推送到调用堆栈上。最终,调用堆栈用完了可用的 space.
试试这个:
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);
我制作了一个 DLL,它应该从记事本挂钩 CreateFileW
但是它崩溃了。调试后我发现它在 HookedCreateFile
函数的第一行导致堆栈溢出:
(它说它在地址处导致异常错误...)
异常点调用栈:
我的代码:
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);
首先,DetourFunction()
是旧的,已被DetourAttach()
取代。您应该更新您的代码以使用新版本的 Detours 库。请参阅 Using Detours.
其次,当你绕过一个函数时,你是在用一个跳转到你的钩子函数来替换函数的前几条指令。 DetourFunction()
returns 一个 trampoline,你必须使用它来调用 original 函数。 trampoline 执行被替换的指令,然后跳转到原始函数剩余的未挂钩代码。
但是,你的 hook 根本没有使用 trampoline,所以每次调用 oCreateFile
时,它都会在无休止的递归循环中一遍又一遍地回调自己。这就是导致堆栈溢出错误的原因,因为每次调用都会将输入参数的另一个副本推送到调用堆栈上。最终,调用堆栈用完了可用的 space.
试试这个:
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);