我是一名学生,刚刚学会了与 MS Detours 挂钩。
描述:
我想替换一些 Windows 函数,用于在窗口、标题等中写入和更改文本,就像TextOutW()函数一样
该TextOut()函数使用当前选择的字体、背景颜色和文本颜色在指定位置写入字符串。
目标:
我的目标是挂钩新功能(如NewTextOutW()),它们将做同样的事情,但它们会将文本翻译成另一种语言。新函数具有与原始函数相同的参数。
为什么 MS 绕道?
我必须使用 MS Detours,因为传统的与 asm 挂钩并覆盖原始函数的热补丁标头仅适用于 X86 版本的应用程序,但不适用于 X64,所以因为 MS Detours 与 32 位和 64 位应用程序兼容,我想使用 MS Detorus。
我想用函数地址进行挂钩,因为我有源代码,并且我有原始和新函数的地址保存在一种BYTE*变量中。
代码信息:
这是我的代码,它将使用 2 个地址(BYTE* m_pOrigFunc和BYTE* m_pDetourFunc)将一个新函数附加到原始函数。
m_pOrigFunc是原始函数m_pDetourFunc的地址,而 是要附加到原始函数的函数的地址。要分离这两个函数,我使用相同的代码,但使用DetourAttach((PVOID*)&m_pOrigFunc, m_pDetourFunc)iDetourDetach((PVOID*)&m_pOrigFunc, m_pDetourFunc)语句除外。
代码:
LONG err_cd = DetourTransactionBegin();
if (err_cd == NO_ERROR)
{
//err_cd = DetourUpdateThread(GetCurrentThread());
if (err_cd == NO_ERROR)
{
err_cd = DetourAttach((PVOID*)&m_pOrigFunc, m_pDetourFunc);
if (err_cd == NO_ERROR)
{
err_cd = DetourTransactionCommit();
if (err_cd == NO_ERROR)
::Trace(2, _T("MSDetours::DetourTransactionCommit: Detour erfolgreich."));
else
AbortAndTraceMSDetours("DetourTransactionCommit", err_cd);}
else
AbortAndTraceMSDetours("DetourAttach", err_cd);}
else
AbortAndTraceMSDetours("DetourUpdateThread", err_cd);}
else
AbortAndTraceMSDetours("DetourTransactionBegin", err_cd);
问题: 在实现此代码后,我在其他一些 Windows 函数中遇到了错误(我想创建一个框架,但我不确定),你可以 在这里看到。对于不会说德语的人,这里是文本翻译:
Konfig32.exe 中 0x6D0A00C8 处未处理的异常:0xC000041D:在用户回调期间遇到未处理的异常。
无论是否注释带有err_cd = DetourUpdateThread(GetCurrentThread());语句的行,错误都会发生。
有人可以帮我找到这个问题的解决方案吗?