遊戲輔助外掛是修改遊戲進程的數據和代碼的作弊程序,輔助外掛對遊戲負面影響極大,對抗輔助外掛也是勢在必行。而對抗輔助外掛首先需要對外掛的開發流程有一個詳細透徹地了解,本小節將系統地介紹手遊輔助外掛開發流程,揭開外掛的神秘面紗。
隨著手機遊戲產業鏈的壯大,手遊吸引著越來越多地用戶和廠商加入。與此同時,也吸引了一部分外掛開發者從PC端遊戲產業轉移到手遊產業,形成了龐大的外掛地下黑色產業鏈。目前手機端上的輔助外掛種類豐富多樣,包括定製化外掛、內存修改器、變速器、按鍵精靈等,其中定製化外掛是針對特定地遊戲,包含了豐富且強大的作弊功能,在輔助外掛中佔據了重要的地位,也是遊戲安全對抗的重點所在。
因此本章節著重針對定製化輔助外掛的開發流程進行介紹。定製化外掛的開發流程較為複雜,涉及到的技術較多,其中很多技術在對抗輔助外掛時也應用廣泛,了解和掌握這些技術在對抗輔助外掛時也會極具奇效。
二、輔助外掛基礎開發流程2.1 總體流程如下圖2-1所示,為定製化輔助外掛的總體開發流程。定製化輔助外掛的主最終目的是為了對遊戲進程的數據和代碼進行修改,從而實現特定的作弊功能。下面小節將簡單介紹各流程,具體技術細節可以參考後面章節。
圖2-1 定製化輔助外掛開發流程
2.2 逆向分析遊戲邏輯在開始進行遊戲的輔助外掛開發前,需要對遊戲進程進行逆向分析,了解遊戲的具體邏輯,才能針對特定的遊戲邏輯來製作輔助外掛。例如針對一個射擊類型的遊戲,輔助外掛功能可以包括無限暴走、秒殺、無敵、敵機不攻擊等。要實現戰機無敵功能需要分析遊戲的傷害邏輯,要實現秒殺和敵機不攻擊功能需要分析遊戲的攻擊邏輯。
在Android平臺上,最常見的就是cocos2d遊戲與unity3d遊戲,cocos遊戲的逆向分析可以藉助IDA Pro工具,使用IDA既可以對遊戲主邏輯模塊進行靜態分析,也可以對遊戲進程進行動態調試,具體分析方法可參見前面《IDA靜態分析》與《Android平臺IDA動態調試》章節。unity遊戲的逆向分析方法與cocos遊戲稍有不同,unity遊戲的主邏輯代碼使用C#語言編寫,代碼一般存放在」Assembly-CSharp.dll」文件中,通過ILSpy等工具可以將dll文件反編譯成C#代碼。在IOS平臺上,同樣可以使用IDA工具對遊戲程序的主邏輯模塊進行靜態分析,但IDA暫不支持IOS平臺上的動態調試,讀者可使用GDB或lldb工具對IOS平臺上的遊戲進程進行動態調試。
遊戲進程在運行過程中會加載很多內部和外部的模塊,其中就包含遊戲的主邏輯模塊,輔助外掛主要目標就是修改主邏輯模塊的代碼和數據。要修改主邏輯模塊的代碼和數據,首先就必須先獲取主邏輯模塊在內存中加載的基地址。
通過枚舉遊戲進程的所有模塊,根據模塊名稱可以定位到指定的模塊加載基地址。在Android平臺上,不注入遊戲進程就可以對遊戲進程的模塊進行枚舉,讀取」/proc/$pid/maps」文件可以獲取遊戲進程的當前加載的所有模塊名稱、基址、權限等信息,其中pid為遊戲進程的ID。在IOS平臺上,必須先注入遊戲進程才能枚舉進程模塊,通過遍歷遊戲進程的虛擬內存,定位dyld模塊以及「_dyld_all_image_infos」符號數據,從符號的內容地址中獲取模塊信息。
2.4 注入遊戲進程雖然在Android平臺上枚舉遊戲進程模塊不需要注入遊戲進程,但是輔助外掛要修改遊戲進程的代碼和數據就必須注入遊戲進程。注入遊戲進程的方法豐富多樣,但Android設備上動態注入遊戲進程需要先獲得root權限,在IOS設備上注入遊戲進程則需要先進行越獄。
在Android平臺上可以通過ptrace直接注入共享連結庫到遊戲進程中,並且執行共享連結庫中的函數。但目前手遊市場上很多遊戲都針對ptrace注入進行了保護,輔助外掛無法簡單地直接ptrace注入到遊戲進程中,此時輔助外掛另闢蹊徑,通過ptrace注入zygote進程來間接注入遊戲進程。在Android系統中,大部分應用程式進程都是由zygote進程創建,遊戲進程也不例外,輔助外掛注入zygote進程後,HOOK zygote創建子進程和加載主Activity的函數來感知遊戲進程的創建,在遊戲進程創建時注入模塊到遊戲進程中。除了動態注入遊戲進程外,還可以通過靜態感染ELF的方式來注入遊戲。在IOS平臺上通過mobilesubstrate庫可以很方便地將dylib注入到遊戲進程中。
2.5 Hook關鍵函數在注入到遊戲進程後,可以對遊戲進程主邏輯模塊中的代碼進行修改。而輔助外掛為了實現開關控制,一般會對遊戲的關鍵函數進行HOOK,可以在遊戲調用關鍵函數時獲取執行權限,用於實現外掛功能。
Hook又被稱為鉤子,Hook技術不僅僅應用於輔助外掛和惡意軟體的開發,在很多安全軟體上都頻繁使用到Hook技術。函數Hook技術的本質就是劫持函數的調用。在Android平臺上,可以在Java層對API函數進行Hook,也可以在Native層對進程的So庫函數進行Hook。在遊戲外掛對抗領域,由於遊戲的主邏輯核心代碼都在So文件中,所以輔助外掛常採用的就是Native層的Hook技術。Native層的Hook方式多種多樣,包括導入表Hook、基於異常的Hook、Inline Hook等。
導入表Hook是通過替換對應So文件的.Got表中指定函數地址實現對函數的Hook,基於異常的Hook方式是修改指定地址處代碼為異常指令,通過異常處理函數捕獲異常,獲取執行權限和當前執行的上下文環境。Inline Hook在Windows、Linux平臺都有廣泛地應用,Android平臺上的Inline Hook實現原理與其他平臺相似,都是通過修改函數指令跳轉到Hook函數。
Android平臺上也出現了很多第三方的Hook框架工具。其中代表的就是Xposed框架和Cydia Substrate框架。Xposed框架是一款可以在不修改APK程序的情況下影響程序運行的框架,通過替換」/system/bin/app_process」 程序控制 zygote 進程,使 app_process 在啟動過程中加載XposedBridge.jar,從而劫持Zygote進程及其創建的Dalvik虛擬機。Cydia Substrate框架在Android和IOS平臺上都有廣泛地應用,曾名噪一時的叉叉外掛就採用了Substrate框架來對遊戲進程的函數進行Hook。
2.6 遊戲內存數據修改Hook技術本質上是對代碼的修改,在遊戲進程內存中,代碼也是數據,故Hook也是一種對遊戲內存數據修改的方法。除了對代碼的修改外,輔助外掛也經常對遊戲內存數據進行修改,其中比較典型的就是修改器,市面上流行的修改器有葫蘆俠修改器和燒餅修改器,這兩種修改器都是通過搜索」/proc/$pid/mem」來實現的,」/proc/$pid/mem」是對應進程的內存映射,通過搜索該文件就可以在不注入遊戲進程的情況下搜索和修改遊戲進程內存數據。
*轉載請註明來自遊戲安全實驗室(GSLAB.QQ.COM)