Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows API挂钩是否影响所有进程?_Windows_Winapi_Hook - Fatal编程技术网

Windows API挂钩是否影响所有进程?

Windows API挂钩是否影响所有进程?,windows,winapi,hook,Windows,Winapi,Hook,假设一个人钩住一个给定DLL的函数。 是否所有使用特定DLL的特定函数的进程都受到挂钩的影响 例如,如果要从user32.dll钩住MessageBoxA,这样它就不会弹出MessageBox,而是播放披头士乐队的黄色潜艇作为系统声音。所有调用MessageBoxA的进程都会经历这种相当奇怪的行为吗 -若昂·席尔瓦(João Silva)一般来说,它将针对特定的流程 加载DLL时,windows会将DLL加载到内存空间中。如果dll已加载到内存中(并映射到某个进程空间),则windows将只将内

假设一个人钩住一个给定DLL的函数。 是否所有使用特定DLL的特定函数的进程都受到挂钩的影响

例如,如果要从
user32.dll
钩住
MessageBoxA
,这样它就不会弹出MessageBox,而是播放披头士乐队的黄色潜艇作为系统声音。所有调用
MessageBoxA
的进程都会经历这种相当奇怪的行为吗


-若昂·席尔瓦(João Silva)

一般来说,它将针对特定的流程

加载DLL时,windows会将DLL加载到内存空间中。如果dll已加载到内存中(并映射到某个进程空间),则windows将只将内存映射到进程空间

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


读取内存映射文件(这种技术是windows用来加载代码的)

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

加载DLL时,windows会将DLL加载到内存空间中。如果dll已加载到内存中(并映射到某个进程空间),则windows将只将内存映射到进程空间

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


读取内存映射文件(这种技术是windows用来加载代码的)

Um。。。好。。。不一定。通常,文本段是
FILE\u MAP\u COPY
,因此您是对的,但不需要这样保留。@Damon-true总是会有例外。我只是说了一般的方法。请在我想阅读的答案中详细说明。@Preet我问这个问题是因为据我所知DLL的代码是在进程之间共享的。你是说如果一个钩子应用于user32.dll的函数,系统实际上会将整个dll复制到进程内存空间中,以便安全地更改其内存?dll代码是共享的。但是映射是在4k页面级别完成的,因此只有被更改的页面才会被“重新加载”(在写入时映射良好),因此非常有效。@JoãoSilva:这就是所谓的写入时复制。只要您只阅读过内存页,内存页就完全相同(共享)。一旦你写了一页就不会了嗯。。。好。。。不一定。通常,文本段是
FILE\u MAP\u COPY
,因此您是对的,但不需要这样保留。@Damon-true总是会有例外。我只是说了一般的方法。请在我想阅读的答案中详细说明。@Preet我问这个问题是因为据我所知DLL的代码是在进程之间共享的。你是说如果一个钩子应用于user32.dll的函数,系统实际上会将整个dll复制到进程内存空间中,以便安全地更改其内存?dll代码是共享的。但是映射是在4k页面级别完成的,因此只有被更改的页面才会被“重新加载”(在写入时映射良好),因此非常有效。@JoãoSilva:这就是所谓的写入时复制。只要您只阅读过内存页,内存页就完全相同(共享)。一旦你写了一个页面,情况就不是这样了。谢天谢地,没有。如果操作系统能够正常工作,那么很难让它保持运行。@HansPassant,我知道这是一个老问题,但我有一个顾虑。我正在从事一个项目,在这个项目中,我们需要监控对某个函数“recv”的所有系统调用,而不管实例化它的过程是什么。有可能吗?谢天谢地,没有。如果操作系统能正常运行的话,很难让它继续运行。@HansPassant,我知道这是一个老问题,但我有一个顾虑。我正在从事一个项目,在这个项目中,我们需要监控对某个函数“recv”的所有系统调用,而不管实例化它的过程是什么。可能吗?