首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使键盘挂钩跨进程全局

要使键盘挂钩跨进程全局,可以使用全局钩子(Global Hook)的方法。全局钩子是一种在操作系统中拦截和处理系统消息的技术。在这种情况下,我们可以使用 Windows 操作系统中的 SetWindowsHookEx 函数来实现全局键盘挂钩。

以下是一个简单的示例代码,展示了如何使用 SetWindowsHookEx 函数挂钩键盘输入:

代码语言:csharp
复制
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class KeyboardHook
{
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;

    public static void Main()
    {
        _hookID = SetHook(_proc);
        Application.Run();
        UnhookWindowsHookEx(_hookID);
    }

    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
                GetModuleHandle(curModule.ModuleName), 0);
        }
    }

    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            int vkCode = Marshal.ReadInt32(lParam);
            Console.WriteLine("Key pressed: " + (Keys)vkCode);
        }

        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
}

这个示例代码使用 C# 编写,它将挂钩键盘输入,并在控制台中打印出按下的键。要使用全局钩子,需要使用 Windows API 函数 SetWindowsHookEx 和 CallNextHookEx。这些函数允许我们在系统级别拦截和处理键盘输入。

请注意,使用全局钩子可能会影响系统性能,因为它需要在操作系统级别拦截键盘输入。因此,应谨慎使用全局钩子,并确保在不再需要时取消挂钩。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

12.1 使用键盘鼠标监控钩子

本节将介绍如何使用Windows API中的SetWindowsHookEx和RegisterHotKey函数来实现键盘鼠标的监控。...这些函数可以用来设置全局钩子,通过对特定热键挂钩实现监控的效果,两者的区别在于SetWindowsHookEx函数可以对所有线程进行监控,包括其他进程中的线程,而RegisterHotKey函数只能对当前线程进行监控...,如果离开了进程窗体则这类热键将会失效,此时我们就需要使用SetWindowsHookEx函数注册全局钩子,该函数可以在系统中安装钩子,以便监视或拦截特定的事件或消息。...如下所示代码则是一个键盘钩子监控案例,在该案例中我们通过SetWindowsHookEx注册一个全局钩子,并设置回调函数LowLevelKeyboardProc通过使用PeekMessageA监控键盘事件...,则可看到如下图所示的输出; 鼠标钩子的挂钩键盘基本一致,只是在调用SetWindowsHookEx传递参数时设置了WH_MOUSE_LL鼠标事件,当有鼠标消息时则通过MouseProc鼠标回调函数执行

40020
  • 12.1 使用键盘鼠标监控钩子

    本节将介绍如何使用Windows API中的SetWindowsHookEx和RegisterHotKey函数来实现键盘鼠标的监控。...这些函数可以用来设置全局钩子,通过对特定热键挂钩实现监控的效果,两者的区别在于SetWindowsHookEx函数可以对所有线程进行监控,包括其他进程中的线程,而RegisterHotKey函数只能对当前线程进行监控...,如果离开了进程窗体则这类热键将会失效,此时我们就需要使用SetWindowsHookEx函数注册全局钩子,该函数可以在系统中安装钩子,以便监视或拦截特定的事件或消息。...如下所示代码则是一个键盘钩子监控案例,在该案例中我们通过SetWindowsHookEx注册一个全局钩子,并设置回调函数LowLevelKeyboardProc通过使用PeekMessageA监控键盘事件...,则可看到如下图所示的输出;图片鼠标钩子的挂钩键盘基本一致,只是在调用SetWindowsHookEx传递参数时设置了WH_MOUSE_LL鼠标事件,当有鼠标消息时则通过MouseProc鼠标回调函数执行

    41431

    .NETC# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?

    都知道可以在任务管理器中查看进程的 CPU 和内存占用,那么如何通过 .NET 编写代码的方式来获取到 CPU 和内存占用呢?...---- 获取全局 CPU 和内存占用 要获取到全系统中的 CPU 占用率,获取全系统中内存占用,需要首先分别创建这两者的性能计数器: 1 2 3 4 // 创建对 CPU 占用百分比的性能计数器。...获取当前进程的 CPU 和内存占用 在了解的 PerformanceCounter 各个参数代表的含义之后,我们还可以获取到单个进程的性能计数。...这里,我们在计算单个进程的内存占用时,使用的是工作集大小,这个值会比较接近我们平时使用任务管理器看到的物理内存占用的大小,但是我们还有其他可以查询的类别: Private Bytes 包含进程向系统中申请的私有内存大小...,不包含跨进程中共享的部分内存。

    4.8K50

    python dll注入 网络_dll注入

    函数对应用程序挂钩(HOOK)迫使程序加载dll; 4.替换应用程序一定会使用的dll; 5.把dll作为调试器来注入; 6.用CreateProcess对子进程注入dll 7.修改被注入进程的exe的导入地址表...以键盘输入事件为例,消息的流向如下: 1.发生键盘输入时,WM_KEYDOWN消息被添加到操作系统的消息队列中; 2.操作系统判断这个消息产生于哪个应用程序,并将这个消息从消息队列中取出,添加到相应的应用程序的消息队列中...比如我们想对所有的键盘消息做挂钩,其取值将是WH_KEYBOARD,WH_KEYBOARD这个宏的值是2。...dwThreadId参数用来指示要对哪一个进程/线程安装消息钩子。如果这个参数为0,安装的消息钩子称为“全局钩子”,此时将对所有的进程(当前的进程以及以后要运行的所有进程)下这个消息钩子。...注意:有的类型的钩子只能是全局钩子。 注意:钩子函数应当放在一个dll中,并且在你的进程中LoadLibrary这个dll。然后再调用SetWindowsHookEx函数对相应类型的消息安装钩子。

    2.1K30

    通过 Windows 用户模式回调实施的内核攻击

    所有者域要么是一个指向某进程或线程结构体的指针,要么是一个空指针(在这种情况下其被认为是一个会话范围的对象)。举个例子会是监视器或键盘布局/文件对象,其被认为在会话中是全局的。...由于对潜在地反向调用至用户模式的函数的追踪非常重要(为了使开发者做出预防措施),win32k.sys 使用它自己的函数命名约定。...窗口对象释放后重用(CVE-2011-1237) 在安装计算机辅助训练(CBT)挂钩时,应用程序能够接收到各种关于窗口处理、键盘和鼠标输入,以及消息队列处理的通知。...(CVE-2011-1241) 键盘布局对象用来为线程或进程设置活跃键盘布局。...SetWindowPos 数组释放后重用 Windows 允许应用程序延时窗口位置更新,这样使多个窗口可以被同时更新。

    1.7K40

    MFC 键盘钩子「建议收藏」

    光想不做可不行,开始行动(您可千万别急着去拿工具箱啊^_^)… 按键能发音,其关键就是让程序能够知道当前键盘上是哪个键被按下,并播放相应的声音,自己的程序当然不在话下,那么其它程序当前按下哪个键如何得知呢...下载本文的全部源代码 大小:552K 二、挂钩(HOOK)的基本原理 WINDOWS调用挂接的回调函数时首先会调用位于函数链首的函数,我们只要将自己的回调函数置于链首,该回调函数就会首先被调用。...那么如何将我们自己的回调函数置于函数链的链首呢?函数SetWindowsHookEx()实现的就是该功能。...另外需要注意的是为了捕获所有事件,挂钩函数应该放在动态链接库DLL中。...在程序中如何调用DLL呢?那就简单了.再用VC++6.0新建一个MFC AppWizard(exe)工程,命名为KeySound,点击”确定”后选择程序类型为对话框,直接点击确定即可.

    1.3K20

    Hook 技术「建议收藏」

    一、原理 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。...当一个事件发生时,如果我们安装的是一个局部钩子(下面有解释,暂时理解为你程序本身中的),我们进程中的钩子函数将被调用。...handle to application instance DWORD dwThreadId // thread identifier ); 函数功能: 该函数将一个应用程序定义的挂钩处理过程安装到挂钩链中去...,那么第四个参数就是当前线程的ID–GetCurrentThreadID();当第四个参数为NULL的时候,则说明添加的是全局钩子,钩子的回调函数与所有的线程关联,此时第三个参数是程序实例句柄; 举例:...HHOOK g_hMouse;//全局变量,保存钩子的句柄 LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam

    65330

    C++内存加密动态免杀defender

    Hook技术被广泛应用于安全的多个领域,比如杀毒软件的主动防御功能,涉及到对一些敏感API的监控,就需要对这些API进行hook;窃取密码的木马病毒,为了接收键盘的输入,需要hook键盘消息;甚至是Windows...那么问题来了,要加密内存2,如何获取内存2的地址? 在32位中,我们可以直接挂钩VirtualAlloc函数截取返回地址。...,那么64位下如何获取获取内存2的地址呢?...2. 64位内存加密 64位实现内存加密要复制一些,不能挂钩VirtualAlloc,而是使用VirtualQueryEx函数: // 检索有关指定进程的虚拟地址空间中的页面范围的信息。...) 改进: 可以将shellcode划分成多个片段,只有正在执行的片段处于解密状态,其它部分处于加密片段,当执行到加密片段时再利用VEH机制解密片段,shellcode划分得越小免杀效果越好,难点在于如何划分

    2.4K62

    对 UAF 漏洞 CVE-2015-2546 的分析和利用

    在触发销毁目标菜单窗口对象之后,用户进程中的利用代码通过巧妙的内存布局,使系统重新分配相同大小的内存区域以占用先前释放的弹出菜单对象的内存块,伪造新的弹出菜单对象并构造相关成员域,在用户进程地址空间中伪造新的子菜单窗口对象和关联的消息处理函数...因此,在此期间攻击者可以在用户进程中触发逻辑使目标弹出菜单 tagPOPUPMENU 对象的内存被释放或重新分配,这将导致目标参数 popupMenu 指向内存区域中存在不可控的数据。...成员域 spwndNextPopup 指向与当前弹出菜单对象直接关联的子菜单的菜单窗口对象;而成员域 spwndActivePopup 用来存储当前正活跃菜单(即当前鼠标或键盘焦点所在的菜单)的菜单窗口对象...前面已经提到,在发送消息时,调用对象指定的消息处理函数之前,系统会调用 xxxCallHook 函数分发调用先前由用户进程定义的 WH_CALLWNDPROC 挂钩处理程序。...通过主线程监听全局变量 bDoneExploit 是否被赋值,并在后续代码逻辑中创建新的命令提示符进程

    1.5K10

    专注XSS站脚本漏洞利用工具

    工具简介 XSS Exploitation Tool是一款渗透测试工具,专注于站脚本漏洞的利用。 该工具仅用于教育目的,请勿在真实环境中使用它!...工具功能: 有关受害浏览器的技术数据 受害者的地理位置 被吸引/访问过的页面的快照 被钩住/访问的页面的源代码 窃取输入字段数据 渗出cookie 键盘记录 显示警告框 重定向用户 工具安装 在 Debian...钩子文件 hook.js 是一个钩子文件 ,您需要将第一行的ip地址替换为XSS利用工具服务器的ip地址: var address = "your server i 工具使用 首先,创建一个页面(或利用站脚本漏洞...)来插入 Javascript 挂钩文件(请参阅根目录下的exploit.html): ?...vulnerable_param= 然后,当受害者访问被挂钩的页面时,XSS利用工具服务器应该列出被挂钩的浏览器

    13310

    Hook技术【移动端&&PC端详解】「建议收藏」

    最近面试说到了这个hook技术,其实就是钩子函数,但是具体如何应用需要一探究竟,私下总结一下。...微软只是简单的将Hook解释为一种过滤(或叫挂钩)消息的技术。 我们这里讲解的Hook,简单解释为:挂钩挂钩一切事物。包含微软的解释。 挂钩的事物通常指的是函数。...钩子的种类很多,每种钩子可以截获相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。...所以说,hook(钩子)就是一个Windows消息的拦截机制,可以拦截单个进程的消息(线程钩子),也可以拦截所有进程的消息(系统钩子),也可以对拦截的消息进行自定义的处理。...当一个事件发生时,如果您安装的是一个线程钩子,您进程中的钩子函数将被调用。

    1.6K20

    对 UAF 漏洞 CVE-2016-0167 的分析和利用

    在触发销毁目标菜单窗口对象之后,用户进程中的利用代码通过巧妙的内存布局,使系统重新分配相同大小的内存区域以占用先前释放的弹出菜单对象的内存块,伪造新的弹出菜单对象并构造相关成员域。...借助代码逻辑,实现对特定窗口对象的成员标志位 bServerSideWindowProc 的修改,使系统能够在内核中直接执行位于用户进程地址空间中的自定义窗口消息处理函数,得以通过内核上下文执行用户进程构造的利用代码...由于在前面函数 xxxMNDestroyHandler 发送 WM_UNINITMENUPOPUP 消息期间执行流可能回调到用户进程中,因此,攻击者可以在用户进程中触发逻辑使目标弹出菜单 tagPOPUPMENU...实现思路是:在某个子菜单通过调用函数 xxxMNOpenHierarchy 实现弹出期间,其自身相关对象还未与父级菜单相互关联时,用户进程发起菜单终止或取消的操作,使菜单进入预终止状态,并使当前已存在于延迟释放链表中的所有弹出菜单对象的成员标志位...在发送这些消息时,执行流会进入由用户进程中的验证代码自定义的挂钩处理程序 xxWindowHookProc 中。

    1K30

    如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使进程也返回一个非零的退出码?

    问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!.../bin/bash for i in `seq 0 9`; do calculations $i & done wait 上述脚本将会等待所有 10 个被创建的子进程结束,但它总会给出退出状态 0...我应该如何修改这个脚本,使其能检测到被创建子进程的退出状态,并且当任何子进程以非零代码结束时,让脚本返回退出码 1?.../usr/bin/env bash # 这是一个特殊的 sleep 函数,它将睡眠的秒数作为"错误代码" # 或"返回代码"返回,以便我们可以清楚地看到,实际上 # 我们在每个进程完成时确实获取了它的返回代码...# 存储上一个子进程启动的 pid echo " pid = ${pids[$i]}" done for pid in $pids; do wait $pid rc=$?

    10000

    HOOK编程

    否则,指向当前进程相关的代码中定义的钩子过程。 HINSTANCE hMod,//动态链接库句柄。...keybroadProc为(只屏蔽空格键): 4.下边添加代码使程序在F2键按下后退出。...要关闭窗口,首先要获得窗口的句柄,先声明一个全局变量Hwnd g_hWnd, 在OnInitDialog()中把窗口句柄传给它: g_hWnd=m_hWnd; 接下来为键盘钩子过程添加代码: 这时我们只能屏蔽主线程的键盘消息...四、如何实现在切换到其他线程时,也能响应F2退出程序 在程序中,我们屏蔽了鼠标和键盘,但是我们留下了一个退出程序的后门(F2)。...我们可以通过创建一个新的节,将全局变量放到这个节当中,然后将这个节设置为一个共享的节, 这样全局变量就可以在多个线程间共享,从而使切换到其他线程时也能按下F2退出程序。

    87010

    从 CVE-2017-0263 漏洞分析到 Windows 菜单管理组件

    在内核第一次释放成员域 pGlobalPopupMenu 指向内存之后执行流回到用户进程时,在用户进程中通过巧妙的内存布局,使系统重新分配相同大小的内存区域以占用成员域 pGlobalPopupMenu...借助代码逻辑,实现对特定窗口对象的成员标志位 bServerSideWindowProc 的修改,使系统能够在内核中直接执行位于用户进程地址空间中的自定义窗口消息处理函数,得以通过内核上下文执行用户进程构造的利用代码...此外,为了追踪菜单如何被使用,win32k 也将一个菜单状态结构体 tagMENUSTATE 与当前活跃菜单关联起来。...在用户进程中首先为验证代码创建单独的线程,利用代码的主体任务都在新线程的上下文中执行。在原有的主线程中监听全局变量 bDoneExploit 是否被赋值以等待下一步操作。...通过主线程监听全局变量 bDoneExploit 是否被赋值;如成功赋值则创建新的命令提示符进程

    72010
    领券