资源描述:
《变速齿轮工作原理解密》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、变速齿轮工作原理解密PS:昨天回家搭车时听了About变速齿轮的工作原理的探讨,感觉有点奇怪,于是上网查了下,貌似最有说服力就是这篇,关于利用驱动通过Ring0进行访问I/O,我感觉采用这种方法的可能性不大,因为没下载变速齿轮,无法得知他是否采用这种方法。(用了呢种方案出错率非一般的大,一错了,随时死机。。。)---------------------------------我是传说中的分割线-------------------------------------变速齿轮工作原理解密绝大部分游戏里面即时都会用到使用的定时器,变速齿轮之所欲可以给游戏加速,就是改变了定时器的性质
2、。有两种办法可以改变系统定时器。1)API代码注入,通过注入自己的代码,使得API跳转到自己的代码处运行计时API函数有GETTICKCOUNT和TIMEGETTIME,它是windows系统函数,如果可以找到他们的未知,修改成对自己有利的形式,就达到了加速的目的。下面以GETTICKCOUNT为例进行分析:原本的GETTICKCOUNT汇编:kernel32!gettickcountmovgs,[bffcaea18]moveax,gs:[00000000]subedx,edxmovgs,dxret变速齿轮修改后的GETTICKCOUNT汇编:kernel32!gettickc
3、ount这里是关键-->jmp840500d9(840500d9并不是绝对的)add[eax],aladd[ecx+00000000],ahsubedx,edxmovgs,dxret可以看出变速齿轮修改了gettickcount的代码,当游戏和程序使用gettickcount时就会自动跳转到840500d9处执行。再看?40500d9处的代码汇编:840500d9:CLIpushebpmovebp,esppushebxpushecpushedxpushesipushedicall840500e7840500e7:popedixordi,dimovesi,ediaddesi,00
4、402051subesi,00401f0bpushesicalledicall8405010184050101:popedixordi,dicall[edi+0000fef0]call8405011084050110:subeax,[edi+0000ff30]muldword,ptr[edi+0000ff30]movebx,00100000divebxaddeax,[edi+0000fe20]pusheaxmoveax,00402072subeax,00401f08addeax,edipusheaxcalledipopeaxpopedipopesipopedxpopecxpop
5、ebxpopebpsilret以上正是变速齿轮变速的核心所在。(GETTICKCOUNT返回的是EAX的值你可以对EAX进行跟踪)下面说一下变速齿轮挂接API的方法:首先变速齿轮在MMF区(WIN9X/ME)申请一块内存,把上面的代码从程序中移到该内存。使用修改描述符的方法从应用程序级跳到核心级,修改GETTICKCOUNT开头的代码使之指向申请的内存的首地址实现挂接。这是普遍采用的一种方式。2)还有一种方式。从驱动级修改。在win95/98时代,我们是可以直接操作IO端口的,winNT以后,包括2000,XP系统,当我们试图操作IO端口,改变硬件设置的时候,系统会拒绝或者引起
6、冲突。事实上在386以后的CPU上,用户程序都是运行在保护模式下,用户对IO端口对设备的访问都要经过操作系统的管理和监督。用户程序是无法直接对设备操作的。那么在window下,要访问设备怎么办?windows提供了2中办法:第一,通过修改EFLAGS寄存器中的特权级别(IOPL)实现第二,任务状态段(TSS)中的IO许可映射BIt位WindowsNT下,只使用了2种等级的特权级,0特权级和3特权级。用户程序运行在3特权级,设备驱动和系统内核运行在0特权级。只有系统内核程序和设备驱动才被允许直接操作IO端口。所有的用户程序在访问IO端口前,都需要得到设备驱动的准入,低信任级别的程
7、序是无法访问的。IObit映射就是为了使得那些低信任级别的程序能够访问设备IO而设置的。在NT系统下,直接操作IO端口就有两种方式,一是,编写设备驱动,运行在0特权级直接操作IO设备端口。另外一种可行的办法就是修改IObit映射。我们建议采用第一种办法,通过工作在0特权级的驱动访问IO端口。这里有写好的设备驱动,PortTalk.sys,并提供了对外的接口,下面是用c语言写的,通过这个驱动对IO访问的一个例子:#include#include#includevoid__cdeclmain(v