變速齒輪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)意值得我們敬佩。