1. 程式人生 > >暗黑破壞神(DIABLOII 1.11B)BOT製作(一)

暗黑破壞神(DIABLOII 1.11B)BOT製作(一)

(一)淺談暗黑BOT

暗黑破壞神(DIABLOII)是十幾年前暴雪推出的一款經典網路遊戲,是網路遊戲的開山經典之作,很多玩家都是從大菠蘿1.09時代開始玩起,從1.09時代的神器WF到1.10的符文之語TP+、無線電法師,DIABLO帶給我們無數樂趣,遊戲、物品、技能設計堪稱經典。DIABLO推出的同時就有很多輔助的外掛工具同時出現,最出名的當屬MapHack和HackMap地圖外掛,能夠實現自動開啟地圖,自動輔助顯示一些物品,自動指路等等非常有用的功能,此外就是一些自動化打怪MF的工具稱之為BOT,從DIABLO 1.09時代到現在的1.13,陸續出現過MMBOT、D2JSP、KPBOT等很多BOT工具,到後期出現的D2NTBot,非常健壯,功能十分強大。本人也有過數次掛BOT被BAN的經歷,BOT雖然給DIABLO具有很大的傷害,有了BOT基本也就失去打神器的動力,但是BOT也是DIABLO粉絲的一大興趣所在。

作為有十幾年經歷的DIABLO玩家,一直以來卻沒有仔細研究過BOT和MapHack的工作原理。期間也有過使用按鍵精靈等滑鼠模擬軟體製作一些登陸、建遊戲等輔助的小工具,也有用按鍵精靈編寫的KP Bot,但是按鍵精靈這類軟體只能模擬滑鼠鍵盤操作,不能讀取利用遊戲的內部資料結構,因此侷限是非常大的,不能或者很難實現一些複雜的功能,比如複雜一點地圖的找路,基本是實現不了的。最近再次迴歸暗黑,在國內一著名的私服完了一個多月,再次萌生使用BOT的念頭,也不再滿足按鍵精靈實現的小功能。由於D2NT一類的BOT雖然非常強大,但是基本只支援1.12後的DIABLO版本,現在國內的私服基本都是1.11B的版本,適合1.11的BOT現在已經很難找到,再加上人到中年,最近單位工作比較閒點,雖然是十幾年前的程式了,興趣所在還是決心仔細研究一下MapHack的原理。

MapHack是十幾年前國外一個名為MousePad(滑鼠墊)的牛人最初編寫的,截獲了Diablo程式內部100多個函式的地址,還有大量的內部資料結構,再次對MousePad的非凡逆向工程能力表示欽佩!後來國內Sting對HackMap進行了修改推出了HackMap。MapHack的初期版本是開源的,MapHack2.24版本的原始碼在很多網站上還能找到(下面的網站可以下載:http://extreme-gamerz.org/diablo2/viewdiablo2/hacksdiablo2)。MapHack的工作原理在Sting的部落格中有詳細的介紹,不在贅述,簡單講就是找到內部一些有用的函式地址,利用這些函式地址我們可以實現兩種功能:一是可以我們自己寫的外掛程式直接呼叫,比如利用內部的傳送資料包函式,模擬向伺服器發資料包實現諸如TP、與NPC互動、釋放魔法、復活PET等等幾乎所有功能,二是可以把一些函式的最初幾個命令修改為call或者jmp,跳轉到我們自己的函式,從而修改遊戲的一些功能,類似windows的HOOK技術,Sting的部落格稱之為旁路。利用這種HOOK技術,可以修改遊戲的一些功能,比如可以支援只顯示有用的物品、支援地面物品一直顯示等,MapHack上的這類功能就是這麼實現的。BOT裡面可以HOOK遊戲的傳送和接受資料包函式,並用OutputDebugString輸出到DebugView中,對於解析遊戲資料包非常有用,還可以通過截獲伺服器端資料包判斷遊戲的一些狀態。

雖然已不再從事技術工作七八年時間了,還好基礎還在,經過細心研究,最終總算大概搞明白MapHack的大致結構和內部資料結構的大概含義。由於沒有任何文件和資料介紹,而且十幾年前的原始碼,開始時編譯都是大問題,研究十分幸苦。不過結果還好,經過一個多月的除錯再加上編寫新軟體,最終算是成功實現了自己的BOT,與現在流行的D2NT一類的BOT相比,可以算是一個小型的D2NT BOT了,只是對場景怪物的支援沒有D2NT的全面罷了,其他基本類似了,可以實現自動喝藥水、血少自動退出、任何場景可以實現自動找路TP、城內走路具有一定的健壯性、自動購買藥水和卷軸、自動發現裝備損壞程度自動修復裝備、支援PET功能、自動復活PET,支援自定義撿取並識別物品、物品識別支援對加技能、加力量、ED、FCR、加某一類角色的技能等等基本所有有用的屬性(因此可以設定只撿取如暗金項鍊裡的4r=30的馬拉,只撿取dex20的烏鴉戒指,只撿取綠色項鍊裡的tlx),可以完美實現A1安達利爾、A2督瑞爾、KP和打A1女伯爵、A2召喚者、A5尼拉塞克鑰匙的功能,其他怪物新增基本都是類似,技術上完全沒有問題。

至此實現這麼一個BOT已經遠超我的預期,而且根據BOT功能的需要,自己還成功找到了遊戲客戶端中另外兩個需要用到的函式地址,修改了MapHack原始碼上的一處資料結構錯誤。不過使用BOT的後果還是一樣的,老玩家都知道,長期掛BOT沒有不被發現的,果然沒多久戰網停權裡就有了我的全部賬號名單。也好,可以好好休息一下,再次對DIABLO說再見了。為了記錄此次研究的成果,特意將相關技術文件記錄在此,如果大家感興趣,可以把原始碼整理一下放上來。明天錄一段單機版的BOT效果放上來供記錄用。後續打算記錄BOT程式的一些關鍵功能及實現,供記錄,以後使用參考。

應大家要求,把bot放上來,供參考測試,出現的任何問題不要與我聯絡,我也不負責修改bug。