我的理想是能够写出一个可以永不封号的游戏外G

嗯,所以需要学习Windows下编程,最近好不容易有一点点空余时间,抓紧时间读书【Delphi下深入Windows编程】,人丑就该多读书

钩子原理

定义:

消息钩子是创建钩子时在Windows的消息处理链中插入一个函数,一旦钩子安装成功,就可以监控消息,那么向所有应用程序发送的消息都会先经过此函数

安装钩子之前的Windows消息执行流程

安装钩子之后

注意

系统钩子程序必须是动态链接库DLL,不能在可执行文件EXE中完成,这是因为可执行文件在其他进程(另一个可执行文件)中是不可见的,无法实现钩子功能,然而DLL却可以映射到其他进程的空间中去

两个问题:钩子的分类、钩子安装的顺序

  • 钩子有多种,分别用于捕获某一特定类型或某一范围的消息,例如键盘消息、鼠标消息等
  • 对于每种类型的钩子由系统来维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的钩子先获得控制权

挂钩

这一步其实很容易实现,我们需要使用Windows API 函数,只是这个函数的参数有点多,但是万幸不需要我每一个都构造出来,挂钩函数SetWindowsHookEx 将安装应用程序定义的钩子过程到钩子链中

function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK; stdcall;

参数说明

  • idHook:指定安装钩子的类型,这是最麻烦的一个参数,其取值如下
  • lpfn :指定钩子函数的地址,与钩子函数类型有关
  • hMod: 指定毁掉函数的实例,在Delphi中一般设置为HInstance
  • dwThreadId:参数指定了线程ID。钩子函数能够监视由dwThreadId参数定义的线程,或者系统中所有的线程。使用它来过滤并在系统或窗口处理之前处理特定的消息。如果该值为零,表示这个挂钩可以在所有的线程内调用

钩子链

得到控制权的钩子在得到控制权之后,如果想要改消息继续传递给下一个钩子,那么它必须调用CallNextHookEx函数来传递它,否则建议直接返回0

挂钩函数的参数都与挂钩函数的类型有关,但是都有一个相同点:nCode 参数的值可以用来调用挂钩链中的下一个挂钩函数,调用下一个挂钩函数要用到 CallNextHookEx 函数,其声明如下:

Result:=CallNextHookEx(hhk:HHook;nCode:Integer;wParam:WPARAM;lParam:LPARAM);

参数说明:

  • hhk 是当前钩子句柄,由建立钩子时SetWindowsHookEx的返回值
  • nCode 用于调用下一个挂钩函数
  • wParam、lParam都是挂钩类型和挂钩函数有关的参数

摘钩

如果要撤销当前已安装的钩子,则要调用另外一个函数 UnhookWindowsHookEx。函数声明如下:

UnhookWindowsHookEx(    hhk:HHook{待撤销的钩子句柄}):BOOL;

如果主程序调用 UnhookWindowsHookEx 函数把DLL 注入其他进程后,在不同的操作系统下有可能并不会立即退出某些不活动的进程,因此,建议使用SendMessage 向所有进程广播一条消息,从而使DLL完全退出所有的进程,如:SendMessage(HWND,BROADCAST,WM_SETINGCNANGE,0,0)

此次分享没有代码实现,所有的技术都是先有理论,后有技术实现,代码实现后续篇章补上

跨进程的 键盘钩子_Delphi下深入Windows编程之钩子原理一相关推荐

  1. MingW环境下的windows编程

    一般在进行windows编程时都使用vc++精简版,其插入菜单,图片等资源等更简单,且vc中对中文有更好的支持,win7下安装的Mingw中文并不能很好地显示,有光标显示的位置和光标实际位置不符的问题 ...

  2. Android进阶——Android跨进程通讯机制之Binder、IBinder、Parcel、AIDL

    前言 Binder机制是Android系统提供的跨进程通讯机制,这篇文章开始会从Linux相关的基础概念知识开始介绍,从基础概念知识中引出Binder机制,归纳Binder机制与Linux系统的跨进程 ...

  3. Android跨进程通讯机制之Binder、IBinder、Parcel、AIDL

    https://blog.csdn.net/qq_30379689/article/details/79451596 前言 Binder机制是Android系统提供的跨进程通讯机制,这篇文章开始会从L ...

  4. 【转载】Windwos CE 跨进程内存注入

    一.程序实现的先决条件 由于windows系统的窗体消息总是投递至一个特定进程的指定窗体消息函数中.于是在本地进程(自己的应用程序)中取得属于其它进程的窗体的消息必须实现以下两个部分: 1.将需要挂接 ...

  5. 通过SetWindowsHookEx实现跨进程子类化

    这些相关的东西,起源于工作中遇到的一个简单的问题:如何在一个对话框,通过程序,按下另一个对话框(另一个程序)上的当前焦点的按钮. 假设控制的对话框叫DlgA,被控制的对话框叫DlgB. 1.原先的设想 ...

  6. 用跨进程子类化技术实现对其它进程消息的拦载

    大家都知道每个窗口都有默认的窗口函数来进行对窗口消息的处理.   而子类化技术就是替换窗口的窗口函数为自己定义的函数的技术.例如下面的代码: var   Form1: TForm1;   OldWnd ...

  7. 史上最简单Robotium跨进程操作实践——基于ADB框架

    楼主原创,分享不易,转载请注明出处,谢谢. 2015年2月3日更新: 有些朋友在用真机尝试本方法时,抛出了InputStream cannot be null的异常.该异常是由于adb运行在robot ...

  8. flutter_hybird_webview 跨进程渲染的实践技术分享

    theme: channing-cyan 前言 大家好,继 Flutter跨进程混合栈渲染的实践--子进程WebView 之后,利用业余时间对整个插件进行了完善和基础测试,诚然距离投入生产还有一段距离 ...

  9. 跨进程通信,到底用长连接还是短连接

    一个完整的软件系统大多数情况下是由多个进程共同协作进行的,哪怕它们在同一台服务器上.所以,进程之间如何进行高效的通信至关重要. 单个应用程序+单个数据库这套基础开发套餐我相信每个人都经历过,甚至在初期 ...

最新文章

  1. python 中 numpy 模块的 size,shape, len的用法
  2. 算法_Longest Palindromic Substring(寻找最长回文字串)
  3. Ubuntu连接WiFi
  4. 在word中,整篇文章想要在每一章另起一页
  5. 小程序 node.js mysql_基于Node.js+MySQL开发的开源微信小程序B2C商城(页面高仿网易严选)...
  6. 安卓开发环境_我的安卓开发环境
  7. 模块简介与matplotlib基础
  8. eclipse maven项目 class类部署不到tomcat下_Springboot介绍以及用Eclipse搭建一个简单的Springboot项目教程
  9. JAVA 大数运算模板 ACM竞赛必备
  10. T-SQL之条件链接
  11. go语言环境搭建以及监测命令
  12. mPush实战笔记1服务器环境
  13. 多个excel工作簿合并_如何使用Excel VBA将多个工作簿的全部工作表合并到一个工作簿中...
  14. 手把手教你学五笔打字输入法之1(如何快速巧记五笔字型字根表篇)
  15. 简单易懂!推荐给自学python的小项目实战!
  16. 厉建宇的阿里巴巴离职信
  17. JZOJ5912 Van♂Usee
  18. 基于激光投影技术的虚拟键盘
  19. 内网穿透工具--lanproxy
  20. JSP四大作用域,九大内置对象

热门文章

  1. Groq新进展!谷歌TPU原班人马明年发布首款AI芯片
  2. 3.3、苏宁百万级商品爬取 代码讲解 商品爬取
  3. 小心了!一大波存储厂商术语正在靠近
  4. JavaScript-No.01 JavaScript实现封装、继承、多态
  5. 学编程要从什么开始学起
  6. 一个比较全介绍UltraGrid的博客
  7. 构建大数据网络 需要重视这五个地方
  8. kafka最好用的脚本一:kafka-topic
  9. Elixir 1.7改进错误处理、日志和测试
  10. 随心所欲学Java,起步-心理安慰