找到两篇文章,是比较流行的方法,接下来记录一下收获:

第一篇文章:

“变速齿轮”研究手记

转自: http://www.newasp.net/tech/58262.html

注意:如果你看了本文,对我们这个软件有兴趣,请到我们的主页www.vrbrothers.com下载。

注:为节省篇幅,本文对一些计算机术语直接使用而没有作详细的解释,读者若有不熟悉之处,建议参考清华大学出版社出版,周明德编著的《微型计算机系统原理及应用》一书中关于8253/8254定时器和x86保护模式的相应章节。

“变速齿轮”研究手记
      
   也许是我孤陋寡闻吧,说出来不怕您笑话,对于“变速齿轮”这样著名的软件,我一直到五天前,也就是2001年2月28号才第一次听说。我有几个同学很喜欢玩图形MUD,整天见了面就在一起切磋“泥”技。我对MUD本身并没有多大兴趣,但是那天早上偶尔听他们说某个MUD站点明文规定严禁使用“齿轮”,这才好奇地问他们什么是“齿轮”。别人告诉我,“齿轮”是一个软件,能对Windows下的游戏加速,他们在玩MUD时就依靠这个软件作弊。这不禁令我一头雾水,能让Windows游戏改变速度,太神奇了!
   我一贯对技术很有兴趣,听说有这么一个神奇的软件,当然要想想它是怎么实现的。这个软件看起来并不复杂,我原以为一个早自习好好琢磨琢磨就行,可是我想了好几节课,始终不得其要领。说来也巧,我们这学期有一面必修课是Linux内核原理分析,这几天正好学到了进程调度,老师说,当一个时钟中断发生的时候,操作系统要做很多事情,比如必要时要重新调度进程从而实现抢先式多任务,还要更新系统时钟......慢着,我突发奇想,如果让时钟中断产生的更快,会发生什么事情呢?
   我们已经学过“微机原理”这门课程,我知道让时钟中断产生的更快不是难事,以前我就用DOS下的汇编语言写过这样的程序,这是我们当时的作业。可是我以前的程序在Windows下虽然可以运行,但并不能对Windows系统加速,道理很显然:Windows9x是使用x86虚拟机的机制来兼容DOS程序的,我的程序只能改变虚拟机,就是那个黑窗口的时钟中断。
   于是我试图把以前的DOS程序搬到32位环境中。用VC内嵌汇编做这件事再合适不过了,在一个VC程序框架中加上一个__asm,然后只管把以前的汇编程序往里贴就行。我满怀希望地运行这样一个拼凑出来的怪物,结果,出现了一个大家都很熟悉的“该程序执行了非法操作”,我的试验以失败告终。
   后来冷静下来仔细想想,这次失败的原因是显然的。Windows作为一个复杂的32位操作系统,如果能让你随便对硬件进行操作,那也许运行不了几个程序就崩溃了。但是如何绕过操作系统去操作硬件呢?我首先想到了vxd,编写一个驱动程序肯定可以操作硬件,但是,很可惜,我不会设计驱动程序。于是我想到了以前看到的CIH的源码,CIH没有写vxd,却能操作硬件去烧毁BIOS,陈盈豪真是太伟大了,他的程序精巧之处我至今记忆犹新。于是我模仿他的技术,修改IDT表,创建一个中断门,然后发生中断,进入ring0,现在我可以做任何事情了,按照以前的DOS程序那样,往8253定时器里写一个控制字,再分两次写入新的时钟中断发生频率,一切顺利!(详细技术请您参考我的“兄弟变速器”源码)我看到VC编辑区的光标疯狂的闪烁;双击已经失效了,因为Windows认为我双击的时间间隔太长;Windows任务栏右方的时间飞快跳动,应该说,我已经成功了。
   当时我想当然的以为“变速齿轮”的原理也是如此,可是当我从同学那里把“齿轮”拷来并研究时,发现Windows的时钟并不变快,而游戏速度照样可以加上去,也就是说,“齿轮”采用了与我的程序不同的技术,是什么技术呢?我决定继续研究。
   我访问了“变速齿轮”的主页,这个主页上有一个“你问我答”的栏目,由“齿轮”的作者王荣先生进行技术支持。我试图在这里找到一些关于“齿轮”的技术细节,但是很可惜,没有找到,王荣先生只是告诉大家这个程序不能用VB编写等等根本连皮毛也不涉及的问题,好不容易见到一个外国人问能不能公布源代码,其实这也是我想问的,但是王荣先生明确表示不行,这不禁令我感到非常失望。
   我也想过写信去索取原码,也许他不向外国人公布,中国人可不一定。但是咱们“臭老九”最爱一个面子,我实在拉不下脸去问。这时已经是晚上10点了,我决定祭出SoftIce,用一夜时间去研究他的程序。
   当时使用的工具是SoftIce,WD32ASM和VC,手边两本参考书是《微型计算机系统原理及应用》和《Linux操作系统内核分析》(都是我们的课本,呵呵)。
   起初,“变速齿轮”0.2版的一个叫hook.dll的文件很大程度上吸引了我的注意力,我怀疑他使用Windows消息钩子实现变速,消息钩子我很熟悉,但我把MSDN上面关于钩子的介绍看了好久,也没有想出它和变速有什么联系,这时偶然看了一下在王荣先生的主页上得到的“变速齿轮”0.1版,才发现老版本中并没有这个文件,也就是说,我只需要反汇编他的主程序就够了,于是,二话不说,用WD32ASM先把0.1版的“齿轮”给拆了,汇编代码5000多行,并不算多。
   我是从这个程序的导入函数着手的,以前编程时用于定时的SetTimer,timeGetTime,timeSetEvent等等这里都导入了,看看它们被引用的地方,我发现这些函数都是集中出现的,而且大都以这样的形式出现:
   * Reference To: WINMM.timeGetTime, Ord:0098h
   :00401F3E 8B0D64424000\tmov ecx, dword ptr [00404264]
   :00401F44 8B11\t\tmov edx, dword ptr [ecx]
   也就是说,他并没有调用这些函数,只是取得了函数的入口地址,保存在ecx中,然后又根据这个入口地址得到了函数的前面几个字节,保存在edx中。
   这让我想到了前些日子在CSDN上面和别人讨论的Hook API的原理,当时我还索取了一份Hook API的例程,如果我要Hook这里的函数timeGetTime,修改ecx中的地址或者修改edx处的头几条指令就行,用汇编语言写,与上面看到的这段代码类似。
   为了测试“齿轮”是不是要Hook这里的timeGetTime,我自己编写了一个很简单的小程序,调用timeGetTime,每秒钟显示一个数字。用“齿轮”进行加速后,果然显示的速度快多了(下边贴上我根据作者说的写的代码)。再用SoftIce跟进这个timeGetTime函数,第一条指令变成一个跳转,这充分说明“齿轮”确实Hook了这几个API,不难猜测,他要改变函数的返回值,也就是说在timeGetTime结束时还要再跳入“齿轮”自身的代码,耐心跟下去,我发现回到timeGetTime时栈里多压了一个地址,这样,当timeGetTime用ret指令返回时,先返回“齿轮”的代码(这个思想确实很巧),返回值经过处理后,才跳回我的应用程序。至于怎么处理这个返回值就简单了,改到原先的2倍,应用程序速度也就提高了2倍。
   回头再看WD32ASM反汇编的代码,我又发现在Hook API前面的不远处使用了一次SGDT指令和两次SLDT指令,这是x86保护方式的特有指令,用于获得全局描述符表,进一步得到局部描述符表,这段代码引起了我的兴趣,用SoftIce跟进去,往下走几步,一边跟一边猜,大致整理出了这样的思路:
   1.创建一个内存映射,把自己的代码映射到0x80000000以上的地方,在Win9x下,这块虚存是所有进程共享的。
   2.先得到局部描述符表的地址,然后利用这张表修改代码段的特权级。
   3.用局部描述符表创建一个调用门,在x86的保护模式下要进入ring0必须通过门来进行,CIH是用中断门完成的,这里用调用门完成,异曲同工。
   4.保存几个关键函数前六个字节,改为一条跳转指令,跳到自己已经映射到高端的代码。
   5.发生函数调用时进入自己的代码,通过调用门进入ring0,恢复函数开头的几个字节,修改返回值。

   这时已经是凌晨5点了,既然主要思想已经掌握,我也就没有细看这段代码,8点钟还要上课,睡觉去也。
   回头想想,我认为王荣先生的代码还有几点值得推敲之处:
   1.如果要Hook API,一定要改变函数的第一条指令吗?如果仅仅改变函数的入口地址,不是既容易编也容易调试吗?
   2.即使要改变函数第一条指令,一定要进入ring0吗?
   3.即使要进入ring0,使用中断门不是比用调用门更方便吗?

   当然,按照王荣先生在他的主页上的说法,“变速齿轮”0.1版是他在三年前即1997年写的,那时Windows95刚刚出来两年,能有这样的技术已经难能可贵了,这里对王荣先生的钻研精神表示由衷的敬佩。
   在我研究出“变速齿轮”的原理后三天,我以自己原先的研究结果为核心,编写出了“兄弟变速器”的最初版本,不用“变速齿轮”的技术是因为我认为我的技术更优越,何况也没有拾人牙慧之嫌了 ^_^
   最后再次对王荣先生表示感谢,这样精彩的创意值得我们敬佩。

目前不懂的地方:修改IDT表,创建一个中断门,然后发生中断,进入ring0

而对于文中说的那个调用timeGetTime的小程序:

#include <time.h>
#include <iostream>
#include <windows.h>
using namespace std;
#include <Mmsystem.h>#pragma comment( lib,"winmm.lib" )
int main()
{unsigned long last = 0;while(1){unsigned long t1 = timeGetTime();//GetTickCount();// cout<< t1 - last<<endl;last = t1;_sleep(1000);}return 0;
}

Windows游戏加速外挂-变速齿轮 学习笔记-【第一篇】相关推荐

  1. 《鸟哥的Linux私房菜》个人学习笔记-第一篇

    <鸟哥的Linux私房菜>个人学习笔记-基础篇 这是一篇一个linux菜鸡自学的笔记 csdn上的各位大手子们好,本人实习生一枚最近想自己深入学习下linux,所以在社区里发博客,希望能记 ...

  2. bootloader学习笔记---第一篇以stm32为例

    目录 一.bootloader的任务 二.bootloader开发的基础知识 段的概念 重定位的概念 散列文件的概念 异常向量(待补充) 三.最简单的bootloader程序 四.使用汇编跳转 五.备 ...

  3. Cocos Studio学习笔记第一篇--界面

    大前天也就是周二被人问道:"对Cocos Studio2.0以后版本用法的了解."当时我一时之间没法回答,因为Cocos Studio1.6我以前用过很长时间,2.0改版以后我知道 ...

  4. 编程学习笔记(第一篇)面向对象技术高级课程:绪论-软件开发方法的演化与最新趋势(1)...

    软件工程的课程,对于从事大中型的软件开发是至关重要的一门课程. <面向对象技术高级课程>深入.系统.完整地讲解当今主流的面向对象软件开发方法的分析.设计.实现及重构方法,深入讲解UML语言 ...

  5. php百分比乘加,PHP学习笔记第一篇 基础知识

    基础知识 我将php语言学习里面最最基础的部分,需要第一个学的,必须牢牢掌握的,归类到一起. 大纲 1.数据类型 2.变量 3.常量 4.操作符 5.流程控制 6.数组 7.字符串操作 8.正则 基础 ...

  6. 网络安全应急演练学习笔记第一篇之总则、分类及方法、组织机构

    文章目录 0x01 应急演练总则 1.1 应急演练定义 1.2 应急响应目的 1.3 应急演练原则 0x02 应急演练分类及方法 2.1 应急演练分类 2.2 应急演练方法 2.3 按目的与作用划分 ...

  7. es检索学习笔记第一篇

    文章目录 概念 倒排索引 分词器ik 创建mapping 查看索引,修改,删除 添加文档,查看文档,修改文档,查看文档 RestClient 一.映射分析 二.使用client创建索引等 创建Rest ...

  8. python 学习笔记第一篇---下载网页内所有图片

    第一步:打开网址,进入开发者模式,选中 Network,选择 Img 然后刷新页面,静静等待页面加载 等待页面加载完成,你可以看到这边有很多图片的资源 随便点开一个图片选择 Headers 可以看到 ...

  9. MySQL学习笔记-第一篇-基础知识与命令

    目录 1 登录命令 1.1 主机域名登录 1.2 主机ip登录 2 库命令 2.1 显示库 2.2 创建数据库 2.3 删除数据库 2.4 MySQL-8.新特性 3 表命令 3.1 创建数据表 3. ...

  10. 华为HCIA-Datacom 学习笔记-------第一篇

    文章目录 一.前言 二.华为设备图标简介 三.通信与网络 1.网络通信基本概念 2.信息传递过程 3.常见术语 4.数据通信网络基本概念 5.网络设备 四.网络类型与网络拓扑 1.局域网.城域网.广域 ...

最新文章

  1. BufferedInputStream与BufferedOutputStream用法简介
  2. 程序员法律考试(5)-民法(2)
  3. Logistic回归主要应用领域
  4. 【机器视觉学习笔记】双线性插值实现图片任意角度旋转(C++)
  5. 计算机网络安全应具备的功能,2016计算机专业知识:网络系统安全体系具备功能攻击方法...
  6. oracle查询字段嵌套子查询,Oracle通过嵌套子查询连接
  7. 24. 练习定义几种指针及数组
  8. Android系统优化(65)---MTK 平台开关机、重启时间优化
  9. java中使用nextLine(); 没有输入就自动跳过的问题?
  10. jj为什么会变大变小_胡杏儿怀二胎不解鼻子为何变大?其实,还有三个部位变大的更厉害...
  11. codeigniter_MY_Model
  12. Java网络编程(精简版)
  13. 计算机毕设(附源码)JAVA-SSM基于的网上拍卖系统
  14. 怎么创建自己的博客网站
  15. OAuth2:使用JWT和加密签名
  16. 鸿蒙太空是什么意思,我所居兮,青埂之峰:我所游兮,鸿蒙太空,谁与我逝兮,吾谁与从?渺渺茫茫兮归彼大荒!什么意思?求解...
  17. php注册登录描述,基于PHP实现用户登录注册功能的详细教程
  18. ofo押金是否可以起诉_是否可以因应用程序中的错误而被起诉?
  19. Icon Status CDS视图 添加信号灯状态 Fiori Element- Criticality
  20. 中国有些东西不是给人吃的,劝大家都看看,为自己为家人

热门文章

  1. 【咕嘎批量图片查找助手】如何批量根据图片文件名批量查找图片库,移动或复制到指定文件夹保存
  2. 【Julia】 解决安装包下载慢的问题
  3. 1001系列之案例0001如何从淘宝销售数据集中挖掘有效信息
  4. 用十分钟邮箱杜绝垃圾邮件
  5. Excel如何计算两列数据的乘积之和(相乘之后相加)
  6. php 小米路由器_小米路由器固件修改
  7. 计算机多媒体英语,基于计算机多媒体的英语个性化教学
  8. matlab mode函数,matlab常用函数
  9. 【计算机视觉】Lecture 3:线性算子
  10. 【数据分析入门】R语言绘图语句总结