黃佳
【摘 要】隨著智能手機和平板電腦的普及,移動手機用戶越來越多,移動游戲的市場規模也隨之暴漲,如此大的市場規模,必定會引來手游行業中的激烈競爭。一款游戲若想在激烈的市場競爭中生存下來,在游戲中需內置健全的保護措施。因此,建立檢測游戲是否存在作弊行為的機制是十分必要的。它既可以加固游戲,保證游戲擁有正常的規則環境,也可以防止其他方對游戲的惡意攻擊和破壞,起到積極的保護作用。
【關鍵詞】Unity;檢測作弊;Apk;Android
【中圖分類號】TP393 【文獻標識碼】A 【文章編號】1674-0688(2017)03-0133-03
在《2016中國游戲產業報告》中,在國內火爆的手游取得了驕人的成績,移動游戲的市場份額第一次超過客戶端游戲,成為份額最大的細分市場,國內銷售收入達到819.2億元,占比超過客戶端游戲市場,達到49.5%,成為份額最大、增速最快的細分市場。隨著行業的發展,國內手游市場還遠未達到飽和狀態,VR設備的出現,VR概念手游的提出,VR游戲的崛起,移動手游行業潛在增長點可望在未來數年內進一步成熟。SuperData等歐美地區的各種權威的統計報告都顯示VR市場有巨大的空間,Oculus Rift、HTC Vive和PSVR三大VR設備相繼發布,也為國內的VR游戲開發者提供了更有潛力的平臺。如此大的市場規模,手游行業中各種正常和非正常的競爭是十分激烈的。手游產品若想獲得更長的生命周期,除了產品完整精美之外,能夠經得起玩家搗鼓,抗第三方工具摧殘,安全地運行也至關重要。因此,對游戲加固,在游戲中建立檢測是否存在作弊行為的機制是十分必要的。
1 檢測游戲是否存在作弊行為的理論
1.1 模擬器檢測
?譹?訛模擬器具有一定的特征,一般的檢測方法主要是對模擬器的IMSI、IDS、默認文件、默認號碼等幾個方面進行檢測。在得知了這些信息后,只需在運行時進行檢測,如果檢驗結果與默認值吻合,那么檢測設備便是模擬器,這是較為傳統的檢測方法。②基于模擬器CPU信息的檢測,主要是檢測CPU信息是否包含intel、amd等字段。相較于傳統方法,該方法有了更高的檢測成功率,很多模擬器目前對于CPU信息還無法進行模擬。類似的原理,還可以檢測google_sdk,sdk,sdk_x86,vbox86p等相關信息來識別是否是模擬器。③關鍵路徑檢測特定模擬器,對于某些具有反防作弊功能的模擬器,需要特定的檢測方法,bluestacks成功躲避了前2種檢測方法,檢測這類模擬器時可以根據總結出的一些bluestacks的關鍵路徑進行檢測。④電池信息檢測,可以從電池的溫度和電量等信息入手,檢測溫度在使用過程中是否一直保持不變,或者電量一直是固定值并且不是百分之百等,可以鑒別出genymotion、bluestacks等主流模擬器。⑤模擬器檢測與模擬器反檢測都在不斷地更新迭代中,無法確保哪一種方法會長久使用,很多時候在檢測模擬器的過程中,都不是只使用某一種固定的方法,需要具體問題具體分析,也需要用多種方法來綜合檢測。檢測出模擬器玩家,可以有效地控制和防止黑客玩家在電腦端使用模擬器對游戲外掛、作弊、分析調試,保證玩家在游戲既定的環境下操作及游戲,保障游戲的順利運營。
1.2 第三方加速器檢測
手游和端游的通用加速功能原理都相同,通常游戲需要以幀為單位播放畫面,播放畫面過程中計算每幀動畫播放所需時間(也可理解為2個畫面切換的間隔時間),游戲需要調用C庫函數獲取系統時間以供計算每幀更新。目前,手機端絕大部分游戲基于兩大引擎,分別為Cocos2D引擎、Unity3D引擎。引擎中實現了游戲每幀更新相關處理邏輯(包括每幀更新時間的計算),因此導致使用固定引擎的游戲每幀更新所需時間計算過程中調用的Libc.so模塊完全相同。通過Unity3D的代碼內容可看出,Unity3D引擎為游戲開發者提供通用的Update函數,該函數會在游戲每幀更新的邏輯進行調用,每幀更新邏輯完全封裝于Unity3D引擎提供的LibtUnity.so模塊中。
手游通用加速出現的根本原因如下:絕大部分手機游戲使用兩大引擎(Cocos2D引擎和Unity3D引擎)開發游戲,兩大引擎采用固定的Libc.so函數計算游戲每幀更新(Cocos2D引擎通過libc.so的gettimeofday函數計算每幀更新,Unity3D引擎通過調用clock_gettime計算每幀更新)所需時間,從而通過修改引擎獲取時間或者影響計算每幀更新相關變量便能實現手游通用加速功能。
基于手機端采用兩大引擎實現的游戲,通用的游戲加速功能可通過以下方式實現。?譹?訛基于游戲邏輯的:修改游戲計算每幀更新所需變量;通過修改代碼影響每幀計算的時間結果。?譺?訛與游戲邏輯無關的:修改主邏輯模塊導入表;通過InlineHook方式修改Libc.so模塊的時間函數(gettimeofday/clock_getime)或者修改更加底層的代碼。基于游戲邏輯實現的加速修改,針對每幀更新所需變量的修改,可以通過檢測是否存在內存修改進行阻攔,此方法將在下文具體說明;針對通過修改代碼影響每幀計算的時間結果實現的加速,可以在發布游戲的時候,將游戲代碼進行加密,防止游戲源代碼被非法竊取、篡改,以達到黑客玩家通過修改代碼達到加速的目的。目前,外網主流的游戲整體加速器(葫蘆俠變速精靈、叉叉及圈圈加速器、燒餅修改器、晃悠游戲大師),均采用與游戲邏輯無關的的方式實現通用加速功能,不同引擎,加速器修改了不同Libc.so相關函數。葫蘆俠變速精靈加速功能針對Cocos引擎修改了所有模塊的gettimeofday函數導入表,其他幾款工具修改gettimeofday、clock_getime的Libc.so相關代碼實現加速功能,每款工具基于不同引擎的加速功能實現方式匯總見表1。
因此,通過檢測時間函數是否存在異常,檢測設備進程中是否存在第三方加速器的特征,便可檢測出黑客玩家是否有可能使用加速器,進而加以必要的約束,防止黑客玩家使用加速器糟蹋游戲,變相攻擊游戲服務器。
1.3 內存修改檢測
一般內存修改的原理是第三方工具使用打開進程等類似的api以適當的權限打開游戲進程,找出數據段范圍,然后對該進程的地址范圍進行掃描后,修改數據內容,以達到內存修改的目的。
Android系統是基于Linux系統,Android要針對其他進程進行內存修改是基于Ptrace系統調用,Ptrace提供了一種父進程可以控制子進程運行,并可以檢查和改變它的核心image。它主要用于實現斷點調試。一個被跟蹤的進程運行中,直到發生一個信號,則進程被中止,并且通知其父進程。在進程中止的狀態下,進程的內存空間可以被讀寫。父進程還可以使子進程繼續執行,并選擇是否忽略引起中止的信號。在Linux系統中,可以通過Ptrace系統調用實現對進程的內存修改。大致過程如下:①通過遠程進程pid,attach遠程進程。②獲取遠程進程寄存器值并保存,以便注入完成后恢復進程原有狀態。③獲取遠程進程系統mmap、dlopen、dlsym調用地址。④根據值搜索和proc//maps中的地址和偏移量與前端交互。⑤根據值的變化,確定內存地址(一般沒辦法精確到一個)。⑥根據內存地址修改成前端需要的值。⑦恢復遠程進程寄存器。⑧DETACH遠程進程。其中,④⑤兩步可以有多種方式來搜索定位。
因此,要防止內存被修改,必須對游戲內存數據進行專業高級保護。首先,可以對重要的內存數據進行加密后,存儲于內存之中,每次讀取使用時,都需要相應的秘鑰解密,提高黑客玩家解析加密后的內存數據難度,降低內存數據被篡改的風險。其次,通過限制游戲進程的被訪問權限,可以有效地防范和控制游戲內存數據被篡改,避免游戲內存中的重要數據被竊取,防止黑客通過內存信息破解游戲,保護游戲運行中的信息安全。
2 檢測游戲是否存在作弊行為的實現
通過以上原理及說明,在Android游戲中,可以把以上檢測行為用代碼方式做成一個so(share object)動態鏈接庫,生成二進制文件,加入Android游戲apk安裝包中,當游戲運行時,Android可以從應用層通過JNI調用底層的C/C++函數按既定規則來檢測游戲中是否存在作弊行為,從而達到對游戲作弊行為進行自動化檢測,進而達到對游戲apk安裝包加固的目的,以保護游戲的安全運行。
3 檢測作弊行為的具體方法
3.1 檢測apk是否在模擬器環境下運行
檢測步驟如下:?譹?訛檢測當前系統是否存在相關的庫文件,如“/system/lib/libc_malloc_debug_qemu.so”“/sys/qemu_trace”“/system/bin/qemu-props”等,存在這些文件則說明運行在模擬器環境。?譺?訛檢測默認IMSI:310260000000000。?譻?訛檢測默認ID:0000000
00000000。?譼?訛檢測默認號碼,如:“15555215554”“15555215556”“15555215558”等。?譽?訛檢測當前系統是否存在“/dev/socket/qemud”“/dev/qemu_pipe”等虛擬設備,存在這些文件則說明運行在模擬器環境。?譾?訛檢測當前系統的配置屬性,如“vbox86p”“google_
sdk”“goldfish”“sdk”“sdk_x86”等,存在這些屬性則說明運行在模擬器環境。?譿?訛檢測cpu信息,如“intel”“amd”。?讀?訛一些bluestacks的關鍵路徑的檢測,如:“/data/app/com.bluestacks.appmart1.apk”“/data/app
/com.bluestacks.BstCommandProcessor-1.apk”
“/data/app/com.bluestacks.help-1.apk”“/data/app/
com.bluestacks.home-1.apk”等。
3.2 檢測是否存在第三方加速器
檢測步驟如下:?譹?訛枚舉當前進程的模塊,檢測是否存在第三方加速器特有的so文件,存在則說明使用了第三方加速器。?譺?訛檢測系統庫libc.so的系統時間函數gettimeofday和clock_gettime是否被inline hook,如果被inline hook,則說明使用了第三方加速器。?譻?訛檢測系統庫libc.so的函數導出表的gettimeofday和clock_gettime函數地址是否被修改,如果被修改則說明使用了第三方加速器。
3.3 檢測是否存在內存修改
?譹?訛開啟反調試、反附加,檢測游戲是否被調試器附加,探知程序是否正在被調試,防止其他方試圖用反匯編之類的方法破解程序,防止第三方工具隨意讀取程序數據。?譺?訛枚舉當前進程的模塊,檢測是否存在第三方內存修改器特有的so文件,以判斷是否存在第三方內存修改器。
4 結語
擁有檢測游戲是否存在作弊行為的方法是一款游戲標準的加固內容,也是游戲成熟的表現。它類似于電腦操作系統中的殺毒軟件,像保護操作系統文件不被病毒侵害一樣,保護游戲在一個良好的環境下運行,阻擋黑客玩家和競爭對手通過不正常手段對游戲功能和游戲環境進行破壞,保障普通玩家和支付玩家在游戲中應得的商品和服務,促進游戲中的正常交易,保障了開發者的收益和消費玩家的利益,促進游戲產業的發展和游戲市場銷售份額的提高,對健康的游戲生態環境營造有著重大意義。
參 考 文 獻
[1](美)德雷克.Android安全攻防權威指南[M].北京:人民郵電出版社,2015.
[2]佚名.Unity3D[EB/OL].http://Unity3D.com,2016-12-05.
[3]佚名.Android模擬器檢測常用方法[EB/OL].http://
blog.csdn.net/sinat_33150417/article/details/51320228,2016-05-05.
[4]Felix Matenaar,Patrick Schulz.Detecting Android
Sandboxes[EB/OL].http://www.dexlabs.org/blog/btd-
etect,2012-08-10.
[5]佚名.手機游戲加速器的工作原理[EB/OL].https://
www.zhihu.com/question/22741208,2014-08-19.
[6]張躍騫.Android APP保護及破解[J].中國教育網絡,2016(Z1):44-46.
[7]豐生強.Android軟件安全與逆向分析[M].北京:人民郵電出版社,2013:78-90.
[8]杜吉志,徐明昆.Android系統內存管理研究及優化[J].軟件,2012,24(5):69-80.
[9]佚名.Android下內存修改的研究匯總[EB/OL].http://
www.cnblogs.com/xieyuan/p/3787253.html,2014-
05-21.
[責任編輯:陳澤琦]