當(dāng)前位置:首頁>>軟件教程>>新聞內(nèi)容  
變速齒輪使用說明和研究手記
作者:icech搜集整理 發(fā)布時(shí)間:2003-12-12 10:20:44 | 【字體:

變速齒輪0.23b For Windows 9x、1.0 For Windows NT使用說明

    變速齒輪是一個(gè)神奇的改變游戲速度的程序,你可以從我的主頁(http://pge.yeah.net/)上下載他的最新版本。他是免費(fèi)軟件,但是禁止用于商業(yè)目的。你可以免費(fèi)使用或傳播,但要保持文件完整,并且不要修改他。
    他是世界上第一個(gè)可以改變Windows游戲速度的程序,現(xiàn)在已經(jīng)可以在Windows NT下運(yùn)行了,我只在Windows 2000下作了測試。他可以加快也可以減慢游戲速度。所以如果你覺得你的反應(yīng)速度夠快,不需要降低速度的話,那么就在那些磨蹭的游戲中用他加快速度吧。
    最近我得知有人用變速齒輪在戰(zhàn)網(wǎng)上的三角洲部隊(duì)(DF)中瘋狂作弊。對戰(zhàn)網(wǎng)及網(wǎng)友們造成的不便我深表歉意。我寫這個(gè)程序的本意只是為了在動(dòng)作游戲中降低速度,以便自己能享受動(dòng)作游戲的樂趣,以及在磨蹭的游戲中加快速度節(jié)省時(shí)間,但是現(xiàn)在這把水果刀卻被一些人當(dāng)成了殺人的工具。

    下面是使用說明,如果你還有問題請?jiān)L問我的主頁,那里可能會(huì)有更多的答案。如果仍有問題或者發(fā)現(xiàn)臭蟲請給我伊妹兒(iampge@263.net)。請不要再用pge@telekbird.com.cn,它經(jīng)常出問題。


變速齒輪0.23b For Windows 9x使用說明

    變速齒輪For Windows 9x的可執(zhí)行文件名是“變速齒輪.exe”。如果你是從我的網(wǎng)站下載的,那么是一個(gè)ZIP格式的壓縮文件。用WinZIP等可以解壓縮ZIP文件的程序把所有文件解壓到任意一個(gè)目錄中。不能只是在WinZIP中雙擊.exe文件執(zhí)行他,因?yàn)槟菢覹inZIP只解壓一個(gè)文件,所以會(huì)提示找不到XXX.DLL的錯(cuò)誤。啟動(dòng)程序后如何改變游戲的速度呢?程序剛啟動(dòng)時(shí)是原速,你可以用左右鍵或者鼠標(biāo)移動(dòng)滑桿,程序會(huì)顯示設(shè)定的速度,例如降低4倍或者加快8倍等等?墒呛孟袷裁醋兓矝]有嘛,別著急,現(xiàn)在你先把速度設(shè)為降低4倍,然后啟動(dòng)一個(gè)For Win 9X的游戲,是不是變得很慢了?現(xiàn)在你有足夠的時(shí)間看清飛來的子彈,然后從容地躲開。呵呵,現(xiàn)在我這個(gè)的游戲菜鳥也能當(dāng)世界冠軍了,這可是真的哦!如果四倍還覺得不夠慢,你盡可以把速度設(shè)得再慢點(diǎn),最慢可以達(dá)到256倍。如果你的反應(yīng)很快,或者游戲太磨蹭了,你可以把速度加快,最快可以達(dá)到256倍。更大的用處是在網(wǎng)絡(luò)游戲中,練功、逃跑等都能快得出奇(但是最近又有網(wǎng)友告訴我有人在對戰(zhàn)游戲中用他加快速度殺人)。網(wǎng)友們告訴我石器時(shí)代、笑傲江湖、戰(zhàn)網(wǎng)上的DF(三角洲部隊(duì))、UO(創(chuàng)世紀(jì)?)可以改變速度。如果這個(gè)游戲的速度允許在運(yùn)行中改變,那么你還可以隨時(shí)改變游戲的速度。可以切換回變速齒輪,移動(dòng)滑桿改變速度,再回到游戲,也可以使用熱鍵?偣灿兴膫(gè)熱鍵,分別是兩個(gè)固定速度的熱鍵和兩個(gè)加快減慢一檔的熱鍵。四個(gè)熱鍵都可以在設(shè)定熱鍵的對話框中任意設(shè)定。在程序的初始設(shè)置中,加快減慢一檔的熱鍵是數(shù)字鍵盤區(qū)的“+”號和“-”號,固定速度1和固定速度2的熱鍵是數(shù)字鍵盤區(qū)的“*”號和“5”。為什么用“5”鍵,而不是“/”鍵呢?其實(shí)設(shè)置為“/”鍵是可以的,但是不知什么原因,我的電腦熱鍵設(shè)置為“/”鍵時(shí)不顯示出來,不過仍然可以使用。那么為什么不設(shè)置為另幾個(gè)數(shù)字鍵呢?這是因?yàn)殡S鍵盤的“數(shù)字鎖(Num Lock)”狀態(tài)不同,我的程序會(huì)認(rèn)為按下的是不同的鍵,在“數(shù)字鎖”燈亮的時(shí)候我的程序認(rèn)為按下的是數(shù)字鍵盤區(qū)上的按鍵,在“數(shù)字鎖”燈滅的時(shí)候我的程序會(huì)認(rèn)為按下的是鍵盤中間區(qū)域的上下左右和“Page Up”“Page Down”等鍵。所以只要注意一點(diǎn),你還是可以把熱鍵設(shè)為你想要的任意鍵。兩個(gè)固定熱鍵的速度也可以任意設(shè)定,這樣你可以在戰(zhàn)斗時(shí)按一個(gè)鍵讓他慢一點(diǎn),而在過場動(dòng)畫時(shí)按另一個(gè)鍵讓他快一點(diǎn)。

下面是一些網(wǎng)友或者我認(rèn)為可能遇到的問題的回答

*為什么我在啟動(dòng)變速齒輪時(shí)提示找不到MFC42.DLL?
很多網(wǎng)友給我來信問到這個(gè)問題。如果你裝的是Windows 97或者以下版本,請裝Windows 98或者更高的版本,如果你已經(jīng)裝了Windows 98,那么從我的網(wǎng)站上下載我的電腦上的這個(gè)文件,用他替換你的電腦上的同名文件就可以了。

*為什么我在運(yùn)行變速齒輪時(shí)只能減速不能加速?
同樣請從我的網(wǎng)站的你問我答中下載一個(gè)MFC42.DLL,用它替換您的機(jī)器上的同名文件就可以了。

*加速器真的很好,特別是玩《石器時(shí)代》的時(shí)候,但是,突然有一天,我發(fā)現(xiàn)我的連接上的時(shí)間也跟著一起加速,連接時(shí)間過的飛快,我可是一個(gè)窮玩家啊,禁受不起打擊的,希望給我答案。。∈遣皇羌铀俚臅r(shí)候,電話費(fèi)和網(wǎng)費(fèi)也一起加速啊?
放心吧!使用變速齒輪是不會(huì)影響到電話費(fèi)和網(wǎng)費(fèi)的記費(fèi)的,你看到的只是使用變速齒輪后的假象,電信局有自己的計(jì)費(fèi)時(shí)鐘。

*變速齒輪真的能讓我的電腦運(yùn)行加快256倍嗎?
當(dāng)然不能,否則Intel和AMD豈不是得改行賣軟件。事實(shí)上他不會(huì)改變電腦的運(yùn)行速度。

*變速齒輪只能改變Windows95及以上版本游戲的速度嗎?
是的,他不能改變DOS和Windows3.1游戲的速度。

*我怎么改變不了電腦移植版真侍魂的游戲速度?
由于計(jì)時(shí)方法的不同,一些游戲不能在運(yùn)行中改變速度,先設(shè)定好速度再運(yùn)行游戲就可以了。

*我在NeoRage模擬器中把速度降低8倍后為什么按鍵速度快了就做不出相應(yīng)的動(dòng)作,聲音也完全變成了噪音?
NeoRage并不是連續(xù)檢測鍵盤,假設(shè)他每秒檢測30次,降低8倍后每秒僅檢測4次,在這4次檢測之間的鍵盤狀態(tài)是被忽略的。所以把動(dòng)作放慢一點(diǎn)吧。變成噪音是由于模擬器的特殊性。據(jù)我的測試,在其他游戲中聲音都是正常的。

*我把速度降低16倍后為什么看到很多游戲畫面是一幀一幀變化的?
二維游戲畫面每秒最多30幀,降低16倍后每秒僅有兩幀,所以你能清楚地看到畫面一幀一幀地變化。三維游戲幀的速率也經(jīng)常會(huì)有上限。
 
*我在關(guān)閉變速齒輪時(shí)死機(jī)了。
請?jiān)陉P(guān)閉所有程序后再關(guān)閉變速齒輪。盡量減少運(yùn)行程序的數(shù)量也能減少死機(jī)的發(fā)生。

變速齒輪 1.3 For Windows NT使用說明

    NT版的變速齒輪9x版的有一些不同,他只對指定的進(jìn)程(也就是正在運(yùn)行的程序)有效。變速齒輪For Windows NT的可執(zhí)行文件名是“齒輪NT.exe”。
    有兩種方法指定進(jìn)程。在速度未改變的進(jìn)程列表中列出了變速齒輪尚未對他改變速度的進(jìn)程,按加入鍵可以把他加入到速度改變的進(jìn)程列表中。注意如果你加入的是記事本這樣的進(jìn)程而不是游戲,可能沒有任何速度改變的跡象。如果游戲不能在運(yùn)行中改變速度,那么可以用瀏覽按鈕,或者在下拉列表框中輸入文件名后按運(yùn)行按鈕啟動(dòng)他。程序中設(shè)定的速度對所有速度被改變的進(jìn)程都有效。你不能把一個(gè)已經(jīng)改變速度的進(jìn)程從“速度改變的進(jìn)程”列表中刪除,甚至在變速齒輪關(guān)閉后也仍然有效,唯一刪除他的辦法是結(jié)束此進(jìn)程。


“變速齒輪”研究手記

  注意:如果你看了本文,對我們這個(gè)軟件有興趣,請到我們的主頁www.vrbrothers.com下載。

  注:為節(jié)省篇幅,本文對一些計(jì)算機(jī)術(shù)語直接使用而沒有作詳細(xì)的解釋,讀者若有不熟悉之處,建議參考清華大學(xué)出版社出版,周明德編著的《微型計(jì)算機(jī)系統(tǒng)原理及應(yīng)用》一書中關(guān)于8253/8254定時(shí)器和x86保護(hù)模式的相應(yīng)章節(jié)。

  也許是我孤陋寡聞吧,說出來不怕您笑話,對于“變速齒輪”這樣著名的軟件,我一直到五天前,也就是2001年2月28號才第一次聽說。我有幾個(gè)同學(xué)很喜歡玩圖形MUD,整天見了面就在一起切磋“泥”技。我對MUD本身并沒有多大興趣,但是那天早上偶爾聽他們說某個(gè)MUD站點(diǎn)明文規(guī)定嚴(yán)禁使用“齒輪”,這才好奇地問他們什么是“齒輪”。別人告訴我,“齒輪”是一個(gè)軟件,能對Windows下的游戲加速,他們在玩MUD時(shí)就依靠這個(gè)軟件作弊。這不禁令我一頭霧水,能讓W(xué)indows游戲改變速度,太神奇了!

  我一貫對技術(shù)很有興趣,聽說有這么一個(gè)神奇的軟件,當(dāng)然要想想它是怎么實(shí)現(xiàn)的。這個(gè)軟件看起來并不復(fù)雜,我原以為一個(gè)早自習(xí)好好琢磨琢磨就行,可是我想了好幾節(jié)課,始終不得其要領(lǐng)。說來也巧,我們這學(xué)期有一面必修課是Linux內(nèi)核原理分析,這幾天正好學(xué)到了進(jìn)程調(diào)度,老師說,當(dāng)一個(gè)時(shí)鐘中斷發(fā)生的時(shí)候,操作系統(tǒng)要做很多事情,比如必要時(shí)要重新調(diào)度進(jìn)程從而實(shí)現(xiàn)搶先式多任務(wù),還要更新系統(tǒng)時(shí)鐘......慢著,我突發(fā)奇想,如果讓時(shí)鐘中斷產(chǎn)生的更快,會(huì)發(fā)生什么事情呢?

  我們已經(jīng)學(xué)過“微機(jī)原理”這門課程,我知道讓時(shí)鐘中斷產(chǎn)生的更快不是難事,以前我就用DOS下的匯編語言寫過這樣的程序,這是我們當(dāng)時(shí)的作業(yè)?墒俏乙郧暗某绦蛟赪indows下雖然可以運(yùn)行,但并不能對Windows系統(tǒng)加速,道理很顯然:Windows9x是使用x86虛擬機(jī)的機(jī)制來兼容DOS程序的,我的程序只能改變虛擬機(jī),就是那個(gè)黑窗口的時(shí)鐘中斷。

  于是我試圖把以前的DOS程序搬到32位環(huán)境中。用VC內(nèi)嵌匯編做這件事再合適不過了,在一個(gè)VC程序框架中加上一個(gè)__asm,然后只管把以前的匯編程序往里貼就行。我滿懷希望地運(yùn)行這樣一個(gè)拼湊出來的怪物,結(jié)果,出現(xiàn)了一個(gè)大家都很熟悉的“該程序執(zhí)行了非法操作”,我的試驗(yàn)以失敗告終。

  后來冷靜下來仔細(xì)想想,這次失敗的原因是顯然的。Windows作為一個(gè)復(fù)雜的32位操作系統(tǒng),如果能讓你隨便對硬件進(jìn)行操作,那也許運(yùn)行不了幾個(gè)程序就崩潰了。但是如何繞過操作系統(tǒng)去操作硬件呢?我首先想到了vxd,編寫一個(gè)驅(qū)動(dòng)程序肯定可以操作硬件,但是,很可惜,我不會(huì)設(shè)計(jì)驅(qū)動(dòng)程序。于是我想到了以前看到的CIH的源碼,CIH沒有寫vxd,卻能操作硬件去燒毀BIOS,陳盈豪真是太偉大了,他的程序精巧之處我至今記憶猶新。于是我模仿他的技術(shù),修改IDT表,創(chuàng)建一個(gè)中斷門,然后發(fā)生中斷,進(jìn)入ring0,現(xiàn)在我可以做任何事情了,按照以前的DOS程序那樣,往8253定時(shí)器里寫一個(gè)控制字,再分兩次寫入新的時(shí)鐘中斷發(fā)生頻率,一切順利!(詳細(xì)技術(shù)請您參考我的“兄弟變速器”源碼)我看到VC編輯區(qū)的光標(biāo)瘋狂的閃爍;雙擊已經(jīng)失效了,因?yàn)閃indows認(rèn)為我雙擊的時(shí)間間隔太長;Windows任務(wù)欄右方的時(shí)間飛快跳動(dòng),應(yīng)該說,我已經(jīng)成功了。

  當(dāng)時(shí)我想當(dāng)然的以為“變速齒輪”的原理也是如此,可是當(dāng)我從同學(xué)那里把“齒輪”拷來并研究時(shí),發(fā)現(xiàn)Windows的時(shí)鐘并不變快,而游戲速度照樣可以加上去,也就是說,“齒輪”采用了與我的程序不同的技術(shù),是什么技術(shù)呢?我決定繼續(xù)研究。

  我訪問了“變速齒輪”的主頁,這個(gè)主頁上有一個(gè)“你問我答”的欄目,由“齒輪”的作者王榮先生進(jìn)行技術(shù)支持。我試圖在這里找到一些關(guān)于“齒輪”的技術(shù)細(xì)節(jié),但是很可惜,沒有找到,王榮先生只是告訴大家這個(gè)程序不能用VB編寫等等根本連皮毛也不涉及的問題,好不容易見到一個(gè)外國人問能不能公布源代碼,其實(shí)這也是我想問的,但是王榮先生明確表示不行,這不禁令我感到非常失望。
我也想過寫信去索取原碼,也許他不向外國人公布,中國人可不一定。但是咱們“臭老九”最愛一個(gè)面子,我實(shí)在拉不下臉去問。這時(shí)已經(jīng)是晚上10點(diǎn)了,我決定祭出SoftIce,用一夜時(shí)間去研究他的程序。

  當(dāng)時(shí)使用的工具是SoftIce,WD32ASM和VC,手邊兩本參考書是《微型計(jì)算機(jī)系統(tǒng)原理及應(yīng)用》和《Linux操作系統(tǒng)內(nèi)核分析》(都是我們的課本,呵呵)。

  起初,“變速齒輪”0.2版的一個(gè)叫hook.dll的文件很大程度上吸引了我的注意力,我懷疑他使用Windows消息鉤子實(shí)現(xiàn)變速,消息鉤子我很熟悉,但我把MSDN上面關(guān)于鉤子的介紹看了好久,也沒有想出它和變速有什么聯(lián)系,這時(shí)偶然看了一下在王榮先生的主頁上得到的“變速齒輪”0.1版,才發(fā)現(xiàn)老版本中并沒有這個(gè)文件,也就是說,我只需要反匯編他的主程序就夠了,于是,二話不說,用WD32ASM先把0.1版的“齒輪”給拆了,匯編代碼5000多行,并不算多。

  我是從這個(gè)程序的導(dǎo)入函數(shù)著手的,以前編程時(shí)用于定時(shí)的SetTimer,timeGetTime,timeSetEvent等等這里都導(dǎo)入了,看看它們被引用的地方,我發(fā)現(xiàn)這些函數(shù)都是集中出現(xiàn)的,而且大都以這樣的形式出現(xiàn):

* Reference To: WINMM.timeGetTime, Ord:0098h
:00401F3E 8B0D64424000 mov ecx, dword ptr [00404264]
:00401F44 8B11 mov edx, dword ptr [ecx]

  也就是說,他并沒有調(diào)用這些函數(shù),只是取得了函數(shù)的入口地址,保存在ecx中,然后又根據(jù)這個(gè)入口地址得到了函數(shù)的前面幾個(gè)字節(jié),保存在edx中。

  這讓我想到了前些日子在CSDN上面和別人討論的Hook API的原理,當(dāng)時(shí)我還索取了一份Hook API的例程,如果我要Hook這里的函數(shù)timeGetTime,修改ecx中的地址或者修改edx處的頭幾條指令就行,用匯編語言寫,與上面看到的這段代碼類似。

  為了測試“齒輪”是不是要Hook這里的timeGetTime,我自己編寫了一個(gè)很簡單的小程序,調(diào)用timeGetTime,每秒鐘顯示一個(gè)數(shù)字。用“齒輪”進(jìn)行加速后,果然顯示的速度快多了。再用SoftIce跟進(jìn)這個(gè)timeGetTime函數(shù),第一條指令變成一個(gè)跳轉(zhuǎn),這充分說明“齒輪”確實(shí)Hook了這幾個(gè)API,不難猜測,他要改變函數(shù)的返回值,也就是說在timeGetTime結(jié)束時(shí)還要再跳入“齒輪”自身的代碼,耐心跟下去,我發(fā)現(xiàn)回到timeGetTime時(shí)棧里多壓了一個(gè)地址,這樣,當(dāng)timeGetTime用ret指令返回時(shí),先返回“齒輪”的代碼(這個(gè)思想確實(shí)很巧),返回值經(jīng)過處理后,才跳回我的應(yīng)用程序。至于怎么處理這個(gè)返回值就簡單了,改到原先的2倍,應(yīng)用程序速度也就提高了2倍。

  回頭再看WD32ASM反匯編的代碼,我又發(fā)現(xiàn)在Hook API前面的不遠(yuǎn)處使用了一次SGDT指令和兩次SLDT指令,這是x86保護(hù)方式的特有指令,用于獲得全局描述符表,進(jìn)一步得到局部描述符表,這段代碼引起了我的興趣,用SoftIce跟進(jìn)去,往下走幾步,一邊跟一邊猜,大致整理出了這樣的思路:

1.創(chuàng)建一個(gè)內(nèi)存映射,把自己的代碼映射到0x80000000以上的地方,在Win9x下,這塊虛存是所有進(jìn)程共享的。
2.先得到局部描述符表的地址,然后利用這張表修改代碼段的特權(quán)級。
3.用局部描述符表創(chuàng)建一個(gè)調(diào)用門,在x86的保護(hù)模式下要進(jìn)入ring0必須通過門來進(jìn)行,CIH是用中斷門完成的,這里用調(diào)用門完成,異曲同工。
4.保存幾個(gè)關(guān)鍵函數(shù)前六個(gè)字節(jié),改為一條跳轉(zhuǎn)指令,跳到自己已經(jīng)映射到高端的代碼。
5.發(fā)生函數(shù)調(diào)用時(shí)進(jìn)入自己的代碼,通過調(diào)用門進(jìn)入ring0,恢復(fù)函數(shù)開頭的幾個(gè)字節(jié),修改返回值。

  這時(shí)已經(jīng)是凌晨5點(diǎn)了,既然主要思想已經(jīng)掌握,我也就沒有細(xì)看這段代碼,8點(diǎn)鐘還要上課,睡覺去也。

  回頭想想,我認(rèn)為王榮先生的代碼還有幾點(diǎn)值得推敲之處:

1.如果要Hook API,一定要改變函數(shù)的第一條指令嗎?如果僅僅改變函數(shù)的入口地址,不是既容易編也容易調(diào)試嗎?
2.即使要改變函數(shù)第一條指令,一定要進(jìn)入ring0嗎?
3.即使要進(jìn)入ring0,使用中斷門不是比用調(diào)用門更方便嗎?

  當(dāng)然,按照王榮先生在他的主頁上的說法,“變速齒輪”0.1版是他在三年前即1997年寫的,那時(shí)Windows95剛剛出來兩年,能有這樣的技術(shù)已經(jīng)難能可貴了,這里對王榮先生的鉆研精神表示由衷的敬佩。

  在我研究出“變速齒輪”的原理后三天,我以自己原先的研究結(jié)果為核心,編寫出了“兄弟變速器”的最初版本,不用“變速齒輪”的技術(shù)是因?yàn)槲艺J(rèn)為我的技術(shù)更優(yōu)越,何況也沒有拾人牙慧之嫌了 ^_^

  最后再次對王榮先生表示感謝,這樣精彩的創(chuàng)意值得我們敬佩。


文章來源:
·“變速齒輪”再研究
 放生
 愚愛
 夠愛
 觸電
 白狐
 葬愛
 光榮
 畫心
 火花
 稻香
 小酒窩
 下雨天
 右手邊
 安靜了
 魔杰座
 你不像她
 邊做邊愛
 擦肩而過
 我的答鈴
 懷念過去
 等一分鐘
 放手去愛
 冰河時(shí)代
 你的承諾
 自由飛翔
 原諒我一次
 吻的太逼真
 左眼皮跳跳
 做你的愛人
 一定要愛你
 飛向別人的床
 愛上別人的人
 感動(dòng)天感動(dòng)地
 心在跳情在燒
 玫瑰花的葬禮
 有沒有人告訴你
 即使知道要見面
 愛上你是一個(gè)錯(cuò)
 最后一次的溫柔
 愛上你是我的錯(cuò)
 怎么會(huì)狠心傷害我
 不是因?yàn)榧拍畔?/a>
 親愛的那不是愛情
 難道愛一個(gè)人有錯(cuò)
 寂寞的時(shí)候說愛我