64 位操作系统的系统范围挂钩

发布于 2024-10-19 18:55:29 字数 312 浏览 6 评论 0原文

我想在 64 位操作系统上执行系统范围的挂钩(使用 SetWindowHook)。

我知道64位进程(= proc64)只能加载64位dll(= dll64),32位进程(= proc32)只能加载32位dll(= dll32)。

目前我计划调用 SetWindowHook 两次,一次使用 dll32,一次使用 dll64,期望 proc64s 将加载 dll64,proc32s 将加载 dll32(而 proc64s 的 dll32 和 proc32s 的 dll64 将失败)。

这是正确的方法吗,还是有“更正确”的方法?

谢谢! :-)

I want to perform a system-wide hook (using SetWindowHook) on a 64bit operating system.

I know that 64bit processes (= proc64) can load only 64bit dlls (= dll64) and 32bit processes (= proc32) can load only 32bit dlls (= dll32).

Currently I am planning to call SetWindowHook twice, once with dll32 and once with dll64, expecting that proc64s will load dll64 and proc32s will load dll32 (while dll32 for proc64s and dll64 for proc32s will fail).

Is that the correct way to do that, or is there a "more correct" way to do that?

Thanks! :-)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

揽月 2024-10-26 18:55:29

您所描述的方法是正确的并且已记录在案。

来自 http://msdn.microsoft.com/en -us/library/ms644990(v=vs.85).aspx

SetWindowsHookEx可用于注入
将 DLL 放入另一个进程中。 32 位
DLL无法注入64位
进程,并且 64 位 DLL 不能
注入到32位进程中。如果一个
应用程序需要使用钩子
在其他过程中,需要
32 位应用程序调用
SetWindowsHookEx注入32位
DLL 到 32 位进程中,以及
64位应用程序调用
SetWindowsHookEx注入64位
DLL 到 64 位进程中。 32 位
和 64 位 DLL 必须有不同的
名称。

请注意最后一句话,32 位和 64 位 DLL 的名称必须不同。

Approach that you've described is correct and documented.

From http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx:

SetWindowsHookEx can be used to inject
a DLL into another process. A 32-bit
DLL cannot be injected into a 64-bit
process, and a 64-bit DLL cannot be
injected into a 32-bit process. If an
application requires the use of hooks
in other processes, it is required
that a 32-bit application call
SetWindowsHookEx to inject a 32-bit
DLL into 32-bit processes, and a
64-bit application call
SetWindowsHookEx to inject a 64-bit
DLL into 64-bit processes. The 32-bit
and 64-bit DLLs must have different
names.

Note the last statement that names of 32-bit and 64-bit DLLs MUST be different.

往事风中埋 2024-10-26 18:55:29

您可能需要查看 EasyHook 来避免一大堆麻烦。

You'll probably want to look at EasyHook to save yourself a whole bunch of trouble.

伏妖词 2024-10-26 18:55:29

您应该在代码中测试机器,看看字长是 32 位还是 64 位。 64 位机器将通过扩展字长来处理 32 位指令集,但是传递 64 位指令集的 32 位机器......可能会导致非常糟糕的事情。

在 C 标准库 limit.h 标头中,INT_MAX 将为您提供最大大小,对其进行测试以查看

bool is32 = true;

if ( INT_MAX == 2^63 − 1 ) {
  is32 = false;
}

一旦获得标志,您就会知道要包含哪个文件,并且可以使用您的标志来包含它。

You should test the machine in your code to see if the word length is 32 or 64 bit. A 64 bit machine will process 32 bit instruction sets by extending the word lengths, but a 32 bit machine that is passed a 64 bit instruction set... could cause really bad things.

In the C standard library limits.h header—INT_MAX will give you maximum size, test it to see

bool is32 = true;

if ( INT_MAX == 2^63 − 1 ) {
  is32 = false;
}

once you have your flag you will know which file to include, and you can use your flag to include it with.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文