【问题标题】:Do API Hooks Affect All Processes?API 挂钩会影响所有进程吗?
【发布时间】:2013-05-31 10:18:23
【问题描述】:

假设一个挂钩给定 DLL 的函数。 是否所有使用该特定 DLL 的特定功能的进程都受挂钩影响?

例如,如果要将MessageBoxA 与user32.dll 挂钩,这样它就不会弹出消息框,而是播放披头士乐队的黄色潜水艇 作为系统声音。所有调用MessageBoxA 的进程都会遇到这种相当奇怪的行为吗?

-若昂·席尔瓦

【问题讨论】:

  • 谢天谢地,没有。如果可行的话,很难让操作系统保持运行。
  • @HansPassant,我知道这是一个老问题,但我有一个顾虑。我正在做一个项目,我们需要监视对某个函数“recv”的所有系统调用,而不管实例化它的进程如何。有可能吗?

标签: windows winapi hook


【解决方案1】:

一般来说,它会处理特定的。

当您加载 DLL 时,窗口会将 dll 加载到您的内存空间中。如果 dll 已经加载到内存中(并映射到某个进程的空间),那么 Windows 只会将内存映射到您的进程空间。

但是,当您应用挂钩时,内存会发生变化,因此 Windows 将为您的进程制作所述内存的副本。

阅读内存映射文件(这方面的技术就是 windows 用来加载代码的技术)

【讨论】:

  • 嗯……嗯……不一定。通常,文本段是FILE_MAP_COPY,所以你是对的,但这不需要那样保留。
  • @Damon - 确实总有例外。我只是在说明通用方法。请在我想阅读的答案中详细说明。
  • @Preet 我问这个问题是因为我认为我知道 DLL 的代码是在进程之间共享的。你是说如果对user32.dll的函数应用hook,系统实际上会将整个DLL复制到进程内存空间中,这样就可以安全地更改它的内存?
  • Dll 代码已共享。但是映射是在 4k 页面级别完成的 - 所以只有被更改的页面才会被“重新加载”(实际上是在写入时映射)所以它非常有效。
  • @JoãoSilva:这就是你所说的写时复制。只要您只阅读过内存页面,它们就完全相同(共享)。一旦你写到一个页面就不是这样了。
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
相关资源
最近更新 更多