- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这里是一些背景信息。我正在通过 AppInit_DLLs
注册表项替换已在 dll 注入(inject)技术中使用的 dll。它的目的是出现在每个进程中,并在 GDI32.dll 中设置 Hook 以收集有关打印的信息。这是一种获得我们想要的东西的时髦方式。 .dll 本身已有 10 多年的历史(用 Visual Studio 97 编写),我们想用比注入(inject)的 dll 侵入性更小的东西替换它。
看起来 SetWindowsHookEx()
可能就是我们要找的东西。我一直遇到一些麻烦,但我也和同事讨论过这棵树是否值得吠叫。以下是一些我们无法确定的问题:
当我们从 dll Hook 例程时,例如来自 GDI32.dll 的 StartDoc()
,我们真的会在每次其他进程使用该例程时收到通知吗从那个 dll 中提取出来?这是我们通过注入(inject)的 .dll 获得的一种功能,我们今后需要相同的功能。
当钩子(Hook)被触发时,钩子(Hook)处理程序是运行在发起实际调用的进程的进程空间,还是运行在设置钩子(Hook)的进程的进程空间? 我的意见是它必须在调用例程的进程的进程空间中运行。例如,如果程序从 GDI32.dll 调用 StartDoc()
,它会将 Hook 处理过程代码“注入(inject)”到它的空间并执行。否则,将必须在调用进程和设置 Hook 的进程之间自动建立一些进程间通信,但我认为情况并非如此。此外,这个 Hook 处理例程在调用进程的进程空间中运行是必要的,因为它需要知道的一件事是调用进程的名称,而且我不确定如何获取该信息,如果它实际上并没有在那个进程中运行。
如果 Hook 处理例程是使用 .NET 托管环境编写的,当它挂接到一个不使用 .NET 托管环境的进程时会中断吗?我们真的很想在这里离开 C++ 并使用 C#,但是如果我们的钩子(Hook)从不受管理的进程中调用会发生什么?如前所述,我认为我们的钩子(Hook)处理程序将在最初调用被钩子(Hook)例程的进程中运行。但如果这是真的,那么我认为如果此进程未使用 .NET 运行时环境但传入的 Hook 处理代码是,我们会遇到麻烦。
最佳答案
是。
一般来说,它是前者:它在它 Hook 其事件的进程的上下文中执行。
SetWindowsHookEx
调用成功后,操作系统自动将钩子(Hook)DLL(包含回调函数的)注入(inject)所有满足指定钩子(Hook)要求的目标进程的地址空间类型。 (当然, Hook 代码不一定立即注入(inject)。)
此一般规则的异常(exception)是低级键盘和鼠标 Hook (WH_LL_KEYBOARD
和 WH_LL_MOUSE
)。由于这些 Hook 类型未注入(inject)客户端进程,因此在最初调用 SetWindowsHookEx
的同一线程中调用回调。
最后一点对于回答您的第三个问题很重要。由于低级键盘和鼠标 Hook 是仅有的两种不需要 DLL 注入(inject)的全局 Hook ,因此它们也是仅有的两种可以在托管 .NET 代码中编写的 Hook 类型。
对于其他钩子(Hook)类型,您在问题中表达的担忧是完全正确的。您需要用 C 或 C++ 编写这些 Hook DLL。当然,您的应用程序的其余部分仍然可以用托管语言编写。唯一重要的是 Hook DLL。
您可以考虑查看 Microsoft Detours或 EasyHook .
关于windows - 关于 SetWindowsHookEx() 和 Hook 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9025565/
我想捕获用户键盘输入以对键盘媒体键做出良好 react :播放/暂停,尤其是下一个和上一个。我尝试将 SetWindowsHookEx 与低级 WH_KEYBOARD_LL 参数一起使用,以确保我可以
我正在使用 SetWindowsHookEx 将 dll 注入(inject)另一个进程。但是,当注入(inject)程序退出时,dll 会从其他进程中卸载。无论如何我可以停止卸载吗?基本上,无论注入
我正在尝试向类中添加低级鼠标 Hook 。我可以通过将这个函数放在我的 CPP 文件中来做到这一点: LRESULT CALLBACK MouseHookProc(int nCode, WPARAM
我不太了解SetWindowsHookEx() 的文档。我知道要在第一个参数中放入什么,但对于第二个、第三个和第四个我感到困惑。 第二个参数询问 HOOKPROC 是不是就像一个普通的 windows
我想在创建窗口之前使用 SetWindowHookEx 在进程中捕获 WM_CREATE(或 HCBT_CREATEWND)消息。 使用 hMod 和 dwThreadId 可以定义 Hook 是否在
好吧,我尝试了不同的解决方案来解决我的问题,但它就是行不通。 我调用了 SetWindowsHookExA,然后当我按下一个键时,消息框没有显示。怎么办? 这是我的代码(这是一个由程序加载的另一个 D
动态链接库代码: LRESULT CALLBACK CBTNewProc(int nCode, WPARAM wParam, LPARAM lParam) { std::ofstream fi
我的键盘记录器有问题。直到今天,每个经过测试的系统都运行良好,除了 Windows 7 Embedded Standard 32 位,它显然与当前版本不符。 我需要做的是记录从键盘输入的按键,直到我得
我在 WM_MOUSE 上定义了一个全局钩子(Hook),它可以完美运行一段时间。每次鼠标移动时,它都会向特定窗口发送一条消息。 在某个随机时间后, Hook 停止发送消息。如果我注销并注册 Hook
首先:我在 Windows XP - 32 位上使用 Visual Studio 2010。 现在我正在尝试编写一个 DLL,它将使另一个应用程序能够使用低级键盘 Hook 。 即使我让它工作了 -
我正在尝试升级旧应用程序以在 Windows 7 上运行,但我在使用 Journal Hooks 的“宏录制”功能时遇到问题。我已遵循在 Windows 7 上执行此操作所需的所有步骤,即设置 uiA
我正在Delphi中编写笑话程序(当用户使用鼠标或键盘时发出奇怪的声音),它使用全局钩子(Hook)来捕获鼠标和键盘事件。 这是负责处理这个钩子(Hook)的函数: procedure MKHOOK(
我正在使用以下代码获取当前进程的鼠标消息。 using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule
HHOOK WINAPI SetWindowsHookEx( __in int idHook, __in HOOKPROC lpfn, __in HINSTANCE hMod, __in
我正在尝试修改一款旧游戏,更具体地说,我想通过 Xbox Controller 输入来模拟键盘输入。我已经让游戏 handle 输入正常工作,但游戏忽略了我用 PostMessage 创建的假输入(我
您好,在此先感谢所有愿意提供帮助的人。我正在尝试设置一个 CBT windows Hook ,当我在全局设置它时效果很好,但每当我尝试将它附加到单个线程时都会失败。据我所知,我按照这本书做每件事:-
我在 C# 中创建了简单的控制台,它使用 SetWindowsHookEx 和 LowLevelKeyboardProc 来捕获键盘事件并将它们记录在 Windows 上。 这很有效,但是我知道我想创
我有这段代码,它为低级事件设置键盘钩子(Hook),然后显示一个消息框。 HHOOK keyboardHook = SetWindowsHookEx (WH_KEYBOARD_LL, HookKey,
我有一个带有嵌入式 v8 引擎的小型控制台应用程序,我想添加一个 Hook 来注册按键事件。这一切在我使用 Qt 和 QtScript 之前都有效,但我将它全部移植到 VC++ 2008 中的直接 C
我正在创建一个控制台应用程序,我想在其中记录按键操作(例如向上箭头)。我创建了一个低级键盘 Hook ,它应该捕获任何线程中的所有按键并调用我的回调函数,但它不起作用。当我按下一个键时,程序会暂停一点
我是一名优秀的程序员,十分优秀!