成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

協(xié)議型網(wǎng)絡(luò)游戲外掛制作之啟動(dòng)

2010-08-28 10:44:50來源:西部e網(wǎng)作者:

  聲明:本人只講技術(shù)實(shí)現(xiàn),因?yàn)楸疚囊鹌渌暮蠊c本人無關(guān)。

  目前,網(wǎng)絡(luò)游戲的外掛從程序角度主要分為輔助型的動(dòng)作外掛和內(nèi)核型的協(xié)議型外掛。動(dòng)作外掛主要幫助玩家進(jìn)行一些重復(fù)性的勞動(dòng)量,網(wǎng)絡(luò)上有許多介紹這方面的程序,按鍵精靈就是一個(gè)很好的例子。協(xié)議型外掛則給人一個(gè)很神秘的感覺,這方面在網(wǎng)絡(luò)游戲上最多的恐怕是傳奇的脫機(jī)外掛,這也是因?yàn)閭髌孀钍軞g迎而已。

  在具體的講解前,我很想扯點(diǎn)別的事情,畢竟學(xué)院不是我的風(fēng)格,我更喜歡自由一點(diǎn)的。既然我們主要是針對(duì)協(xié)議型外掛的制作教程,就先扯扯網(wǎng)絡(luò)游戲的流程和一些亂其八糟的事情,如果有冒犯你們的地方本人則不勝感激。如果你感到煩的話可以直接跳到你感興趣的地方。

  我玩網(wǎng)游的歷史很短,剛開始玩得是魔力寶貝,總是在免費(fèi)的時(shí)候玩,在一個(gè)服務(wù)器里面呆的最長的就是在四川臥龍了,現(xiàn)在服務(wù)器大概早就該名或者并組了吧,在里面我的名字叫Bluerose,名字前面帶的是我的職業(yè),小號(hào)一大堆,不過名字都是一樣的。用這個(gè)名字是因?yàn)榕笥颜f我很憂郁,但卻總抱著希望,所以就用這個(gè)名字了。后來玩的是大話西游II,是朋友拉著玩的,現(xiàn)在雖然上了班,但偶爾還玩,里面的名字叫星淚,用的是女性玩家,因?yàn)檫@個(gè)名字太女性化了。在剛開始玩得時(shí)候,我覺得自己好孤獨(dú)(那時(shí)候在大學(xué)雖然旁邊都是同學(xué)朋友,但內(nèi)心仍然孤獨(dú)),朋友拉我玩大話的時(shí)候,那天晚上星光倒不錯(cuò),灑下的星光讓我想起了眼淚的感覺,所以就叫獨(dú)孤星淚了,不過感覺這個(gè)名字太裸露,就將獨(dú)孤二字去掉了。

  由于玩大話西游II的歷史比較長,而且對(duì)大話西游的游戲也比較熟悉,所以這次的教程就用大話西游II做為目標(biāo)了,但教程盡可能考慮通用性。不過提前聲明,本人對(duì)網(wǎng)絡(luò)游戲并不熟悉,因此請(qǐng)勿和本人談?wù)摼W(wǎng)絡(luò)游戲的前因后果和發(fā)展以及網(wǎng)游外掛對(duì)網(wǎng)絡(luò)游戲的沖擊等亂其八糟的事情。我對(duì)網(wǎng)絡(luò)編程也是一知半解,因此我盡可能的避免含有網(wǎng)絡(luò)的代碼,同時(shí),由于協(xié)議型的外掛需要發(fā)送數(shù)據(jù),但可以通過其它的辦法來進(jìn)行(比如通過網(wǎng)游客戶端來代理)。

  先說說服務(wù)器和客戶端的通訊,由于服務(wù)器和本地的客戶端不在同一個(gè)地理位置,相距比較遙遠(yuǎn),因此數(shù)據(jù)的傳輸就需要一定的時(shí)間,這就決定了在網(wǎng)游中數(shù)據(jù)只能進(jìn)行采樣的收集處理而不能進(jìn)行真正實(shí)時(shí)的數(shù)據(jù)處理。舉例來說,局域網(wǎng)C-S(反恐精英)的數(shù)據(jù)處理,當(dāng)你移動(dòng)的時(shí)候,必須告知?jiǎng)e的電腦玩家自己的移動(dòng),這個(gè)數(shù)據(jù)的傳輸由于在局域網(wǎng)內(nèi)部,數(shù)據(jù)的傳輸比較快,量也比較小,電腦可以進(jìn)行快速的采樣和數(shù)據(jù)處理來進(jìn)行判斷是否打中或者移動(dòng)是否違反規(guī)則(比如凌空徐步)等等,但在網(wǎng)絡(luò)上進(jìn)行玩的時(shí)候,對(duì)數(shù)據(jù)的采樣就不像本地局域網(wǎng)那么快了,以大話西游II(以后簡稱大話吧,少打幾個(gè)字)為例,在移動(dòng)的時(shí)候,并不是將每一步的數(shù)據(jù)一個(gè)一個(gè)傳送給服務(wù)器,而是將本次移動(dòng)規(guī)則打成數(shù)據(jù)包提交給服務(wù)器,讓后客戶端開始播放動(dòng)畫,當(dāng)服務(wù)器處理完數(shù)據(jù)之后,就會(huì)將位置回傳給客戶端,客戶端以這個(gè)位置數(shù)據(jù)為基點(diǎn),進(jìn)行人物的下次移動(dòng),這個(gè)數(shù)據(jù)的采集需要隔一段時(shí)間來能進(jìn)行一次采集,相對(duì)于CS來說,這個(gè)采集密度要比CS采集密度小。

  當(dāng)服務(wù)器和客戶端進(jìn)行通訊的時(shí)候,數(shù)據(jù)包是至關(guān)重要的。數(shù)據(jù)包中數(shù)據(jù)的規(guī)則則是協(xié)議型外掛最重要的基礎(chǔ)之一。由于網(wǎng)絡(luò)數(shù)據(jù)可以進(jìn)行攔截,為了防止數(shù)據(jù)被修改,數(shù)據(jù)包中的數(shù)據(jù)都是加密進(jìn)行,至于如何加密,這由服務(wù)器和客戶端通過一定的算法來執(zhí)行。因此,服務(wù)器和客戶端的通訊大概就是下面這個(gè)樣子:

  客戶端進(jìn)行數(shù)據(jù)的采集===〉數(shù)據(jù)打包==〉數(shù)據(jù)加密==〉發(fā)送數(shù)據(jù)到服務(wù)器==〉服務(wù)器進(jìn)行數(shù)據(jù)解密====〉服務(wù)器處理數(shù)據(jù)包==(處理完畢回傳數(shù)據(jù))==〉回傳數(shù)據(jù)打包==〉回傳數(shù)據(jù)加密==〉數(shù)據(jù)回傳==〉客戶端接收數(shù)據(jù)==〉客戶端解密數(shù)據(jù)==〉客戶端數(shù)據(jù)處理

  我們的目標(biāo)就是數(shù)據(jù)包,即攔截游戲通訊間的數(shù)據(jù)來進(jìn)行相應(yīng)的修改或者進(jìn)行發(fā)送偽數(shù)據(jù)包。我大概定了一個(gè)計(jì)劃,不過這一節(jié)肯定不能全部講完,我只能在下班之后寫上一點(diǎn),時(shí)間有限,能寫多少就寫多少吧。

  目標(biāo)程序:大話西游II客戶端。(你手上有服務(wù)器端嗎?有的話我也想要)

  目標(biāo):數(shù)據(jù)包

  目的:數(shù)據(jù)包攔截,修改,偽發(fā)送

  編程軟件:這個(gè)無所謂吧,不過我這里用的是C++ Builder 6,前段時(shí)間做CB 6相關(guān)的項(xiàng)目,而且CB 對(duì)于程序界面的編寫是最方便不過的了,就是編譯的有點(diǎn)慢和生成的程序有點(diǎn)大。(旁白:又不是做手機(jī)項(xiàng)目,擔(dān)心容量嗎?)我做受限程序做慣了,養(yǎng)成了不良習(xí)慣,沒辦法了。

  思路:我們的程序要干擾別的程序的運(yùn)行,最好的辦法是使用debug的辦法,不過,我并沒有打算使用debug的辦法,我對(duì)程序的debug并不太熟悉,而且討厭編寫沒用的代碼。我準(zhǔn)備采用線程注入的辦法,至于線程注入,和為什么要線程注入才能干預(yù),這方面的知識(shí)最好自己看看《Windows 核心編程》里面講的,否則這個(gè)教程要沒完沒了了。當(dāng)我們的線程注入到目標(biāo)程序之后就方便多了,就可以為所欲為了。因此我們的第一目的是將線程注入到目標(biāo)程序中。

  預(yù)備活動(dòng):

  線程注入最簡單的莫過于hook了,如果連這都不知道的話,最好趕快到網(wǎng)上查查或者翻翻《Windows核心編程》。為了防止游戲內(nèi)部存在反hook的存在和外掛的檢測(cè),我將用自己的程序來啟動(dòng)目標(biāo)程序。由于網(wǎng)游的不定期更新,因此在啟動(dòng)程序的時(shí)候最好將升級(jí)跳過去,至少在大話這樣的程序中我是這樣做的,因?yàn)轭l繁升級(jí)和版本檢測(cè)總讓我等的時(shí)間太長。

  下面來進(jìn)行具體的做法,我盡可能的弄出詳細(xì)的步驟,如果你用的是VC或者其它的話,只要注意核心的代碼就可以了。

  新建一個(gè)工程,在窗體上添加兩個(gè)按鈕(TButton或者其它類型的按鈕),一個(gè)將標(biāo)題改為啟動(dòng)游戲,另一個(gè)標(biāo)題改為啟動(dòng)外掛。再添加一個(gè)TOpenDialog。對(duì)于默認(rèn)的窗體那么大的界面有點(diǎn)浪費(fèi),因此將窗體弄得小點(diǎn),別大大的怪嚇人的。

  雙點(diǎn)啟動(dòng)游戲的按鈕就可以進(jìn)行編寫該按鈕的事件了,默認(rèn)的是OnClick事件。下面就是事件的代碼:

if(FileExists(ExtractFileDir(Application->ExeName)+"\\path.ini")==FALSE)

{ /*我將目標(biāo)程序的路徑保存到了當(dāng)前程序目錄中的path.ini文件中,但如果當(dāng)前程序第一次運(yùn)行的話,
是不存在這個(gè)文件的,所以就可以用TOpdnDialog來打開了,
做這點(diǎn)只是為了方便,不用每次都得點(diǎn)目標(biāo)程序*/

if(OpenFile->Execute())
{
  AnsiString AppPath="path="+ExtractFilePath(OpenFile->FileName);
 WritePrivateProfileSection("XY2PATH",AppPath.c_str(),(ExtractFileDir(Application->ExeName)+
"\\path.ini").c_str());//將目標(biāo)程序的路徑存到path.ini文件中。
}else
{
 return;
}
}

//下面的代碼開始啟動(dòng)目標(biāo)程序

PROCESS_INFORMATION pi;
STARTUPINFO si;
si.cb=sizeof(si);
si.lpReserved=NULL;
si.lpDesktop=NULL;
si.lpTitle=NULL;
si.cbReserved2=0;
si.lpReserved2=NULL;
si.dwFlags=STARTF_USEPOSITION;
si.dwX=0;
si.dwY=0;
char Appname[300];

GetPrivateProfileString("XY2PATH","path","",Appname,250,(ExtractFileDir(Application->ExeName)+
"\\path.ini").c_str());

strcat(Appname,"\\xy2.exe");
/*以上都在構(gòu)建目標(biāo)程序的環(huán)境設(shè)置,下面調(diào)用CreateProcess來啟動(dòng)目標(biāo)程序,
注意將倒數(shù)第3個(gè)參數(shù)要填為目標(biāo)程序的路徑,
第6個(gè)參數(shù)為CREATE_SUSPENDED是為了將程序加載到內(nèi)存中之后可以進(jìn)行一些修改,
以更好的配合外掛程序的運(yùn)行*/

if(CreateProcess(Appname,NULL,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,ExtractFileDir(Appname).
c_str(),&si,&pi)==0)
{
 //啟動(dòng)目標(biāo)程序失敗
 showMessage("error open exe file");
 return;
}
gamehandle=pi.hProcess;

/*在本節(jié)中要執(zhí)行程序的話,最好將這個(gè)條件注釋掉,我將在以后的教程中進(jìn)行講解,這里大概說一下功能,
第一個(gè)Write是為了跳過Update,第二個(gè)是為了退出的時(shí)候不打開網(wǎng)頁,
我的電腦要是退出大話的時(shí)候打開網(wǎng)頁的話,中間的時(shí)間可以抽上幾根煙了,所以將程序改了*/

if(WriteProcessMemory(gamehandle,(void*)0x0042BC13,No_Update,1,NULL)==false
||WriteProcessMemory(gamehandle,(void*)0x00430a80,No_HTML,2,NULL)==false
)
return;
threadhand=pi.hThread;
gamethreadid=pi.dwThreadId;
//恢復(fù)程序,讓程序執(zhí)行
ResumeThread(pi.hThread);
/*下面的代碼也是本節(jié)中不需要的,我將物品的有關(guān)信息存到了當(dāng)前目錄(外掛啟動(dòng)程序目錄)中的item.ini文件中,
但目標(biāo)程序中并不知道外掛啟動(dòng)程序的路徑,因此我在目標(biāo)程序文件夾中建立了一個(gè)名字叫path.ini文件,里面包含了item.ini的路徑*/

String inipath= "path="+ExtractFileDir(Application->ExeName)+"\\item.ini";
WritePrivateProfileSection("ITEM",inipath.c_str(),(ExtractFileDir(OpenFile->FileName)+
"\\path.ini").c_str());

  啟動(dòng)程序中將啟動(dòng)屬性設(shè)置為CREATE_SUSPENDED屬性是為了考慮到程序的通用性和穩(wěn)定性,在該函數(shù)之后,如果目標(biāo)程序中存在有必要修改的代碼的話,可以在這里進(jìn)行修改,也可以對(duì)目標(biāo)程序進(jìn)行反反外掛的處理。其實(shí),debug形式的外掛就可以在這里進(jìn)行debug環(huán)境的建立,以及在目標(biāo)程序中插入Int 3指令來進(jìn)行攔截處理了(我怎么越來越感覺到自己在寫調(diào)試器的教程??)。

  這節(jié)就講到這里,如果再晚的話,我就沒辦法趕上公交車了,然后還得走回家,天哪,這么冷的天~~~~趕緊上傳回家吧。

       請(qǐng)勿將文章用于任何商業(yè)場合,如果因?yàn)楸窘坛桃鹌渌暮蠊脑挘瑒t與本人無關(guān),本人只講技術(shù)實(shí)現(xiàn)。如果要轉(zhuǎn)貼的話,請(qǐng)注明出處,如果有疑問或者商議的話,請(qǐng)發(fā)E-Mailzeze0556@sina.com或者QQ23033206留言,MSNzeze0556@msn.com。另外請(qǐng)勿給我信箱發(fā)垃圾郵件,在添加好友的時(shí)候一定要寫好附言,我已經(jīng)被莫名其妙的廣告信件和流言蜚語嚇得沒有膽了。算是我求各位大蝦了。


 

關(guān)鍵詞:外掛
主站蜘蛛池模板: 沂南县| 景德镇市| 交城县| 明星| 克东县| 乐亭县| 德阳市| 大石桥市| 博兴县| 贺兰县| 中江县| 临清市| 句容市| 邹平县| 玛纳斯县| 临高县| 宜阳县| 外汇| 宣汉县| 白山市| 阿荣旗| 聂荣县| 房产| 乌兰县| 湟源县| 锡林郭勒盟| 巴南区| 宜州市| 宣汉县| 阳原县| 天津市| 介休市| 长宁县| 武汉市| 宁波市| 贡嘎县| 理塘县| 祁连县| 佛坪县| 莒南县| 汝阳县|