【问题标题】:How to hook all operating system calls of my own process?如何挂钩我自己进程的所有操作系统调用?
【发布时间】:2012-11-19 13:00:55
【问题描述】:

我需要劫持我自己进程的所有操作系统调用。我无法重写代码,因为它部分不是我的代码(插件)。我需要能够在我的特定系统调用的实现中决定是否要调用原始实现。

操作系统将首先是 windows xp 和更高版本。稍后将推出 os x 10.5 及更高版本。从 32 位版本的 windows 开始,后来所有操作系统也都是 64 位版本。

我找到了很多关于挂钩其他进程的文档和工具,但我希望我的工作更简单,我希望有一些源代码。

非常感谢,Bernd。

【问题讨论】:

  • 坦率地说,all 系统调用很多。最好的可能是编写一个可加载的内核模块,在其中挂钩每个系统调用。在我看来,仅涵盖与您的问题相关的系统调用的方法将是更明智的举措。

标签: windows api macos hook


【解决方案1】:

有许多挂钩库可以让你做到这一点,例如 Windows 上的 Detours 或 madCodeHook。毫无疑问,OSX 上有类似的库,我只是不知道!

很容易挂钩一个例程并将其替换为您自己的实现。在某些情况下,保留运行原始例程的选项不太容易,这就是使用挂钩库为您消除痛苦的地方。

【讨论】:

  • 在选择挂钩库或自己实现时,请确保它是线程安全的!
  • 谢谢。起初我想,是的,我知道这些库。但实际上,您的回答激发了我重新思考,现在我看到了一种实际使用其中一个库的方法。所以,非常感谢。
【解决方案2】:

在 Mac OS X 上,您可以使用 DYLD_INTERPOSE 宏(和 DYLD_INSERT_LIBRARIES,如果需要)覆盖函数。这个答案有一个例子:Ansi C patch using dlsym compiles OK under linux but fails on Mac Os X

【讨论】:

    【解决方案3】:

    对于 Windows,有一个名为 EasyHook 的 Microsoft Detours 的开源替代方案:

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多