Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选

首页 / 软件开发 / C++ / 更改屏幕显示数据的作弊程序

更改屏幕显示数据的作弊程序2010-12-30欧胜军前言

本文(其实是随笔)和实例代码描述的内容主要包括:API拦截,消息钩子,枚举子窗体,注册系统热键。其中消息钩子、API拦截、枚举子窗体实现代码在dll中,注册系统热键代码实现在测试exe中,另外exe代码段还涉及自定义消息和系统栏图标。希望对你有用。

一年过去了,仍然是老样子——为生活而奔波、为money而忙碌。好在身体还蛮健康,吃得好,睡得香:-)但愿新的一年里腰包会鼓一些。今天整理硬盘,发现了这些代码,回想当初开始写的时候好像还在 VCKBASE 论坛里提出过一些问题,也得到了论坛很多朋友的热心帮助,在此感谢。本来想好好的写一下心得,特别是能让VC初学者学到一些东西。但自己语文功底太差,就只能想到哪写到哪了。希望你边品茶,边上网,一手聊天,一手回帖,左眼看PP,右眼能坚持看完下面的这些方块字。

写这个程序的来由:最初由于客户的需求不是很明显,只是说把他的一个数据库程序的数据作一个临时性的欺骗,以应付检查(谁检查就不知道了,哈,让我写作弊程序呢,考我呐),唯一的要求是不更改真实的数据。我其实比较头疼数据库,就想不研究他的数据库结构了,心想采用一个比较懒的办法实现就行了。9月份的时候我也挺闲的,在网上狂搜了一通之后,基本就决定用屏幕取词的方式来做了。就是截获显示到屏幕上的数据,只要是数字类型的,就乘以一个基数,然后把算好的数据回写到屏幕上。其实这个屏幕取词的技术网上早就公开了,我也刚好想顺便练练手。写得差不多的时候,吐血的时候也就到了,客户要求除了临时欺骗之外,还要把显示的数据当场用原来程序上的打印按钮打印出来。我傻眼了,所以也就废弃了这种方法,吐了一通血、憋了一通气、老老实实的研究了原程序的数据库结构,还好是 SQL Server 2K,以前弄过,终于赶在检查之前交了活。

一不小心就说了这么多废话。好了,转到正题。下面分别道来:

拦截API(或者说截获API 反正一个意思)

先说说截获API了,在HOOKAPI.h和cpp文件中,这个是繁体版本。网上流行很多个版本,我觉得还是这个比较简洁一点(简单万岁嘛)。原作者不知道是台湾还是香港的,注释用的BIG5码。截获API一般就几个步骤:

获得函数地址(GetProcAddress),取得被拦截的函数地址和要替代这个被拦截的函数的地址(也就是拦截后要处理的函数);

形成JMP指令(__asm),准备避开被拦截的函数跳转到处理函数直接处理;

设置内存可写(VirtualProtect),跳转后的函数执行;

记得恢复内存。

网上关于API拦截的教程很多,反正我也说不清楚就不多说了。其实我的理解很简单,就是想办法打开老板办公室的们、潜入、然后替换奖金单、然后关门、走人……就这么简单。注意点有三个:一个就是原函数的地址,在哪个dll中,别查错了;一个就是替换函数的参数,必须遵照游戏规则,该什么类型就什么类型;另外一个就是内存的读写顺序,不能漏也不能反。具体可以参考HookAPI的代码段,这里就不帖了。

钩子(Hook)

关于消息钩子,其实就两句话:SetWindowsHookEx ,UnhookWindowsHookEx ,装载钩子和卸载钩子,不过也就这两句话,学写钩子的时候,折腾了好一阵子。给初学者一个建议:理解瘟到死的消息机制,暂时放下MFC,尝试写至少一个SDK程序,动手写之前,好好看看MSDN,很多问题都可以在这里得到答案。SetWindowsHookEx有四个参数,主要就是注意1和4这两个参数,第一个参数建议少用WH_CALLWNDPROC 除非必须这么做。一般情况下,有消息,键盘和鼠标钩子就够用了,当然特殊情况除外。