【问题标题】:C++ hooking a dll?C ++挂钩一个dll?
【发布时间】:2010-11-02 21:16:59
【问题描述】:

有没有一种在 c++ 中挂钩 dll 的快速方法?我知道有微软的Detours 东西,但是没有一种快速简单的方法来挂钩几个 dll 函数吗?

例如,我想将 dll mytestdll.dll 中的函数 void mytestfunction() 挂钩到 hook_mytestfunction()

提前致谢!

【问题讨论】:

  • 你是想在你自己的进程中挂钩一个DLL,还是一个已经加载到另一个进程中的DLL?
  • 挂钩所有在 dll 中使用的函数的可用策略与仅挂钩一个已使用函数的策略不同。进程外策略与进程内策略不同。能否提供更多细节?
  • 是的,试图从另一个进程挂钩 dll。例如类似的事情就像挂钩 opengl32.dll 文件并拦截 glBegin..glEnd 等......
  • 您能解释一下您的情况(即为什么要这样做?),也许我们可以给您一个比挂钩更好的答案,您确实应该尽量避免。

标签: c++ hook


【解决方案1】:

可能最简单的方法是将您自己的包装 DLL同名放在 EXE 的目录中,并将挂钩的 DLL 的副本以新名称放在同一目录中。然后,在包装 DLL 的 IAT 中,将任何未拦截的调用重定向到包装的 DLL(导出转发),并自己实现其他调用。

要重定向函数,请将以下行放入 .DEF 文件中:Foo=wrapped_mytestdll.Foo 其中 Foo 是(损坏的)函数名称,wrapped_mytestdll 是复制的 DLL 的新名称。

因此,受影响的 EXE 会加载您的包装 DLL,然后是包装的 DLL。包装 DLL 中的函数优先于包装的 DLL。 没有被截获的唯一调用是被包装的 DLL 对其自身的调用,因为这些调用不会通过您的 IAT。

(我后来发现a link to a tool 可以生成一个基本的“.DEF”文件,但我自己没有测试过。使用风险自负。)

【讨论】:

    【解决方案2】:

    绕道又快又简单的方法!

    【讨论】:

    • 除非你想在 64 位上工作,你必须支付 10k$ 的许可费 :(
    【解决方案3】:

    我假设如果您正在挂钩一个 DLL,那么您正在挂钩该 DLL 的导出?

    在这种情况下,您可以执行一个简单的 IAT(必要时可能还有 EAT)挂钩。

    IAT/EAT 挂钩相对于 Detours 的优势在于,挂钩的应用和移除是 100% 安全的(因为您不是在替换代码,而是在替换指针,因此不会出现竞争条件),并且很容易在本机 x64 进程上进行挂钩(除非您为 Prof 版分叉 10 个 Grand,否则 Microsoft 的 Detours 库无法做到这一点)。

    是的,有 3rd 方 detour 库支持 x64 并处理大多数竞争条件等等,但其中一些非常昂贵,而另一些则很难使用。

    IAT/EAT 钩子快速简单,在“Windows via C/C++”一书中提供了执行它们的示例代码(以及互联网上的许多地方)。

    我知道这是一个相当笼统的答案,但是如果没有更多关于您正在尝试做什么的详细信息,很难详细说明。

    【讨论】:

      【解决方案4】:

      我以前用过这个成功了:

      http://software.intel.com/en-us/articles/intercepting-system-api-calls/

      但是我在谷歌上搜索了一下,可以在代码项目中找到一些新的东西,而且成绩很好:

      http://www.codeproject.com/KB/winsdk/LibMinHook.aspx

      【讨论】:

        【解决方案5】:

        只需调用 GetProcAddress(hDll, "mytestfunction"),并在其中写入jmp hook_mytestfunction,然后在 hook_mytestfunction 中 mytestfunction 的开头放置指令。

        当然,如果您理解它,它真的又快又容易。如果您不这样做 - 使用 MS Detours 或其他库。通常你可以在不了解它的工作原理的情况下做到这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-27
          • 2014-04-03
          • 1970-01-01
          • 2013-03-09
          • 2013-05-21
          • 2013-02-17
          • 1970-01-01
          相关资源
          最近更新 更多