C++ 如何使用MS Detours用自定义函数替换(钩住)Windows函数?
我是一名学生,刚学会如何与Detours女士交往 说明: 我想替换一些用于在窗口内编写和更改文本、标题等的Windows函数,如C++ 如何使用MS Detours用自定义函数替换(钩住)Windows函数?,c++,windows,winapi,hook,detours,C++,Windows,Winapi,Hook,Detours,我是一名学生,刚学会如何与Detours女士交往 说明: 我想替换一些用于在窗口内编写和更改文本、标题等的Windows函数,如textowu()函数 TextOut()函数使用当前选定的字体、背景色和文本颜色在指定位置写入字符串 目标: 我的目标是钩住新函数(比如NewTextOutW()),它们将做同样的事情,但它们将用另一种语言翻译文本。新函数的参数与原始函数相同 MS为什么绕道? 我必须使用MS Detours,因为与asm的传统挂钩和覆盖原始函数的热补丁头只适用于X86版本的应用程序,
textowu()
函数
TextOut()
函数使用当前选定的字体、背景色和文本颜色在指定位置写入字符串
目标:
我的目标是钩住新函数(比如NewTextOutW()
),它们将做同样的事情,但它们将用另一种语言翻译文本。新函数的参数与原始函数相同
MS为什么绕道?
我必须使用MS Detours,因为与asm的传统挂钩和覆盖原始函数的热补丁头只适用于X86版本的应用程序,而不适用于X64,因此,由于MS Detours与32位和64位应用程序兼容,我想使用MS Detours
我想挂接函数地址,因为我有源代码,我有原始函数和新函数的地址,保存在BYTE*
类型的变量中
代码信息:
这是我的代码,它将使用两个地址(BYTE*m_porifunc
和BYTE*m_pDetourFunc
)将一个新函数附加到原始函数
m_porifunc
是原始函数的地址,m_pDetourFunc
是将附加到原始函数的函数的地址。要分离这两个函数,我使用相同的代码,但除了使用DetourAttach((PVOID*)和m_porifunc,m_pDetourFunc)
我使用DetourDetach((PVOID*)和m_porifunc,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())注释行,错误都会发生代码>语句
有人能帮我找到这个问题的解决办法吗?请不要用文字图片。另外,这也不是一个完整的例子,我们大多数人都不会说德语,所以我们需要自己复制它。@MSalters,我刚刚添加了上面的翻译:)这与您的?关于,DetourUpdateThread在交互期间更新所有线程,以确保所有截取点都正确更新。问题可能发生在其他地方。。。