网络游戏外挂制作之我所见(5)(1)
我一直没有搞懂制作加速外挂是怎么一回事,直到前不久又翻出来了2001年下半期的《程序员合订本》中《“变速齿轮”研究手记》重新回味了一遍,才有了一点点开悟,随后用Delphi重写了一遍,下面我就把我的心得说给大家听听,并且在此感谢《“变速齿轮”研究手记》作者褚瑞大虲给了提示。废话我就不多说了,那就开始神奇的加速型外挂体验之旅吧!原本我一直以为加速外挂是针对某个游戏而写的,后来发现我这种概念是不对的,所谓加速外挂其实是修改时钟频率达到加速的目的。以前DOS时代玩过编程的人就会马上想到,这很简单嘛不就是直接修改一下8253寄存器嘛,这在以前DOS时代可能可以行得通,但是windows则不然。windows是一个32位的操作系统,并不是你想改哪就改哪的(微软的东东就是如此霸气,说不给你改就不给你改^_^),但要改也不是不可能,我们可以通过两种方法来实现:第一是写一个硬件驱动来完成,第二是用Ring0来实现(这种方法是CIH的作者陈盈豪首用的,它的原理是修改一下IDE表->创建一个中断门->进入Ring0->调用中断修改向量,但是没有办法只能用ASM汇编来实现这一切*_*,做为高级语言使用者惨啦!),用第一种方法用点麻烦,所以我们在这里就用第二种方法实现吧~~~在实现之前我们来理一下思路吧:1、我们首先要写一个过程在这个过程里嵌入汇编语言来实现修改IDE表、创建中断门,修改向量等工作2、调用这个过程来实现加速功能好了,现在思路有了,我们就边看代码边讲解吧:首先我们建立一个过程,这个过程就是本程序的核心部份:procedure SetRing(value:Word); stdcall; const ZDH = $03; // 设一个中断号var IDT : array [0..5] of byte; // 保存IDT表 OG : dword; //存放旧向量begin asm push ebx sidt IDT //读入中断描述符表 mov ebx, dword ptr [IDT+2] //IDT表基地址 add ebx, 8*ZDH //计算中断在中断描述符表中的位置 cli //关中断 mov dx, word ptr [ebx+6] shl edx, 16d mov dx, word ptr [ebx]