去年做了一些研究,研究做外掛的一些相關技術,打算放出來跟大家分享,分享一下我們做掛的一些思路,掛的原理,希望拋磚引玉。
外掛說白了就是用程序代替人去操縱游戲,模擬人向游戲程序發送鍵盤、鼠標消息。一般的流程就是:
1、 通過Windows系統的OpenProcess API打開目標進程 – 也就是游戲,以便能讀寫目標內存的數據,甚至是調用目標進程的函數,比如某些世界級的游戲里的Lua函數,或者游戲本身的C/C++函數。
2、 通過ReadVirtualMemory和WriteVirtualMemory來 讀取和修改一些關鍵信息,比如說人物的生命值,人物的坐標,游戲里地圖上各個元素等等。
3、 接着
a) 要么就是調用游戲里的一些函數,繞過游戲客戶端的一些約束,調用角色里的一些非常強大的功能,從而快速殺怪。但這種方法的缺點很明顯,服務器會做很多的檢查判定你是掛從而封殺你。
b) 要么就是直接向游戲進程發送鍵盤、鼠標等消息,通過判定地圖上的障礙物、怪物之類的東西過地圖,當然殺怪也是通過模擬按鍵來完成。
然而隨着外掛對游戲的破壞性影響,反外掛和外掛的反反外掛技術都已經在內核層纏斗了,比如:
1、 為了防止外掛調用Windows系統的一系列關鍵API(例如OpenProcess、Read/WriteVirtualMemory等),網游程序一般都會在游戲啟動時在Windows操作系統上加載一個驅動程序,這個驅動程序的目的就是修改一系列關鍵API的代碼,有時也會將游戲進程在系統中隱藏掉,從而使用戶態的外掛和調試器無法訪問游戲進程。
2、 為了防止外掛制作者通過內核調試技術來分析游戲對系統關鍵API的代碼修改,反外掛驅動啟動后一般都會禁用內核調試(反調試技術、反調試技術二)。
3、 另外游戲程序也會屏蔽Windows系統用來向游戲進程發送鍵盤、鼠標等消息的函數。
4、 為了防止游戲里的關鍵數據被輕易修改,一般生命值這些東西游戲程序都會將其加密,使用一個加密函數去讀寫。
5、 另外為了防止外掛殺怪太強從而影響游戲的平衡,一般來說從游戲服務器端,一張地圖里的怪物坐標、類型等數據,是一點點傳到客戶端的。
6、 還有很多……(我自己經驗也不夠,一時半會也枚舉不完)。
那么做外掛的第一步,就是破解這個反外掛驅動,否則不僅沒辦法操控游戲進程,也沒有辦法使用調試器逆向分析游戲里的一些關鍵數據,於是通常的做法是:
1、 首先破解反外掛驅動的禁用內核調試的手段,一般都是通過Windbg和虛擬機用內核調試技術來完成的。
2、 然后找出反外掛驅動對系統API的更改。
3、 然后再寫一個驅動程序,繞過反外掛驅動對系統API的更改。
但上面的方法有點累,因為破解禁用內核調試的手段就需要進行一些逆向了,而且還要對反外掛驅動逆向,比較麻煩。但是它並沒有禁用本地內核調試功能和內存文件生成的功能,因此我們可以使用這種方式調試和開發驅動,簡便程度比雙機內核調試差一點點。
1、 使用本地內核調試:
windbg -kl
2、 生成內存(dump)文件:
修改\HKLM\SYSTEM\CurrentControlSet\Control\CrashControl里的:
AutoReboot
CrashDumpEnabled
1 – 代表完全保存物理內存內容
2 – ?
3 – minidump
如果修改為1,BSOD(藍屏)之后,完全內存保存在%windir%\memory.dmp
如果修改為3,BSOD(藍屏)之后,minidump保存在%windir%\minidump\文件夾下面。
還有一個比較簡單的方法,就是你在自己的破解驅動里,故意往SSDT寫一些垃圾數據,然后導致系統BSOD(藍屏),重啟機器后用windbg打開dump打開memory.dmp文件,執行!analyze –v命令會自動給你顯示所有被hook的函數和hook的地址、代碼等等信息,這樣可以直接做完第1和第2步。
最后剩下的編碼就比較簡單了,具體的代碼請參看以前的博客:破解XXX游戲驅動保護過程總結、另外有個朋友的破解過程寫的很詳細,也建議大家看看:過 DNF TP驅動保護(一)。
最后如果大家對調試技術感興趣的話,可以考慮購買我的新書: 應用程序調試技術,這套視頻除了講解調試的技巧外,還盡量完整地講解了周邊用到的技術,這是因為調試技術要好的話,需要基礎功和背景知識扎實才行。
謝謝大家,未完待續……