變速齒輪0.23b For Windows 9x、1.0 For Windows NT使用說明
變速齒輪是一個神奇的改變游戲速度的程序,你可以從我的主頁(http://pge.yeah.net/)上下載他的最新版本。他是免費軟件,但是禁止用于商業目的。你可以免費使用或傳播,但要保持文件完整,并且不要修改他。
他是世界上第一個可以改變Windows游戲速度的程序,現在已經可以在Windows NT下運行了,我只在Windows 2000下作了測試。他可以加快也可以減慢游戲速度。所以如果你覺得你的反應速度夠快,不需要降低速度的話,那么就在那些磨蹭的游戲中用他加快速度吧。
最近我得知有人用變速齒輪在戰網上的三角洲部隊(DF)中瘋狂作弊。對戰網及網友們造成的不便我深表歉意。我寫這個程序的本意只是為了在動作游戲中降低速度,以便自己能享受動作游戲的樂趣,以及在磨蹭的游戲中加快速度節省時間,但是現在這把水果刀卻被一些人當成了殺人的工具。
下面是使用說明,如果你還有問題請訪問我的主頁,那里可能會有更多的答案。如果仍有問題或者發現臭蟲請給我伊妹兒(iampge@263.net)。請不要再用pge@telekbird.com.cn,它經常出問題。
變速齒輪0.23b For Windows 9x使用說明
變速齒輪For Windows 9x的可執行文件名是“變速齒輪.exe”。如果你是從我的網站下載的,那么是一個ZIP格式的壓縮文件。用WinZIP等可以解壓縮ZIP文件的程序把所有文件解壓到任意一個目錄中。不能只是在WinZIP中雙擊.exe文件執行他,因為那樣WinZIP只解壓一個文件,所以會提示找不到XXX.DLL的錯誤。啟動程序后如何改變游戲的速度呢?程序剛啟動時是原速,你可以用左右鍵或者鼠標移動滑桿,程序會顯示設定的速度,例如降低4倍或者加快8倍等等。可是好像什么變化也沒有嘛,別著急,現在你先把速度設為降低4倍,然后啟動一個For Win 9X的游戲,是不是變得很慢了?現在你有足夠的時間看清飛來的子彈,然后從容地躲開。呵呵,現在我這個的游戲菜鳥也能當世界冠軍了,這可是真的哦!如果四倍還覺得不夠慢,你盡可以把速度設得再慢點,最慢可以達到256倍。如果你的反應很快,或者游戲太磨蹭了,你可以把速度加快,最快可以達到256倍。更大的用處是在網絡游戲中,練功、逃跑等都能快得出奇(但是最近又有網友告訴我有人在對戰游戲中用他加快速度殺人)。網友們告訴我石器時代、笑傲江湖、戰網上的DF(三角洲部隊)、UO(創世紀?)可以改變速度。如果這個游戲的速度允許在運行中改變,那么你還可以隨時改變游戲的速度。可以切換回變速齒輪,移動滑桿改變速度,再回到游戲,也可以使用熱鍵。總共有四個熱鍵,分別是兩個固定速度的熱鍵和兩個加快減慢一檔的熱鍵。四個熱鍵都可以在設定熱鍵的對話框中任意設定。在程序的初始設置中,加快減慢一檔的熱鍵是數字鍵盤區的“+”號和“-”號,固定速度1和固定速度2的熱鍵是數字鍵盤區的“*”號和“5”。為什么用“5”鍵,而不是“/”鍵呢?其實設置為“/”鍵是可以的,但是不知什么原因,我的電腦熱鍵設置為“/”鍵時不顯示出來,不過仍然可以使用。那么為什么不設置為另幾個數字鍵呢?這是因為隨鍵盤的“數字鎖(Num Lock)”狀態不同,我的程序會認為按下的是不同的鍵,在“數字鎖”燈亮的時候我的程序認為按下的是數字鍵盤區上的按鍵,在“數字鎖”燈滅的時候我的程序會認為按下的是鍵盤中間區域的上下左右和“Page Up”“Page Down”等鍵。所以只要注意一點,你還是可以把熱鍵設為你想要的任意鍵。兩個固定熱鍵的速度也可以任意設定,這樣你可以在戰斗時按一個鍵讓他慢一點,而在過場動畫時按另一個鍵讓他快一點。
下面是一些網友或者我認為可能遇到的問題的回答
*為什么我在啟動變速齒輪時提示找不到MFC42.DLL?
很多網友給我來信問到這個問題。如果你裝的是Windows 97或者以下版本,請裝Windows 98或者更高的版本,如果你已經裝了Windows 98,那么從我的網站上下載我的電腦上的這個文件,用他替換你的電腦上的同名文件就可以了。
*為什么我在運行變速齒輪時只能減速不能加速?
同樣請從我的網站的你問我答中下載一個MFC42.DLL,用它替換您的機器上的同名文件就可以了。
*加速器真的很好,特別是玩《石器時代》的時候,但是,突然有一天,我發現我的連接上的時間也跟著一起加速,連接時間過的飛快,我可是一個窮玩家啊,禁受不起打擊的,希望給我答案!!!是不是加速的時候,電話費和網費也一起加速啊?
放心吧!使用變速齒輪是不會影響到電話費和網費的記費的,你看到的只是使用變速齒輪后的假象,電信局有自己的計費時鐘。
*變速齒輪真的能讓我的電腦運行加快256倍嗎?
當然不能,否則Intel和AMD豈不是得改行賣軟件。事實上他不會改變電腦的運行速度。
*變速齒輪只能改變Windows95及以上版本游戲的速度嗎?
是的,他不能改變DOS和Windows3.1游戲的速度。
*我怎么改變不了電腦移植版真侍魂的游戲速度?
由于計時方法的不同,一些游戲不能在運行中改變速度,先設定好速度再運行游戲就可以了。
*我在NeoRage模擬器中把速度降低8倍后為什么按鍵速度快了就做不出相應的動作,聲音也完全變成了噪音?
NeoRage并不是連續檢測鍵盤,假設他每秒檢測30次,降低8倍后每秒僅檢測4次,在這4次檢測之間的鍵盤狀態是被忽略的。所以把動作放慢一點吧。變成噪音是由于模擬器的特殊性。據我的測試,在其他游戲中聲音都是正常的。
*我把速度降低16倍后為什么看到很多游戲畫面是一幀一幀變化的?
二維游戲畫面每秒最多30幀,降低16倍后每秒僅有兩幀,所以你能清楚地看到畫面一幀一幀地變化。三維游戲幀的速率也經常會有上限。
*我在關閉變速齒輪時死機了。
請在關閉所有程序后再關閉變速齒輪。盡量減少運行程序的數量也能減少死機的發生。
變速齒輪 1.3 For Windows NT使用說明
NT版的變速齒輪9x版的有一些不同,他只對指定的進程(也就是正在運行的程序)有效。變速齒輪For Windows NT的可執行文件名是“齒輪NT.exe”。
有兩種方法指定進程。在速度未改變的進程列表中列出了變速齒輪尚未對他改變速度的進程,按加入鍵可以把他加入到速度改變的進程列表中。注意如果你加入的是記事本這樣的進程而不是游戲,可能沒有任何速度改變的跡象。如果游戲不能在運行中改變速度,那么可以用瀏覽按鈕,或者在下拉列表框中輸入文件名后按運行按鈕啟動他。程序中設定的速度對所有速度被改變的進程都有效。你不能把一個已經改變速度的進程從“速度改變的進程”列表中刪除,甚至在變速齒輪關閉后也仍然有效,唯一刪除他的辦法是結束此進程。
“變速齒輪”研究手記
注意:如果你看了本文,對我們這個軟件有興趣,請到我們的主頁www.vrbrothers.com下載。
注:為節省篇幅,本文對一些計算機術語直接使用而沒有作詳細的解釋,讀者若有不熟悉之處,建議參考清華大學出版社出版,周明德編著的《微型計算機系統原理及應用》一書中關于8253/8254定時器和x86保護模式的相應章節。
也許是我孤陋寡聞吧,說出來不怕您笑話,對于“變速齒輪”這樣著名的軟件,我一直到五天前,也就是2001年2月28號才第一次聽說。我有幾個同學很喜歡玩圖形MUD,整天見了面就在一起切磋“泥”技。我對MUD本身并沒有多大興趣,但是那天早上偶爾聽他們說某個MUD站點明文規定嚴禁使用“齒輪”,這才好奇地問他們什么是“齒輪”。別人告訴我,“齒輪”是一個軟件,能對Windows下的游戲加速,他們在玩MUD時就依靠這個軟件作弊。這不禁令我一頭霧水,能讓Windows游戲改變速度,太神奇了!
我一貫對技術很有興趣,聽說有這么一個神奇的軟件,當然要想想它是怎么實現的。這個軟件看起來并不復雜,我原以為一個早自習好好琢磨琢磨就行,可是我想了好幾節課,始終不得其要領。說來也巧,我們這學期有一面必修課是Linux內核原理分析,這幾天正好學到了進程調度,老師說,當一個時鐘中斷發生的時候,操作系統要做很多事情,比如必要時要重新調度進程從而實現搶先式多任務,還要更新系統時鐘......慢著,我突發奇想,如果讓時鐘中斷產生的更快,會發生什么事情呢?
我們已經學過“微機原理”這門課程,我知道讓時鐘中斷產生的更快不是難事,以前我就用DOS下的匯編語言寫過這樣的程序,這是我們當時的作業。可是我以前的程序在Windows下雖然可以運行,但并不能對Windows系統加速,道理很顯然:Windows9x是使用x86虛擬機的機制來兼容DOS程序的,我的程序只能改變虛擬機,就是那個黑窗口的時鐘中斷。
于是我試圖把以前的DOS程序搬到32位環境中。用VC內嵌匯編做這件事再合適不過了,在一個VC程序框架中加上一個__asm,然后只管把以前的匯編程序往里貼就行。我滿懷希望地運行這樣一個拼湊出來的怪物,結果,出現了一個大家都很熟悉的“該程序執行了非法操作”,我的試驗以失敗告終。
后來冷靜下來仔細想想,這次失敗的原因是顯然的。Windows作為一個復雜的32位操作系統,如果能讓你隨便對硬件進行操作,那也許運行不了幾個程序就崩潰了。但是如何繞過操作系統去操作硬件呢?我首先想到了vxd,編寫一個驅動程序肯定可以操作硬件,但是,很可惜,我不會設計驅動程序。于是我想到了以前看到的CIH的源碼,CIH沒有寫vxd,卻能操作硬件去燒毀BIOS,陳盈豪真是太偉大了,他的程序精巧之處我至今記憶猶新。于是我模仿他的技術,修改IDT表,創建一個中斷門,然后發生中斷,進入ring0,現在我可以做任何事情了,按照以前的DOS程序那樣,往8253定時器里寫一個控制字,再分兩次寫入新的時鐘中斷發生頻率,一切順利!(詳細技術請您參考我的“兄弟變速器”源碼)我看到VC編輯區的光標瘋狂的閃爍;雙擊已經失效了,因為Windows認為我雙擊的時間間隔太長;Windows任務欄右方的時間飛快跳動,應該說,我已經成功了。
當時我想當然的以為“變速齒輪”的原理也是如此,可是當我從同學那里把“齒輪”拷來并研究時,發現Windows的時鐘并不變快,而游戲速度照樣可以加上去,也就是說,“齒輪”采用了與我的程序不同的技術,是什么技術呢?我決定繼續研究。
我訪問了“變速齒輪”的主頁,這個主頁上有一個“你問我答”的欄目,由“齒輪”的作者王榮先生進行技術支持。我試圖在這里找到一些關于“齒輪”的技術細節,但是很可惜,沒有找到,王榮先生只是告訴大家這個程序不能用VB編寫等等根本連皮毛也不涉及的問題,好不容易見到一個外國人問能不能公布源代碼,其實這也是我想問的,但是王榮先生明確表示不行,這不禁令我感到非常失望。
我也想過寫信去索取原碼,也許他不向外國人公布,中國人可不一定。但是咱們“臭老九”最愛一個面子,我實在拉不下臉去問。這時已經是晚上10點了,我決定祭出SoftIce,用一夜時間去研究他的程序。
當時使用的工具是SoftIce,WD32ASM和VC,手邊兩本參考書是《微型計算機系統原理及應用》和《Linux操作系統內核分析》(都是我們的課本,呵呵)。
起初,“變速齒輪”0.2版的一個叫hook.dll的文件很大程度上吸引了我的注意力,我懷疑他使用Windows消息鉤子實現變速,消息鉤子我很熟悉,但我把MSDN上面關于鉤子的介紹看了好久,也沒有想出它和變速有什么聯系,這時偶然看了一下在王榮先生的主頁上得到的“變速齒輪”0.1版,才發現老版本中并沒有這個文件,也就是說,我只需要反匯編他的主程序就夠了,于是,二話不說,用WD32ASM先把0.1版的“齒輪”給拆了,匯編代碼5000多行,并不算多。
我是從這個程序的導入函數著手的,以前編程時用于定時的SetTimer,timeGetTime,timeSetEvent等等這里都導入了,看看它們被引用的地方,我發現這些函數都是集中出現的,而且大都以這樣的形式出現:
* Reference To: WINMM.timeGetTime, Ord:0098h
:00401F3E 8B0D64424000 mov ecx, dword ptr [00404264]
:00401F44 8B11 mov edx, dword ptr [ecx]
也就是說,他并沒有調用這些函數,只是取得了函數的入口地址,保存在ecx中,然后又根據這個入口地址得到了函數的前面幾個字節,保存在edx中。
這讓我想到了前些日子在CSDN上面和別人討論的Hook API的原理,當時我還索取了一份Hook API的例程,如果我要Hook這里的函數timeGetTime,修改ecx中的地址或者修改edx處的頭幾條指令就行,用匯編語言寫,與上面看到的這段代碼類似。
為了測試“齒輪”是不是要Hook這里的timeGetTime,我自己編寫了一個很簡單的小程序,調用timeGetTime,每秒鐘顯示一個數字。用“齒輪”進行加速后,果然顯示的速度快多了。再用SoftIce跟進這個timeGetTime函數,第一條指令變成一個跳轉,這充分說明“齒輪”確實Hook了這幾個API,不難猜測,他要改變函數的返回值,也就是說在timeGetTime結束時還要再跳入“齒輪”自身的代碼,耐心跟下去,我發現回到timeGetTime時棧里多壓了一個地址,這樣,當timeGetTime用ret指令返回時,先返回“齒輪”的代碼(這個思想確實很巧),返回值經過處理后,才跳回我的應用程序。至于怎么處理這個返回值就簡單了,改到原先的2倍,應用程序速度也就提高了2倍。
回頭再看WD32ASM反匯編的代碼,我又發現在Hook API前面的不遠處使用了一次SGDT指令和兩次SLDT指令,這是x86保護方式的特有指令,用于獲得全局描述符表,進一步得到局部描述符表,這段代碼引起了我的興趣,用SoftIce跟進去,往下走幾步,一邊跟一邊猜,大致整理出了這樣的思路:
1.創建一個內存映射,把自己的代碼映射到0x80000000以上的地方,在Win9x下,這塊虛存是所有進程共享的。
2.先得到局部描述符表的地址,然后利用這張表修改代碼段的特權級。
3.用局部描述符表創建一個調用門,在x86的保護模式下要進入ring0必須通過門來進行,CIH是用中斷門完成的,這里用調用門完成,異曲同工。
4.保存幾個關鍵函數前六個字節,改為一條跳轉指令,跳到自己已經映射到高端的代碼。
5.發生函數調用時進入自己的代碼,通過調用門進入ring0,恢復函數開頭的幾個字節,修改返回值。
這時已經是凌晨5點了,既然主要思想已經掌握,我也就沒有細看這段代碼,8點鐘還要上課,睡覺去也。
回頭想想,我認為王榮先生的代碼還有幾點值得推敲之處:
1.如果要Hook API,一定要改變函數的第一條指令嗎?如果僅僅改變函數的入口地址,不是既容易編也容易調試嗎?
2.即使要改變函數第一條指令,一定要進入ring0嗎?
3.即使要進入ring0,使用中斷門不是比用調用門更方便嗎?
當然,按照王榮先生在他的主頁上的說法,“變速齒輪”0.1版是他在三年前即1997年寫的,那時Windows95剛剛出來兩年,能有這樣的技術已經難能可貴了,這里對王榮先生的鉆研精神表示由衷的敬佩。
在我研究出“變速齒輪”的原理后三天,我以自己原先的研究結果為核心,編寫出了“兄弟變速器”的最初版本,不用“變速齒輪”的技術是因為我認為我的技術更優越,何況也沒有拾人牙慧之嫌了 ^_^
最后再次對王榮先生表示感謝,這樣精彩的創意值得我們敬佩。