Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >c++钩子函数(react钩子函数)

c++钩子函数(react钩子函数)

作者头像
全栈程序员站长
发布于 2022-07-28 09:18:35
发布于 2022-07-28 09:18:35
1.1K0
举报

大家好,又见面了,我是你们的朋友全栈君。

结合自定义消息映射方面,作为学习的一个总结.

Step1:创建win32动态链接库(an empty project DLL),命名为HookDLL

1:增加一个类,命名为DLL.cpp

2:增加头文件

#include <windows.h>

#include “DLL.h”

3:创建全局变量

#pragma data_seg(“Shared”)

HHOOK mHook=NULL;

HINSTANCE hInstance=NULL;

#pragma data_seg()

4:在DLL.cpp中增加实现几个函数

a.钩子回调函数 LRESULT WINAPI KeyProc(int code,WPARAM wParam,LPARAM lParam)

b. 入口函数

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved)

c. 供外界调用的启动与停止钩子函数

extern “C” __declspec(dllexport) BOOL WINAPI Start()

extern “C” __declspec(dllexport) void WINAPI Stop()

d.自定义消息:#define WM_Hook WM_USER+100

具体代码如下:

LRESULT WINAPI KeyProc(int code,WPARAM wParam,LPARAM lParam)

if(code==HC_ACTION && (lParam & 0xc000ffff) ==1)

char *sName;

BOOL b_sft=::GetAsyncKeyState (VK_SHIFT)>>((sizeof(short)*8)-1);

if(b_sft)

switch(wParam)

{

case ‘1’:sName=”!”; break;

case ‘2’:sName=”@”; break;

case ‘3’:sName = “#”;break;

case ‘4’:sName = “$”;break;

case ‘5’:sName = “%”;break;

case ‘6’:sName = “^”;break;

case ‘7’:sName = “&”;break;

case ‘8’:sName = “*”;break;

case ‘9’:sName = “(“;break;

case ‘0’:sName = “)”;break;

case ‘A’:sName = “A”;break;

case ‘B’:sName = “B”;break;

case ‘C’:sName = “C”;break;

case ‘D’:sName = “D”;break;

case ‘E’:sName = “E”;break;

case ‘F’:sName = “F”;break;

case ‘G’:sName = “G”;break;

case ‘H’:sName = “H”;break;

case ‘I’:sName = “I”;break;

case ‘J’:sName = “J”;break;

case ‘K’:sName = “K”;break;

case ‘L’:sName = “L”;break;

case ‘M’:sName = “M”;break;

case ‘N’:sName = “N”;break;

case ‘O’:sName = “O”;break;

case ‘P’:sName = “P”;break;

case ‘Q’:sName = “Q”;break;

case ‘R’:sName = “R”;break;

case ‘S’:sName = “S”;break;

case ‘T’:sName = “T”;break;

case ‘U’:sName = “U”;break;

case ‘V’:sName = “V”;break;

case ‘W’:sName = “W”;break;

case ‘X’:sName = “X”;break;

case ‘Y’:sName = “Y”;break;

case ‘Z’:sName = “Z”;break;

}

else

switch(wParam)

{

/*0~9*/

case ‘1’: sName=”1″; break;

case ‘2’:sName = “2”;break;

case ‘3’:sName = “3”;break;

case ‘4’:sName = “4”;break;

case ‘5’:sName = “5”;break;

case ‘6’:sName = “6”;break;

case ‘7’:sName = “7”;break;

case ‘8’:sName = “8”;break;

case ‘9’:sName = “9”;break;

case ‘0’:sName = “0”;break;

/*A~Z*/

case ‘A’:sName = “a”;break;

case ‘B’:sName = “b”;break;

case ‘C’:sName = “c”;break;

case ‘D’:sName = “d”;break;

case ‘E’:sName = “e”;break;

case ‘F’:sName = “f”;break;

case ‘G’:sName = “g”;break;

case ‘H’:sName = “h”;break;

case ‘I’:sName = “i”;break;

case ‘J’:sName = “j”;break;

case ‘K’:sName = “k”;break;

case ‘L’:sName = “l”;break;

case ‘M’:sName = “m”;break;

case ‘N’:sName = “n”;break;

case ‘O’:sName = “o”;break;

case ‘P’:sName = “p”;break;

case ‘Q’:sName = “q”;break;

case ‘R’:sName = “r”;break;

case ‘S’:sName = “s”;break;

case ‘T’:sName = “t”;break;

case ‘U’:sName = “u”;break;

case ‘V’:sName = “v”;break;

case ‘W’:sName = “w”;break;

case ‘X’:sName = “x”;break;

case ‘Y’:sName = “y”;break;

case ‘Z’:sName = “z”;break;

}

switch(wParam) //数字键

case VK_BACK:sName=”~”; break;

case VK_NUMPAD1:sName=”1″;break;

case VK_NUMPAD3:sName = “3”;break;

case VK_NUMPAD4:sName = “4”;break;

case VK_NUMPAD5:sName = “5”;break;

case VK_NUMPAD6:sName = “6”;break;

case VK_NUMPAD7:sName = “7”;break;

case VK_NUMPAD8:sName = “8”;break;

case VK_NUMPAD9:sName = “9”;break;

case VK_NUMPAD0:sName = “0”;break;

case VK_MULTIPLY:sName = “*”;break;

case VK_ADD:

sName=”+”;

break;

case VK_SUBTRACT:

sName=”-“;

break;

case VK_DECIMAL:

sName=”.”;

break;

case VK_DIVIDE:

sName=”/”;

break;

HWND H_wnd=::GetForegroundWindow ();

//自定义消息发送

::SendMessage (H_wnd,WM_Hook,wParam, (LPARAM)(LPCSTR)sName);

MessageBox(H_wnd,sName,”键盘提示”,MB_OK);

return CallNextHookEx( mHook, code, wParam, lParam );

BOOL APIENTRY DllMain(HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved)

switch(ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

hInstance=(HINSTANCE)hModule;

break;

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

extern “C” __declspec(dllexport) BOOL WINAPI Start()

if(mHook!=NULL) return FALSE;

//WH_KEYBOARD值为2,键盘消息钩子

//KeyProc 为回调函数

//hInstance:实例

//0:表示全局钩子

mHook=::SetWindowsHookEx (WH_KEYBOARD,KeyProc,hInstance,0);

return mHook!=NULL;

extern “C” __declspec(dllexport) void WINAPI Stop()

//要卸载的钩子

::UnhookWindowsHookEx (mHook);

5.在DLL.h中加入如下函数定义

extern “C” __declspec(dllexport) BOOL WINAPI Start();

extern “C” __declspec(dllexport) void WINAPI Stop();

编译生成HookDll.dll和HookDll.lib

Step 2:

1.新建MFC基本对话框应用程序,命名为HookTest,在其工作目录加入HookDll.dll和HookDll.lib

2.在CHookTestDlg.cpp中加入如下引用

//加入动态链接库的引用

#include “DLL.h”

//隐式调用库文件

#pragma comment(lib,”HookDLL”)

3.加入自定义消息

#define WM_Hook WM_USER+100

4.加入消息映射

BEGIN_MESSAGE_MAP(CHookTestDlg, CDialog) ON_MESSAGE(WM_Hook,OnReceive) //增加部分END_MESSAGE_MAP()

5.在CHookTestDlg.h中加入消息声明

afx_msg void OnReceive(WPARAM wParam,LPARAM lParam);

6.在对话框另加入两个按钮btnStart,btnStop,相应的代码为:

void CHookTestDlg::OnbtnStartHook()

// TODO: Add your control notification handler code here

Start();

void CHookTestDlg::OnbtnStopHook()

// TODO: Add your control notification handler code here

Stop();

7.增加映射函数OnReceive的实现代码

void CHookTestDlg::OnReceive (WPARAM wParam,LPARAM lParam){ CEdit * mEdit=(CEdit *)GetDlgItem(IDC_EDIT1); mEdit->SetWindowText ((LPCSTR)lParam); }

Step 3:

运行程序,点btnStart,按键盘上任意键如A,,将弹出一对话框,并且文本显示回传的A

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128525.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
利用两个dll实现全局钩子
全局消息钩子的钩子函数一定要再dll中,然后启动安装钩子不能在dll中,要是我想在程序开始时安装钩子怎么办。很简单利用两个钩子就行了,只要安装钩子和钩子函数不在同一个dll就行了。
全栈程序员站长
2022/09/06
3320
Windows 反消息钩子(1)
消息钩子在Windows编程中有着非常广泛的应用,它可以任意拦截Windows系统,这个以消息为驱动的系统中的绝大多数消息类型。一方面这给编程者带来了巨大的灵活性,另一方面也埋下了巨大隐患,大多数窃密软件都使用这种方法。此篇文章给您提供一种钩子的反拦截方法,希望对您有所帮助。文章中使用了API钩子,您之前必须对此技术有一定了解。 为求完整,文章分为两部分,第一部分为消息钩子的使用,熟悉此技术的读者可以直接跳过此节。第二部分为消息钩子的反拦截。
全栈程序员站长
2022/09/17
5780
消息钩子的反拦截
首先声明一下,标题所指的钩子是消息钩子,而不是API钩子(一种对API地址的替换技术)。若标题使您误解,请不要继续阅读。 消息钩子在Windows编程中有着非常广泛的应用,它可以任意拦截Windows系统,这个以消息为驱动的系统中的绝大多数消息类型。一方面这给编程者带来了巨大的灵活性,另一方面也埋下了巨大隐患,大多数窃密软件都使用这种方法。此篇文章给您提供一种钩子的反拦截方法,希望对您有所帮助。文章中使用了API钩子,您之前必须对此技术有一定了解。 为求完整,文章分为两部分,第一部分为消息钩子的使用,熟悉此技术的读者可以直接跳过此节。第二部分为消息钩子的反拦截。 一、消息钩子的使用。 消息钩子分为本地(local)和远程(remote)两种(两个local system-wide hook例外,无关主题,不多说了)。local类型的钩子函数只能拦截本进程的消息。能够拦截本进程以外的消息的钩子,都是remote类型。remote类型的钩子必须放在DLL里面。下面以remote类型为例,通过安装键盘钩子介绍其使用。 1、首先建立DLL,在头文件中添加如下代码。 #ifdef KM_EXPORTS #define KM_API __declspec(dllexport) #else #define KM_API __declspec(dllimport) #endif KM_API BOOL HookStart();//安装钩子 KM_API BOOL HookStop();//卸载钩子 2、在.cpp文件中添加代码 #pragma data_seg(“Shared”) HHOOK g_hhookKey=NULL; #pragma data_seg() #pragma comment(linker,”/SECTION:Shared,RWS”) g_hhookKey为键盘钩子的句柄,为确保此数值在所有实例中均保持不变,将其存放于此模块所有实例的共享数据区,若在exe程序中按此格式添加一int 变量 appNum,在程序启动时appNum++,则可以通过访问此变量的数值,确定有多少个exe的实例,当然这种方法也可以替代同步对象用于只启动一个实例。 HINSTANCE g_hinstDll=NULL; //添加全局变量用于记录此DLL模块的句柄 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: g_hinstDll=(HINSTANCE)hModule;//在DLL加载时对全局变量赋值 ……………… } } LRESULT KeyHookProc(int nCode,WPARAM wParam,LPARAM lParam)//键盘钩子的过滤函数 { ………………… return::CallNextHookEx(g_hhookKey,nCode,wParam,lParam);//*****请留意此行代码***** } BOOL HookStart()//安装钩子 { g_hhookKey=::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHookProc,g_hinstDll, ::GetWindowThreadProcessId(::FindWindow(NULL,”被监视的窗口的标题“),NULL) ); return (g_hhookKey!=NULL); } BOOL HookStop()//卸载钩子 { BOOL ret; if(g_hhookKey!=NULL) ret=::UnhookWindowsHookEx(g_hhookKey);
全栈程序员站长
2022/09/17
6210
3.4 DLL注入:全局消息钩子注入
SetWindowHookEx 是Windows系统的一个函数,可用于让一个应用程序安装全局钩子,但读者需要格外注意该方法安装的钩子会由操作系统注入到所有可执行进程内,虽然该注入方式可以用于绕过游戏保护实现注入,但由于其属于全局注入所以所有的进程都会受到影响,而如果想要解决这个问题,则需要在DllMain()也就是动态链接库开头位置进行判断,如果是我们所需操作的进程则执行该DLL模块内的功能,如果不是则自动跳过不执行任何操作即可实现指定进程的注入方式。
王瑞MVP
2023/09/13
8341
C/C++ 实现常用的线程注入
各种API远程线程注入的方法,分别是 远程线程注入,普通消息钩子注入,全局消息钩子注入,APC应用层异步注入,ZwCreateThreadEx强力注入,纯汇编实现的线程注入等。
王瑞MVP
2022/12/28
7330
windows api学习笔记-键盘钩子
DLL项目的头文件 #ifdef KEYHOOKLIB_EXPORT //此宏将在CPP文件中定义 #define KEYHOOKLIB_API __declspec(dllexport) #else #define KEYHOOKLIB_API __declspec(dllimport) #endif #define HM_KEY WM_USER+101 BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall,DWORD dwThreadId = 0,
liulun
2022/05/09
4860
聊一聊 WPF 程序的键盘是如何被窃听的?
不管杀毒软件流氓不流氓,在如今病毒肆虐的当下互联网,装一个还是能帮我们拦截很多意想不到的东西,为了眼见为实,这一篇我们就聊一个窃听 键盘事件 的恶意代码。
独立观察员
2022/12/31
5710
聊一聊 WPF 程序的键盘是如何被窃听的?
滴水逆向初级-win32(四)
4.1.C语言中的宽字符 1、常用函数 char wchar_ t //多字节字符类型 宽字符类型 printf wprintf //打印到控制台函数 strlen wcslen //获取长度 strcpy wcscpy //字符串复制 strcat wcscat //字符串拼接 strcmp wcscmp //字符串比较 strstr wcsstr //字符串查找 2、打印宽字符 #include <locale.h> setlocale(LC_ALL,") /
zhang_derek
2021/04/13
2.4K0
键盘钩子入门
钩子是操作系统消息处理的一种机制。通过钩子,应用程序可以安装一个钩子回调过程让系统调用,从而监视系统中的消息队列。在这些消息到达目标窗口之前对这些消息进行处理。
全栈程序员站长
2022/08/11
1K0
键盘钩子入门
c++ 实现键盘钩子
  主要实现的是将windows活跃或是顶层窗口的键盘输入的记录下来储存在txt文件中。主要用到的知识windows操作系统的消息机制,动态库等一些知识
全栈程序员站长
2022/09/01
6310
自由控制程序运行方式的编程技巧
本篇继续阅读学习《有趣的二进制:软件安全与逆向分析》,本章是自由控制程序运行方式的编程技巧,主要介绍调试器的原理、代码注入和API钩子
红客突击队
2022/09/29
6870
自由控制程序运行方式的编程技巧
C/C++ 实现远程线程DLL注入
远程线程注入是最常用的一种注入技术,该技术利用的核心API是 `CreateRemoteThread()` 这个API可以运行远程线程,其次通过创建的线程调用 `LoadLibraryA()` 这个函数动态载入指定的DLL即可实现运行DLL, 而`LoadLibrary()`函数在任何一个可执行文件中都可以被调用到,这就给我们注入提供了有效的条件.
王瑞MVP
2022/12/28
6470
c++DLL编程详解
DLL(Dynamic Link Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库
拾点阳光
2018/05/10
2.4K0
C/C++ ImGUI劫持Dx9绘制窗体
ImGUI 是一个无任何第三方依赖的图形化界面组件,其支持多种绘图引擎,ImGUI可用于绘制辅助菜单功能,注入游戏内部方便快捷。
王瑞MVP
2022/12/28
9910
C/C++ ImGUI劫持Dx9绘制窗体
C++基础语法梳理:Windows 的动态链接库
GUI(Graphical User Interface)应用,链接器选项:/SUBSYSTEM:WINDOWS
玖柒的小窝
2021/11/01
1.2K0
漏洞分析丨cve20144113
Microsoft Windows下的 win32k.sys是Windows子系统的内核部分,是一个内核模式设备驱动程序,它包含有窗口管理器、后者控制窗口显示和管理屏幕输出等。如果Windows内核模式驱动程序不正确地处理内存中的对象,则存在一个特权提升漏洞。成功利用此漏洞的攻击者可以运行内核模式中的任意代码。攻击者随后可安装程序;查看、更改或删除数据;或者创建拥有完全管理权限的新帐户。其中CVE-2014-4113就是Win32k.sys中的一个漏洞,该漏洞的根本问题是函数xxxMNFindWindowFromPoint的返回值验证不正确。xxxMNFindWindowFromPoint函数执行后返回win32k!tagWND的地址结构或错误代码-1,-5。在该函数后面将调用函数xxxSendMessage,xxxSendMessage把xxxMNFindWindowFromPoint的返回值作为参数传递。当xxxMNFindWindowFromPoint返回win32k!tagWND地址的时候程序正常执行,但当返回-1,-5的时候传递给xxxSendMessage将造成蓝屏。
极安御信安全研究院
2023/04/20
6060
漏洞分析丨cve20144113
DLL注入之使用SetWindowsHookEx注入「建议收藏」
本次介绍的是使用全局钩子的方式进行注入。在Windows中可以使用SetWindowsHookEx来设置消息钩子,这个函数除了可以设置当前进程的钩子之外,它还可以设置全局钩子。全局钩子,顾名思义,即当前正在运行的进程都会被设置相应的钩子。
全栈程序员站长
2022/08/27
1.6K0
DLL注入
继续学习《逆向工程核心原理》,本篇笔记是第三部分:DLL注入,主要包括三种DLL注入、DLL卸载、修改PE、代码注入等内容
红客突击队
2022/09/29
1.8K0
DLL注入
FPS游戏:实现D3D Hook劫持透视
FPS游戏可以说一直都比较热门,典型的代表有反恐精英,穿越火线,绝地求生等,基本上只要是FPS游戏都会有透视挂的存在,而透视挂还分为很多种类型,常见的有D3D透视,方框透视,还有一些比较高端的显卡透视,本教程将学习D3D透视的实现原理,并通过DLL注入的方式实现透视。
王瑞MVP
2022/12/28
2.5K0
FPS游戏:实现D3D Hook劫持透视
常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战.
钩子回调根据SetWindowsHookEx参数1来设定的.比如如果我们设置WH_CBT 那么我们设置的回调函数就是CBT回调. 具体查询MSDN
IBinary
2018/08/30
14.6K0
常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战.
相关推荐
利用两个dll实现全局钩子
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档