0

我是一名学生,刚刚学会了与 MS Detours 挂钩。

描述: 我想替换一些 Windows 函数,用于在窗口、标题等中写入和更改文本,就像TextOutW()函数一样

TextOut()函数使用当前选择的字体、背景颜色和文本颜色在指定位置写入字符串。

目标: 我的目标是挂钩新功能(如NewTextOutW()),它们将做同样的事情,但它们会将文本翻译成另一种语言。新函数具有与原始函数相同的参数。

为什么 MS 绕道?

我必须使用 MS Detours,因为传统的与 asm 挂钩并覆盖原始函数的热补丁标头仅适用于 X86 版本的应用程序,但不适用于 X64,所以因为 MS Detours 与 32 位和 64 位应用程序兼容,我想使用 MS Detorus。

我想用函数地址进行挂钩,因为我有源代码,并且我有原始和新函数的地址保存在一种BYTE*变量中。

代码信息: 这是我的代码,它将使用 2 个地址(BYTE* m_pOrigFuncBYTE* 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());语句的行,错误都会发生。

有人可以帮我找到这个问题的解决方案吗?

4

0 回答 0