gpt4 book ai didi

c++ - 当调用原始版本的 DLL Hook 函数时,我得到无限递归

转载 作者:行者123 更新时间:2023-11-28 02:31:22 25 4
gpt4 key购买 nike

我想覆盖某些 winapi 函数 SetWindowPos 的部分功能。我只是想阻止任何 Z 轴操作——将窗口放在后面或上面。我的基本伪代码想法是:

bool NewSetWindowPos(zaxis_argument, ...) {
return OldSetWindowPos(NULL, ...);
}

我使用 Mhook 库,它工作得很好。

实现有点笨拙,因为我将变量转换为看起来总是很奇怪的函数:

//Get the function refference for overriding with mhook
PNT_QUERY_SYSTEM_INFORMATION OriginalSetWindowPos =
(PNT_QUERY_SYSTEM_INFORMATION)::GetProcAddress(
::GetModuleHandle( L"user32" ), "SetWindowPos" );

我定义了一个遵循原始函数参数计数的类型:

//Define type for the original SetWindowPos function
typedef BOOL(*SetWindowPos_type)(
_In_ HWND hWnd,
_In_opt_ HWND hWndInsertAfter,
_In_ int X,
_In_ int Y,
_In_ int cx,
_In_ int cy,
_In_ UINT uFlags
);

这是我的新功能:

BOOL WINAPI
HookedSetWindowPos(
_In_ HWND hWnd,
_In_opt_ HWND hWndInsertAfter,
_In_ int X,
_In_ int Y,
_In_ int cx,
_In_ int cy,
_In_ UINT uFlags
) {
//The |SWP_NOZORDER adds flag that instructs the function to ignore any Z-order operations.
//Ther than Z-order functionality is still available, I just pass the original arguments
return ((SetWindowPos_type)OriginalSetWindowPos)(hWnd, 0, X, Y, cx, cy, uFlags|SWP_NOZORDER);
}

我在 DLL init 上挂接该函数:

  case DLL_PROCESS_ATTACH:
//Override function
Mhook_SetHook( (PVOID*)&OriginalSetWindowPos, HookedSetWindowPos );
//Force create console window
createConsole();
break;

问题是 OriginalSetWindowPos 以某种方式映射到 HookedSetWindowPos。一旦 SetWindowPos 被调用,HookedSetWindowPos 调用 OriginalSetWindowPos 实际上也是 HookedSetWindowPos - 并且永远循环,或者至少直到进程因堆栈溢出而崩溃。

:DLL中hook函数后如何调用原函数?

最佳答案

好的,为了帮助您解决这个问题,我将向您展示这段代码。这是原始函数的类型定义,我将它命名为oSetWindowPos,下面是即将被 Hook 的函数hSetWindowPos

BOOL(__stdcall WINAPI *oSetWindowPos)(
_In_ HWND hWnd,
_In_opt_ HWND hWndInsertAfter,
_In_ int X,
_In_ int Y,
_In_ int cx,
_In_ int cy,
_In_ UINT uFlags
) = SetWindowPos;

BOOL __stdcall WINAPI hSetWindowPos(HWND hWnd, HWND hWnd_ia, int x, int y, int cx, int cy, UINT uFlags)
{
OutputDebugStringA(" - Inside setwindowpos trampoline..");
return oSetWindowPos(hWnd, hWnd_ia, x, y, cx, cy, uFlags);
}

我还没有使用过 MHook 库,虽然我用谷歌搜索了一下并遇到了 basic example of hooking in MHook .似乎 MHook 与 MS Detours(这是我使用过的库)的工作方式相同。

void Hook() {
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
if (DetourAttach(&(PVOID&)oSetWindowPos, hSetWindowPos) == NO_ERROR)
{
OutputDebugStringA(" - setwindowpos succesfully hooked");
}
DetourTransactionCommit();
}

现在正如我之前所说,我还没有使用 MHook 所以这可能是他们这边的问题,但是如果你坚持使用 MHook 需要使用以下代码来 hook 函数:

BOOL bHook = Mhook_SetHook((PVOID*)&oSetWindowPos, hSetWindowPos);

让我知道它是否适合您。

关于c++ - 当调用原始版本的 DLL Hook 函数时,我得到无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28890309/

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