mov [OG], edx mov eax, offset @@Ring0 //指向Ring0级代码段 mov word ptr [ebx], ax //低16位,保存在1,2位 shr eax, 16d mov word ptr [ebx+6], ax //高16位,保存在6,7位 int ZDH //中断 mov ebx, dword ptr [IDT+2] //重新定位 add ebx, 8*ZDH mov edx, [OG] mov word ptr [ebx], dx shr edx, 16d mov word ptr [ebx+6], dx //恢复被改了的向量 pop ebx jmp @@exitasm //到exitasm处 @@Ring0: //Ring0,这个也是最最最核心的东东 mov al,$34 //写入8253控制寄存器 out $43,al mov ax,value //写入定时值 out $40,al //写定时值低位 mov al,ah out $40,al //写定时值高位 iretd //返回 @@exitasm: end; end; 最核心的东西已经写完了,大部份读者是知其然不知其所以然吧,呵呵,不过不知其所以然也然。下面我们就试着用一下这个过程来做一个类似于“变速齿轮”的一个东东吧! 先加一个窗口,在窗口上放上一个trackbar控件把其Max设为20,Min设为1,把Position设为10,在这个控件的Change事件里写上: SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160))); 因为windows默认的值为$1742,所以我们把1742做为基数,又因为值越小越快,反之越慢的原理,所以写了这样一个公式,好了,这就是“变速齿轮”的一个Delphi+ASM版了(只适用于win9X),呵呵,试一下吧,这对你帮助会很大的,呵呵。 在win2000里,我们不可能实现在直接对端口进行操作,Ring0也失了效,有的人就会想到,我们可以写驱动程序来完成呀,但在这里我告诉你,windows2000的驱动不是一个VxD就能实现的,像我这样的低手是写不出windows所用的驱动WDM的,没办法,我只有借助外力实现了,ProtTalk就是一个很好的设备驱动,他很方便的来实现对低层端口的操作,从而实现加速外挂。 1、我们首先要下一个PortTalk驱动,他的官方网站是http://www.beyondlogic.org 2、我们要把里面的prottalk.sys拷贝出来。 3、建立一个Protalk.sys的接口(我想省略了,大家可以上http://www.freewebs.com/liuyue/porttalk.pas下个pas文件自己看吧) 4、实现加速外挂。 下面就讲一下这程序的实现方法吧,如果说用ProtTalk来操作端口就容易多了,比win98下用ring权限操作方便。 1、新建一个工程,把刚刚下的接口文件和Protalk.sys一起拷到工程文件保存的文件夹下。 2、我们在我们新建的工程加入我们的接口文件 uses windows,ProtTalk…… 3、我们建立一个过程 procedure SetRing(value:word); begin if not OpenPortTalk then exit; outportb($43,$34); outportb($40,lo(Value)); outprotb($40,hi(value)); ClosePortTalk; end; 4、先加一个窗口,在窗口上放上一个trackbar控件把其Max设为20,Min设为1,把Position设为10,在这个控件的Change事件里写上: SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160))); 就这么容易。 (出处:清风网络学院 )
复制本页网址和标题,发送给你QQ/Msn的好友一起分享
上一篇:养成良好的绘制 UML 序列图的习惯
下一篇:程序语言效率比较