gpt4 book ai didi

c++ - Easyhook:非托管 Hook ,如何调用原始函数/更改返回状态?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:31 25 4
gpt4 key购买 nike

所以我在 winspool.drv!WritePrinter 上有一个 Hook 函数,它成功地 Hook 了远程注入(inject)到 spoolsv.exe 的非托管 C++。

目前, Hook 似乎要么替换原始函数,要么以无法检测的方式破坏堆栈: Hook 后,WritePrinter 调用导致 Hook 外没有打印机事件。

我发现至少有一种方法可以调用原始函数,即所谓的 LhGetOldProc。但是,使用它会导致崩溃,不确定这是与 easyhook 相关的错误还是只是错误的转换。

那么,如何在 Easyhook 非托管版本中正确调用原始函数?

使用 LhGetOldProc Hook 回调:

UCHAR *uc = NULL;
LhGetOldProc(hhW, &uc);
typedef BOOL (*wp)(_In_ HANDLE, _In_ LPVOID, _In_ DWORD cbBuf, _Out_ LPDWORD);
wp my_wp = reinterpret_cast<wp>(reinterpret_cast<long>(uc)); // http://stackoverflow.com/questions/1096341/function-pointers-casting-in-c

BOOL res ;
if (my_wp == 0x0) {
return -1;
} else {
res = my_wp(hPrinter, pBuf, cbBuf, pcWritten); // crash
}

钩子(Hook)代码:

HMODULE                 hSpoolsv = LoadLibraryA("winspool.drv");
TRACED_HOOK_HANDLE hHook = new HOOK_TRACE_INFO();
NTSTATUS NtStatus;
UNICODE_STRING* NameBuffer = NULL;
HANDLE hRemoteThread;
FORCE(LhInstallHook(GetProcAddress(hSpoolsv, "WritePrinter"), WritePrinterHookA, 0x0, hHook));
ULONG ACLEntries[1] = { (ULONG) - 1 };
FORCE(LhSetExclusiveACL(ACLEntries, 1, hHook));

hhW = hHook;

TIL:在 2013 年,CodePlex(EasyHook 讨论列表所在的位置)在注册 Microsoft 帐户时不接受电子邮件的三级域。不会使用 Firebug 绕过表单。

最佳答案

堆栈被破坏,因为你的函数指针有错误的调用约定。

默认的调用约定是 __cdecl,它期望调用者清理堆栈。

typedef BOOL (* wp)(_In_   HANDLE ....);

等于:

typedef BOOL (__cdecl* wp)(_In_   HANDLE ...);

但是 winapi 函数使用 __stdcall 调用约定,它期望被调用方清理堆栈。您将必须键入定义一个 __stdcall 函数:

typedef BOOL (__stdcall* wp)(_In_   HANDLE ....);

关于c++ - Easyhook:非托管 Hook ,如何调用原始函数/更改返回状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18658798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com