本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识
代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它...
写这个教程只是为了让玩家更好地体验所爱的单机游戏,顺便学到些逆向知识,我不会用网络游戏做示范,请自重

本章内容主要是认识钩子(hook)

(微软的解释:)钩子(hook)是一种截获事件的机制,一个截获某种事件的函数叫做钩子过程(hook procedure),钩子过程可以处理它接收的每个事件,然后可以改变或取消这个事件

微软提供了API来实现一些钩子:

// 安装钩子,参数是钩子类型,钩子过程,钩子过程所在模块句柄,钩子的目标线程ID
// 如果dwThreadId是0则会安装全局钩子(截获所有进程所有线程的事件)
// 这时除了几种钩子类型,其他的必须把钩子过程写在DLL中,系统会把这个DLL注入到其他进程(本章不讲)
// 返回钩子句柄
HHOOK WINAPI SetWindowsHookEx(_In_ int       idHook,_In_ HOOKPROC  lpfn,_In_ HINSTANCE hMod,_In_ DWORD     dwThreadId
);
// 卸载钩子,参数是钩子句柄
BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK hhk
);
// 把事件传递给下一个钩子
LRESULT WINAPI CallNextHookEx(_In_opt_ HHOOK  hhk,_In_     int    nCode,_In_     WPARAM wParam,_In_     LPARAM lParam
);

更多关于钩子的详细说明请看MSDN:
Hooks Overview

本章会介绍低级键盘钩子(WH_KEYBOARD_LL)和低级鼠标钩子(WH_MOUSE_LL)

低级键盘钩子

低级键盘钩子可以截获准备进入某个线程输入队列的键盘输入消息(键盘按下、键盘弹起),它是少数不用把钩子过程写在DLL的全局钩子之一,而且它只能作为全局钩子
另外还有一个普通键盘钩子(WH_KEYBOARD),它和低级键盘钩子的区别是它截获准备被GetMessage或PeekMessage返回的键盘消息,而且如果要截获其他进程的消息你只能把它写到DLL里然后注入到其他进程
那么问题来了,既然低级键盘钩子的钩子过程没有注入到其他进程,它是怎么被调用的?这个的实现是系统发送个消息到安装钩子的线程实现调用钩子过程,这也意味着安装低级键盘钩子的线程必须有消息循环

完整的监听键盘输入的例程:

#include <Windows.h>// 钩子句柄
HHOOK g_hHook;// 钩子过程
LRESULT CALLBACK kbdProc(int code, WPARAM wParam, LPARAM lParam)
{if (code != HC_ACTION) // 不应该做处理return CallNextHookEx(g_hHook, code, wParam, lParam);PKBDLLHOOKSTRUCT param = (PKBDLLHOOKSTRUCT)lParam;// 按下ESC键退出if (param->vkCode == VK_ESCAPE)PostQuitMessage(0);// 取键名char keyName[200];GetKeyNameTextA(param->scanCode << 16, keyName, _countof(keyName));// 判断是按下还是弹起BOOL keyDown = (param->flags & (1 << 7)) == 0;printf("%s %s\n", keyName, keyDown ? "按下" : "弹起");// 把事件传递给下一个钩子return CallNextHookEx(g_hHook, code, wParam, lParam);
}int _tmain(int argc, _TCHAR* argv[])
{printf("开始监听键盘,按下ESC键退出\n");// 安装低级键盘钩子// GetModuleHandle(NULL)会返回主模块(exe模块)句柄g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, kbdProc, GetModuleHandle(NULL), NULL);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}// 卸载钩子UnhookWindowsHookEx(g_hHook);return (int)msg.wParam;
}

当然,别想用这个盗QQ,有点安全意识的软件都会有密码输入保护的

另外一个钩子WH_JOURNALRECORD也可以用来记录键盘和鼠标消息,但是它不能取消事件

屏蔽A键和把X键替换成Y键的例程:

把钩子过程改成下面这样就行了

 if (code != HC_ACTION) // 不应该做处理return CallNextHookEx(g_hHook, code, wParam, lParam);PKBDLLHOOKSTRUCT param = (PKBDLLHOOKSTRUCT)lParam;// 按下ESC键退出if (param->vkCode == VK_ESCAPE)PostQuitMessage(0);// 屏蔽A键if (param->vkCode == 'A'){// 返回一个非0值会取消这个事件return 1;}// 把X键替换成Y键if (param->vkCode == 'X'){static const int scanCode = MapVirtualKey('Y', MAPVK_VK_TO_VSC);BOOL keyDown = (param->flags & (1 << 7)) == 0;// 模拟输入Y键,这里我就偷懒用keybd_event了...keybd_event('Y', scanCode, keyDown ? 0 : KEYEVENTF_KEYUP, 0);// 取消这个事件return 1;}// 把事件传递给下一个钩子return CallNextHookEx(g_hHook, code, wParam, lParam);

运行后在记事本按下A键和X键试试

对于用DInput输入的程序用低级键盘钩子屏蔽按键是没用的,毕竟这个也只是处理消息,不过可以用来改键(虽然原按键也输入了!)(和SendInput一样,keybd_event指定了扫描码DInput程序也会响应)
想要更底层的屏蔽和真正的改键就用上一章提到的Interception吧(那可是内核级的),这样对所有的程序都有效了

低级鼠标钩子

低级鼠标钩子和低级键盘钩子一样,只不过它截获的是鼠标事件,也有个普通鼠标钩子(WH_MOUSE),和低级鼠标钩子的区别参考低级键盘钩子和普通键盘钩子的区别

完整的屏蔽鼠标移动和鼠标右键的例程:

#include <Windows.h>// 钩子句柄
HHOOK g_hHook;// 钩子过程
LRESULT CALLBACK mouseProc(int code, WPARAM wParam, LPARAM lParam)
{if (code != HC_ACTION) // 不应该做处理return CallNextHookEx(g_hHook, code, wParam, lParam);//PMSLLHOOKSTRUCT param = (PMSLLHOOKSTRUCT)lParam;// 按下鼠标左键退出if (wParam == WM_LBUTTONDOWN)PostQuitMessage(0);// 屏蔽鼠标移动、鼠标右键if (wParam == WM_MOUSEMOVE || wParam == WM_RBUTTONDOWN || wParam == WM_RBUTTONUP){// 返回一个非0值会取消这个事件return 1;}// 把事件传递给下一个钩子return CallNextHookEx(g_hHook, code, wParam, lParam);
}int _tmain(int argc, _TCHAR* argv[])
{printf("开始监听鼠标,按下鼠标左键退出\n");// 安装低级鼠标钩子// GetModuleHandle(NULL)会返回主模块(exe模块)句柄g_hHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, GetModuleHandle(NULL), NULL);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}// 卸载钩子UnhookWindowsHookEx(g_hHook);return (int)msg.wParam;
}

那么键盘鼠标钩子除了盗号外还有什么用呢?比如某些游戏里用热键没用的话可以用键盘钩子作为热键,另外大部分电子教室锁定学生键盘鼠标也是用了低级键盘钩子和低级鼠标钩子

本章内容只是为了认识钩子嘛,以后会讲到更强大的钩子,这也是游戏作弊器的一个重要机制

游戏修改器制作教程二:键盘鼠标钩子相关推荐

  1. 游戏修改器制作教程四:用API读写内存

    本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的 ...

  2. 游戏修改器制作教程⑨:修改D3D渲染

    教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的单 ...

  3. CE游戏修改器制作详解

    傻瓜教程目标是:注重操作,不求深入,主要是为了培养各位的兴趣和带你迅速入门. 先简单介绍下什么叫CE,CE的全称是Cheat Engine. CE是目前最优秀的游戏修改器,不是之一,这个工具绝对值得你 ...

  4. 游戏修改器制作-黑客入门

    工具:SoftICE.金山游侠2002.VC++7.0.PE查看器.SPY++ 测试平台:Window2000 Professional SP2 首先我介绍一下将会用到的工具: 1. SoftICE( ...

  5. 游戏修改器制作教程一:键盘鼠标模拟

    本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的 ...

  6. 发布新版本,以后专用游戏修改器通用框架不做了。

    现在发布的是:专用游戏修改器制作工具.NET版 V1.0.0.0 该制作工具下载地址:http://download.csdn.net/source/195988 专用游戏修改器制作工具完整说明文件: ...

  7. root的游戏修改器,手游root修改器

    有什么好用的游戏修改器? 有<金山游侠>.<梦幻魔盒修改器>.<星云修改器>.<CE游戏修改器>. <金山游侠> 名称:金山游侠修改器下载v ...

  8. python怎么制作游戏修改器_如何使用CE来修改游戏并制作一个修改器

    1 首先下载CE,地址在参考资料里面.http://pan.baidu.com/s/1hqkrPcC打开后启动Cheat Engine.exe和练习软件Tutorial.exe 打开之前最好关闭杀毒软 ...

  9. 【新手教程】如何用C语言写游戏修改器!

    本节教大家如何用基础编程语言C语言写简单的游戏修改器. 用到的工具: 1.VC++6.0(上机通常都会用的) 2.CE 5.4(任何版本都行) 3.当然要一款游戏这里我就用我临时写的C语言小游戏来作为 ...

最新文章

  1. springboot +security +mybatis+thymeleaf 实现简单的用户 角色 权限(资源) 管理
  2. Vista下控件无法安装解决办法
  3. 2021的第一封拒信来自2021年年度青年活动家本科生奖!
  4. 【英语学习】【Level 08】U03 My Choice L6 Stories that make an impact
  5. CSS基础——选择器【学习笔记】
  6. xss BODY ONLOAD=alert(‘XSS’)
  7. 简单Java类和数据库操作及javafx的结合小项目(二)
  8. 初学者上手python建模
  9. js,vue 上传图片前压缩图片(无损压缩,保持在2M以内)
  10. keil的终极配色方案(提供配置文件)
  11. 雷电android模拟器端口,【雷电命令】雷电安卓模拟器修改信息及常用adb命令整理贴...
  12. Mysql全文索引解析
  13. 浅谈一下静态代理IP都能用来干什么?
  14. 2016阿里巴巴73款开源产品全向图
  15. 网络文化经营许可证和icp许可证的区别
  16. 让你更值钱的方法:培养稀缺
  17. windows10更新报错0x80244022的解决方法
  18. Awakening Your Senses【唤醒你的感觉官能】
  19. 数据猿专访农信互联魏春:如何在养猪场实现“普惠金融”?
  20. Rose HA双机热备出现问题及解决方法

热门文章

  1. Navicat使用亮点
  2. 不同电脑之间共享键鼠:sharemouse
  3. 练习使用Geogebra【下载】中的SpreadSheet辅助作图
  4. word2vec原理及其实现(基于python)
  5. Win10强制更改/重置开机密码
  6. EW(EarthWorm) 反向 socks5 代理
  7. 突发!OpenAI 重磅发布 ChatGPT iOS 客户端!无须手续费,直接开通Plus。
  8. 【PowerDesigner】一款超好用的E-R图工具,快速构建出高质量的数据库结构,提高开发效率和代码质量
  9. linux配置ftp服务
  10. (16)调度代码周期性运行