查看單個文章
舊 2004-10-16, 09:01 AM   #5 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

網路遊戲外掛製作之我所見(5)


我一直沒有搞懂製作加速外掛是怎麼一回事,直到前不久又翻出來了2001年下半期的《程序員合訂本》中《「變速齒輪」研究手記》重新回味了一遍,才有了一點點開悟,隨後用Delphi重寫了一遍,下面我就把我的心得說給大家聽聽,並且在此感謝《「變速齒輪」研究手記》作者褚瑞大虲給了提示。廢話我就不多說了,那就開始神奇的加速型外掛體驗之旅吧!


原本我一直以為加速外掛是針對某個遊戲而寫的,後來發現我這種概念是不對的,所謂加速外掛其實是修改時鐘頻率達到加速的目的。



以前DOS時代玩過編程的人就會馬上想到,這很簡單嘛不就是直接修改一下8253暫存器嘛,這在以前DOS時代可能可以行得通,但是windows則不然。windows是一個32位的操作系統,並不是你想改哪就改哪的(微軟的東東就是如此霸氣,說不給你改就不給你改^_^),但要改也不是不可能,我們可以通過兩種方法來實現:


第一是寫一個硬體驅動來完成,第二是用Ring0來實現(這種方法是CIH的作者陳盈豪首用的,它的原理是修改一下IDE表->新增一個中斷門->進入Ring0->使用中斷修改向量,但是沒有辦法只能用ASM彙編來實現這一切*_*,做為進階語言使用者慘啦!),用第一種方法用點麻煩,所以我們在這裡就用第二種方法實現吧~~~
在實現之前我們來理一下思法吧:


1、我們首先要寫一個程序在這個程序裡嵌入彙編語言來實現修改IDE表、新增中斷門,修改向量等工作

2、使用這個程序來實現加速功能
好了,現在思法有了,我們就邊看程式碼邊講解吧:


首先我們建立一個程序,這個程序就是本程序的核心部份:


procedure SetRing(value:word); stdcall;
const ZDH = $03; 設一個中斷號
var
IDT : array [0..5] of byte; 儲存IDT表
OG : dword; 存放舊向量
begin
asm
push ebx
sidt IDT 讀入中斷描述符表
mov ebx, dword ptr [IDT+2] IDT表基位址
add ebx, 8*ZDH 計算中斷在中斷描述符表中的位置
cli 關中斷
mov dx, word ptr [ebx+6]
shl edx, 16d
mov dx, word ptr [ebx]
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),呵呵,試一下吧,這對你說明 會很大的,呵呵。
psac 目前離線  
送花文章: 3, 收花文章: 1625 篇, 收花: 3196 次