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

2023-11-18

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

第一篇文章:

“变速齿轮”研究手记

转自: 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;
}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 设置表单的父级

    我有一个 Windows 表单 我想从中打开一个状态表单 上面写着 正在保存 然后保存完成后消失 我想将这个小状态表单放在调用表单的中间 我尝试将 StartPosition 属性设置为 CenterParent 但它不起作用 我从其他表单
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 正确配置JDK环境变量后仍然找不到java命令

    我在 Windows 虚拟机启动时安装 JDK 使用 cloudinit 用户数据将 PowerShell 脚本传输到 Windows 计算机 然后运行该脚本来安装 JDK softwares Get ItemProperty HKLM S
  • WinError6 句柄无效 Python 3+ 多处理

    我正在运行一个 Python 3 7 Flask 应用程序 它使用flask socketio设置一个socketio用于浏览器客户端的服务器 另一个连接到单独远程的Python进程socketio服务器和交换消息 以及另一个从 PIR 传
  • 如何修复在 Windows 终端中启动“powershell.exe”时出现的错误 0x800700c1?

    最近我在 Windows 终端中遇到以下错误 error 0x800700c1 when launching C Users Dry C Desktop AppData Local Microsoft WindowsApps Microso
  • Windows:列出并启动与扩展关联的应用程序

    如何确定与特定扩展名 例如 JPG 关联的应用程序 然后确定该应用程序的可执行文件所在的位置 以便可以通过调用 System Diagnostics Process Start 来启动它 我已经知道如何读取和写入注册表 注册表的布局使得以标
  • 如何确定登录的Windows帐户是否已在域上进行身份验证[重复]

    这个问题在这里已经有答案了 可能的重复 在客户端 服务器应用程序中使用 Active Directory 对用户进行身份验证 https stackoverflow com questions 1337923 authenticating
  • 仅将 Firesharp 用于 Windows 桌面推送通知

    我想在 Windows 桌面应用程序中使用 Firesharp 该应用程序只会接收来自 Firebase 的通知 并且不会有任何类型的数据库交互 Firebase Cloud Messaging FCM 是 Firebase 唯一使用的东西
  • 将 Metro 应用程序固定到任务栏 Windows 10 Powershell

    以下代码将固定 Metro 应用程序以在给定 AUMID 的情况下启动 如果你改变 match Pin To Start 不幸的是 将匹配更改为 固定到任务栏 不起作用 这里发生了什么 function Pin Taskbar param
  • 如何在 Visual C++ 中宣传 Bonjour 服务

    我试图弄清楚这是否可能 但是通过 Visual C 宣传 Bonjour 服务的最简单方法是什么 您可以使用DNS服务发现客户 dns sd Windows Bonjour 安装程序把它放进去C Windows system32 dns s
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 64 位大型 malloc

    malloc 失败的原因是什么 尤其是在 64 位中 我的具体问题是尝试在 64 位系统上分配一大块 10GB RAM 该机器有 12GB RAM 和 32GB 交换空间 是的 malloc 是极端的 但是为什么它会成为一个问题呢 这是在带
  • 在 C# 中使用反射列出枚举中的值

    我正在尝试使用反射来列出一个 Visual Studio 解决方案内的各个项目中的一些类的公共成员和方法 我尝试访问的所有类都是 C 的 并且它们都是从 C 类访问的 我用来进行这些调用的代码如下 public void PopulateE
  • 使用 Windows 任务计划程序安排 [Virtualenv 相关] Python 脚本

    I want to schedule a python script to start at 3AM and break at 5PM every weekday However the problem arises when I need
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 如何在子 shell 中运行 cmd.exe 批处理文件

    我有一个批处理文件 通常像这样调用 longjob cmd gt result txt 2 gt 1 这工作正常 但脚本在执行过程中更改了目录 将我的 shell 留在该目录中 这很麻烦 有没有办法在子 shell 中运行命令 同时仍然允许
  • 使用 BitmapEncoder 生成时如何使 GIF 循环重复

    我能够使用 BitmapEncoder C WinRT 创建动画 gif 但是 我一直无法弄清楚如何让GIF循环回来并从头开始 没有尝试太多 因为我不确定要尝试什么 搜索了更多要在 GIF 上设置的属性 但找不到任何相关内容 好吧 终于能弄
  • 如何使用 python 在 Windows 中禁用/启用特定 USB 端口? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在图形窗口中创建一个切换开关 可以使用 python 禁用 启用 Windows 中的特定 USB 端口 我可以使用哪个外部命令或
  • 使用 Windows 批处理文件在文本文件中添加新行

    我有一个文本文件 其中有 200 多行 我只想在第 4 行之前添加一个新行 我使用的是 Windows XP 输入前的示例文本文件 header 1 header 2 header 3 details 1 details 2 输出后 hea

随机推荐

  • TCP/IP网络江湖——物理层护江山:网络安全的铁壁防线(物理层下篇:物理层与网络安全)

    TCP IP网络江湖 物理层护江山 网络安全的铁壁防线 物理层下篇 物理层与网络安全 引言 一 物理层的隐私与保密 1 1 加密技术的护盾 1 2 安全传输协议的密约 1 3 物理层的安全控制 1 4 面对未知威胁的准备 二 电磁干扰与抵御
  • 使用正则表达式爬虫抓取猫眼电影排行Top100

    目标站点分析 分析网址 首页 https maoyan com 点击榜单 https maoyan com board 点击Top100 https maoyan com board 4 目标站点为 https maoyan com boa
  • 工具 - windows(PowerShell) 常用命令

    1 拷贝cp命令 例子 PS D Project test jni gt cp libs arm64 v8a NetU VTest app src main jniLibs Recurse Force 备注 Recurse 递归到子目录 F
  • vuescroll-一款基于vuejs2.x的虚拟滚动条

    介绍 Vuescroll 一个功能强大 有多种模式的基于Vue js的滚动条插件 它的原理是创建 div 用于包裹要滚动的内容 操后操作容器的样式或者scrollTop或scrollLeft完成内容的滚动 设计它的目的是用来美化和增强你的滚
  • 2023年3月股份行GX评测盘点:招商银行稳居榜首,各项指标均居前列

    易观 2023 年3月GX评测数据显示 招商银行 平安口袋银行 中信银行位居行业Top 10 浦发银行 兴业银行 光大银行紧跟其后 股份行APP 用户体验 招商银行以绝对优势稳居第一 2023年3月股份行GX评测结果数据显示 在操作体验方面
  • Google的TCP BBR拥塞控制算法深度解析

    原作者 dog250 授权发布 重新整理 极客重生 hi 大家好 今天推荐一篇我认为在TCP BBR技术里面分析非常透彻的文章 希望大家可以学习到一些真正的知识 理解其背后的设计原理 才能应对各种面试和工作挑战 宏观背景下的BBR 1980
  • 利用Python进行简单的图像识别(验证码)

    这是一个最简单的图像识别 将图片加载后直接利用Python的一个识别引擎进行识别 将图片中的数字通过 pytesseract image to string image 识别后将结果存入到本地的txt文件中 1 encoding utf 8
  • csol2服务器维护中 无法登陆游戏,csol2现在怎么登不上去?为什么?说服务...

    2016 07 08 00 48龚宁静 客户经理 CSOL金勋怎么抽的第一个建议 卡延迟 看过好多人分享经验说卡延迟出金的几率会很大 本人也有些体会 我家是10M的光纤 跟我开金少有关系 我想有很大关系 因为在活动期间 那屏刷的真叫一个快
  • Android开启和关闭护眼模式

    Android开启和关闭护眼模式 在现代社会中 我们经常长时间使用智能手机或平板电脑等电子设备 长时间盯着屏幕可能会对眼睛造成疲劳和不适 为了保护用户的眼睛健康 许多移动设备都提供了护眼模式 本文将介绍如何在Android设备上开启和关闭护
  • Element中的el-tree组件的懒加载和手动更新节点数据

  • 安装Windows10系统后,CPU 不再支持虚拟化解决方案

    小米的游戏本 之前是支持虚拟化的 安装过好几次虚拟机 最近重新安装了Windows10系统后 CPU不再支持虚拟化了 具体表现为安装VMWare失败 解决方案 小娜搜索并打开 启用或关闭Windows功能 把Hyper V的勾选去掉 因为它
  • Vue前端开发中的输入限制与输入规则探究

    前言 在Vue前端开发中 我们经常需要对用户的输入进行限制和规范 以确保数据的准确性和安全性 本文将介绍如何使用Vue的el input组件来实现输入限制和输入规则 并提供相应的代码示例 一 输入限制 最大长度限制 我们可以使用maxlen
  • 如何快速增加大量用户和用户组

    Windows平台下 假设建有Domain A和Domain B 两者已经建立了信任关系 可以采用在命令行中输入如下命令在各自的domain中增加用户或用户组 1 增加用户组FOR L i in 1 1 10 DO dsadd group
  • 神经网络与深度学习笔记——代价函数,规范化,过拟合

    神经网络与深度学习笔记系列一共有五个专题 分别是第一章使用神经网络识别手写数字 梯度下降算法是什么 主要介绍了神经网络的基础例如感知器激活函数等概念 最主要介绍了梯度下降算法 第二章反向传播算法如何工作 反向传播算法原理 主要介绍了反向传播
  • 数据结构--二叉树-堆(1)

    文章目录 树 概念 相关的基本概念 树的表示 二叉树 概念 特殊二叉树 性质 堆 二叉树的顺序结构 堆的概念 堆的实现 初始化 数组初始化为堆 向上调整 向下调整 插入 删除 打印 摧毁 判空 获取堆顶数据 验证 堆的应用 堆排序 TopK
  • 磁盘测试工具FIO

    磁盘测试工具FIO https www cnblogs com klb561 p 11939355 html 目前主流的第三方IO测试工具有fio iometer和Orion 这三种工具各有千秋 fio在Linux系统下使用比较方便 iom
  • 淘宝官方订单API接口,获取售出的商品订单列表(爬虫数据)

    淘宝 天猫获取售出的商品订单列表 API 返回值说明 seller order list 获取售出的商品订单列表 公共参数 名称 类型 必须 描述 key String 是 调用key 必须以GET方式拼接在URL中 获取Key和secre
  • 大学英语六级历年真题Word,PDF,和音频 下载

    1 链接 https pan baidu com s 11w bAM1JoHTt HjNfor70g 提取码 ro6w 复制这段内容后打开百度网盘手机App 操作更方便哦 1 1 1 1 1 下载方式 扫码联系获取 1学习人工智能可以扫码关
  • C++函数指针定义及用法

    什么是函数指针 如果在程序中定义了一个函数 那么在编译时系统就会为这个函数代码分配一段存储空间 这段存储空间的首地址称为这个函数的地址 而且函数名表示的就是这个地址 既然是地址我们就可以定义一个指针变量来存放 这个指针变量就叫作函数指针变量
  • Windows游戏加速外挂-变速齿轮 学习笔记-【第一篇】

    找到两篇文章 是比较流行的方法 接下来记录一下收获 第一篇文章 变速齿轮 研究手记 转自 http www newasp net tech 58262 html 注意 如果你看了本文 对我们这个软件有兴趣 请到我们的主页www vrbrot