HINSTANCE hmod, DWORD dwThreadId ); 当方法执行成功时,返回值是钩子处理函数的句柄,用于在钩子的消息处理中调用 CallNextHookEx 方法。...当方法执行失败时,这里返回 0。...在 CreateWindowEx 创建窗口时传入的消息处理函数会仅处理特定窗口的消息,然而当通过钩子的方式来处理消息的话,无法精确定位到某个特定的窗口,只能针对消息循环所在的线程。...然而 .NET 程序集无法被注入到其他进程;随便用一个其他 dll 时,里面没有被挂接的函数地址,在注入后就会导致目标进程崩溃。...其他问题 如果你在各种折腾之后还是有问题,可考虑去 GitHub 上克隆我的源码,跑一跑试试。在这里:walterlv/Walterlv.Demo.SetWindowsHookEx。
// 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。 HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的 DLL。...); 函数成功则返回钩子子程的句柄,失败返回NULL。 以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程,且被钩子子程先处理。...这个函数成功时返回钩子链中下一个钩子过程的返回值,返回值的类型依赖于钩子的类型。...4、系统钩子与线程钩子: SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。 线程勾子用于监视指定线程的事件消息。...当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用WH_SHELL Hook子程。 WH_SHELL 共有5钟情況: 1.
这些函数可以用来设置全局钩子,通过对特定热键挂钩实现监控的效果,两者的区别在于SetWindowsHookEx函数可以对所有线程进行监控,包括其他进程中的线程,而RegisterHotKey函数只能对当前线程进行监控...当热键被按下时,系统会自动将一个WM_HOTKEY消息发送给注册了该热键的窗口,应用程序需要重载该窗口的消息处理函数来响应该事件,从而实现相应的响应操作。...该函数的返回值由钩子类型和参数决定hMod:包含lpfn的DLL句柄。如果lpfn参数在当前进程内,则该参数可以为NULLdwThreadId:线程标识符,指定与钩子相关联的线程。...如果dwThreadId参数为0,则钩子将应用于所有线程函数会返回一个类型为HHOOK的句柄,该句柄可以在卸载钩子时使用,读者需要注意由于全局钩子会影响系统性能,因此在使用SetWindowsHookEx...传递参数时设置了WH_MOUSE_LL鼠标事件,当有鼠标消息时则通过MouseProc鼠标回调函数执行,#include #include #include <
函数SetWindowsHookEx()实现的就是该功能。...hins,0); return TRUE; } 第一个参数指定钩子的类型,因为我们只用到键盘操作所以设定为WH_KEYBOARD;第二个参数将钩子函数的入口地址指定为KeyboardProc,当钩子钩到任何消息后便调用这个函数...,即当不管系统的哪个窗口有键盘输入马上会引起KeyboardProc的动作;第三个参数是钩子函数所在模块的句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息;...现在,就开始定义当键盘上的键按下时程序要做什么了~ KeyboardProc动作: LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM...message == WM_KEYDOWN) { GetKeyNameText(pMsg->lParam,KeyName,50); MessageBox(KeyName); } 那么当程序窗口显示在面前时按下某个键
这些函数可以用来设置全局钩子,通过对特定热键挂钩实现监控的效果,两者的区别在于SetWindowsHookEx函数可以对所有线程进行监控,包括其他进程中的线程,而RegisterHotKey函数只能对当前线程进行监控...当热键被按下时,系统会自动将一个WM_HOTKEY消息发送给注册了该热键的窗口,应用程序需要重载该窗口的消息处理函数来响应该事件,从而实现相应的响应操作。...该函数的返回值由钩子类型和参数决定 hMod:包含lpfn的DLL句柄。如果lpfn参数在当前进程内,则该参数可以为NULL dwThreadId:线程标识符,指定与钩子相关联的线程。...如果dwThreadId参数为0,则钩子将应用于所有线程 函数会返回一个类型为HHOOK的句柄,该句柄可以在卸载钩子时使用,读者需要注意由于全局钩子会影响系统性能,因此在使用SetWindowsHookEx...传递参数时设置了WH_MOUSE_LL鼠标事件,当有鼠标消息时则通过MouseProc鼠标回调函数执行, #include #include #include
其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数...,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程...,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。...其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数...,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程
当一个事件发生时,如果我们安装的是一个局部钩子(下面有解释,暂时理解为你程序本身中的),我们进程中的钩子函数将被调用。...当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。...Id 第三个参数hMod和第四个参数dwThreadID还有另外一层关系,当第三个参数为NULL是,添加时局部钩子,钩子的回调函数位于当前进程,那么第四个参数就是当前线程的ID–GetCurrentThreadID...();当第四个参数为NULL的时候,则说明添加的是全局钩子,钩子的回调函数与所有的线程关联,此时第三个参数是程序实例句柄; 举例: HHOOK g_hMouse;//全局变量,保存钩子的句柄 LRESULT...::SetWindowsHookEx(WH_MOUSE, MousePro, NULL, GetCurrentThreadId()); </span
LRESULT WINAPI CallNextHookEx( _In_opt_ HHOOK hhk, 保存的钩子过程,也就是SetWindowsHookEx返回值....//取消设置HOOK { if (NULL !..., NULL, NULL, NULL); return CallNextHookEx(g_HookProc, nCode, wParam, lParam);...其实SetWindowsHookEx就是在应用程序执行过程中.替我们加了一层. 而我们提供回调地址那么当操作来了就会通知我们回调.这个时候我们回调函数就可以做我们的事情了....上图我们写的这么多.并没有针对QQ或者其他32位程序注入DLL. 为什么会注入了DLL. 原理: 原理就是我们的窗口程序. 直接使用DLL里面的SetWindowsHookEx设置了一个回调.
如果dwThreadId 指定当前线程定义钩子过程,则该参数为NULL DWORD dwThreadId //为零表示和所有安装的线程相关 ); 一、下面我们来创建一个屏蔽鼠标过程的hook: 1....,NULL,GetCurrentThreadId());//当前线程的钩子过程安装。...四、如何实现在切换到其他线程时,也能响应F2退出程序 在程序中,我们屏蔽了鼠标和键盘,但是我们留下了一个退出程序的后门(F2)。...前面讲过动态链接库共享性的原理,多个进程可以共享同一份代码与数据页, 按道理切换到其它线程之后,按下F2应该也可以退出程序才对, 但是发现当切换到其他程序后,再按F2 程序不会退出, 这是因为系统的页面拷贝机制...我们可以通过创建一个新的节,将全局变量放到这个节当中,然后将这个节设置为一个共享的节, 这样全局变量就可以在多个线程间共享,从而使切换到其他线程时也能按下F2退出程序。
在渗透过程中有时候为了权限维持或者其他等一些操作,比如以前的搜狗输入法可以替换dll文件当用户切换输入法就会去加载我们替换的dll文件,dll文件可以自己编写一些net user或者其他的一些方法,也可以通过...反之如果执行失败返回NULL。 DLL实现代码: // dllmain.cpp : 定义 DLL 应用程序的入口点。...2.lpThreadAttributes:指向SECURITY_ATTRIBUTES结构的指针,该 结构为新线程指定安全描述符并确定子进程是否可以继承返回的句柄。...0x03 APC Inject •线程在进程内执行代码•线程可以利用 APC 队列异步执行代码•每个线程都有一个队列来存储所有的 APC•应用程序可以将 APC 排队到给定的线程(取决于权限)•当一个线程被调度时...PAPCFUNC pfnAPC, HANDLE hThread, ULONG_PTR dwData ); 1.pfnPAC:表示要执行的函数的地址,指向应用程序提供的 APC 函数的指针,当指定的线程执行可警报的等待操作时将调用该函数
当一个事件发生时,如果我们安装的是一个局部钩子(下面有解释,暂时理解为你程序本身中的),我们进程中的钩子函数将被调用。...当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。...看看钩子函数的返回值,若是返回非0值,表示我们已经自己处理了该消息,则消息就不被传递到目标窗口过程。...如果第四个参数是NULL,则说明是全局钩子,那么就是钩子子程与所有的线程关联,此时第三个参数是程序实例句柄; 如果第三个参数是NULL,则说明钩子是局部钩子,说明子程代码位于当前进程,这时候第四个参数就是当前进程的...返回的句柄。
当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用 WH_SHELL Hook 子程。 WH_SHELL 共有5钟情況: 1....对于全局钩子,该参数为 NULL 。 SetWindowsHookEx 返回所安装的钩子句柄。 3 .卸载钩子 当不再使用钩子时,必须及时卸载。...无论何时,当一个进程或线程载入和卸载 DLL 时,都要调用该函数,它的原型是 BOOL WINAPI DllMain (HINSTANCE hinstDLL,DWORD fdwReason, LPVOID...举个例子来说,当有一个进程载入一个 DLL 时,系统分派给 DLL 的第二个参数为 DLL_PROCESS_ATTACH ,这时,你可以根据这个参数初始化特定的数据。...第一种 DLL 的特点是,在编译时把使用的 MFC 代码加入到 DLL 中,因此,在使用该程序时不需要其他 MFC 动态链接类库的存在,但占用磁盘空间比较大;第二种 DLL 的特点是,在运行时,动态链接到
当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook子程。 5....当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用WH_SHELL Hook子程。...当然也可以通过直接返回TRUE来丢弃该消息,就阻止了该消息的传递。 2. 安装钩子 在程序初始化的时候,调用函数SetWindowsHookEx安装钩子。...对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。 参数dwThreadId指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。...参数SetWindowsHookEx返回所安装的钩子句柄。 3. 卸载钩子 当不再使用钩子时,必须及时卸载。
当指定路径时,必须使用反斜线(\)而不是斜线(/)。 //(…) //如果字符串指定了一个无路径的模块名称并且无文件名后缀,则函数默认在模块名称后面添加库文件后缀.dll。...但这样会有一点复杂,因为当DLL模块加载到内存中时我们需要获取其入口点;反射DLL工程的“LoadRemoteLibraryR()”函数部分为我们完成了这项工作。如有需要请参阅源码。...EIP/RIP值;保存的旧值用于在注入代码执行完成时恢复线程的执行流程。...线程开始执行的时候,我们的DLL文件将被加载;而当注入代码执行完成时,执行流程将返回县城挂起点,并从此恢复线程的正常执行流程。 如果你想要调试这种技术方法来学习练习,以下是操作流程。...继续运行程序,当运行到断点处时,注意寄存器RDX中的内存地址,如图所示。如果你对为什么这里需要关注RDX有疑问,请去查阅x64环境下的调用约定;搞清楚再回来继续学习。
看了很多文档,垮了很多坎,终于完成了这个demo; 有很多个人理解,可能不完全正确,见谅; 先上实现的图片: 如图,我通过SetWindowsHookEx()函数向记事本进程中当前窗口线程注入了自己写的...LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) //这是一个键盘钩子消息的回调函数,当设置钩子成功,dll被注入到目标线程...,该回调函数会在每次有键盘消息 //传递给目标线程时被调用,第二个参数在这个类型的钩子中放回的是虚拟键盘的信息,其他两个参数我不太清楚 { MessageBox(NULL, IsNumber(wParam...false; //当找到后就返回false,这样才会终止遍历 } return true; //不是当前窗口,返回true,继续遍历 } int main() { CString TargetProcessName...id 2、设置回调函数,等待其执行 } 再来说说我的思路:我们目标是要找到计算本程序线程id,因为注入函数SetWindowsHookEx的最后一个参数是目标线程id,进程id是 不行的,其实有两种实现方法
对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。 (系统钩子必须在DLL中) 第四个参数:dwThreadId 指定钩子所监视的线程的线程号。...钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。 执行SetWindowsHookEx(),会返回所安装的钩子句柄。...卸载钩子 调用函数 BOOL UnhookWindowsHookEx( HHOOK hhk)卸载钩子,其参数hhk就是执行SetWindowsHookEx()后返回的所安装的钩子的句柄。...无论何时,当一个进程或线程载入和卸载DLL时,都要调用该函数,它的原型是 BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID...举个例子来说,当有一个进程载入一个DLL时,系统分派给DLL的第二个参数为DLL_PROCESS_ATTACH,这时,你可以根据这个参数初始化特定的数据。
通过 SetWindowsHookEx 函数,开发者可以设置键盘或鼠标钩子。当钩子被触发时,回调函数将被执行,我们可以在回调函数中对消息进行处理,甚至可以阻止某些事件的传递。...2.2 SetWindowsHookEx 函数SetWindowsHookEx 是注册钩子的一种方法,函数原型如下:HHOOK SetWindowsHookEx( int idHook, HOOKPROC...hMod:钩子函数所在模块的句柄,通常为 NULL。dwThreadId:指定要拦截的线程的 ID,0 表示拦截所有线程。当钩子触发时,系统会调用指定的回调函数。3....3.1.1 声明 SetWindowsHookEx 函数首先,声明 SetWindowsHookEx 函数并定义回调函数。...按下键盘上的任意键,或者移动鼠标时,都会触发回调函数并输出相应的消息。4. 总结通过本篇文章,您已经学习了如何在 .NET 中使用 Win32 API 拦截鼠标和键盘消息。
涉及Win32 API SetWindowsHookEx (参考 ) UnhookWindowsHookEx (参考 ) 代码实现 要使用钩子首先我们得有一个钩子 我的钩子代码 //定义个委托类型,...private static int HookProcCallback(int nCode, IntPtr wparam, ref IntPtr lparam) { //这里可以进行消息的过滤,返回...0时所有的消息都不会进入下一个钩子 return 0; } 设置钩子到系统的钩子链中 SetWindowsHookEx的定义的参数: 钩子的类型,即它处理的消息类型(比如:键盘钩子,鼠标钩子...,Shell钩子等) 钩子回调函数,即接收的消息由谁处理 需要钩子拦截的程序句柄,0/null为当前进程/模块, 是否为全局钩子,如果为0则与所有线程关联,即全局钩子;否则,这个线程一定属性上一个参数对应的进程...(WH_KEYBOARD_LL, proc, null, 0); if(hkeyboardHook!
由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。...字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。...而GetMessage则是一个具有线程同步行为的函数,如果消息队列中没有消息的话,函数就会一直等待,直到消息队列中至少有一条消息时才返回。...事件发生时导致一个消息加入到消息队列(例如系统注册了一个鼠标点击事件),GetMessage()将返回一个正值,这表明有消息需要被处理,并且消息已经填充到传入的MSG参数中;当传入WM_QUIT消息时返回...该函数只能获取调用线程的消息,不能获得其他线程的消息。成功获取消息后,线程将从消息队列中删除该消息。 使用 GetMessage 函数,如果消息队列为空,函数会一直等待直到有消息到来才有返回值。
=null) hook.UninstallHook(); //定义常量 public const int WH_KEYBOARD_LL = 13; //全局钩子键盘为13...,线程钩子键盘为2 public const int WM_KEYDOWN = 0X0100; //键按下0x0101为键弹起 public static int WM_KEYUP...= 0x0101; public const int WM_SYSKEYDOWN = 0X0104; //键盘处理事件委托 ,当捕获键盘输入时调用定义该委托的方法....返回值 private static int 是否以安装 = 0; //声明一个指向执行函数的函数指针 private HookHandle 执行函数引用...static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam); //获取当前线程
领取专属 10元无门槛券
手把手带您无忧上云