1. 程式人生 > >Lua遊戲逆向及破解方法介紹

Lua遊戲逆向及破解方法介紹

初始 成對 參數 很多 技術 邏輯 重寫 源碼 sem

Lua遊戲逆向及破解方法介紹

背景介紹

隨著手遊的發展,越來越多的Cocos-lua端遊開發者轉移到手遊平臺。Lua腳本編寫邏輯的手遊也是越來越多,如夢幻西遊、刀塔傳奇、開心消消樂、遊龍英雄、奇跡暖暖、疾風獵人、萬萬沒想到等手遊。隨著Lua手遊的增加,其安全性更值得關註,在此歸納一些常用的分析方法,同時介紹一些輔助工具。

識別Lua遊戲

Android平臺的apk包可以直接解壓,找到./lib目錄下的so邏輯模塊,一個個分析其so,尋找是否內嵌lua引擎(一般情況下,最大的so最有可能內嵌lua引擎)。如果有libcocos2dlua、libhellolua字樣,其內嵌lua引擎的可能性極大。

將可疑so拖入IDA,查看lua引擎字符串,找到如圖1所示的lua引擎內字符串,那該手遊基本就可以確定是內嵌了一個lua引擎,有極大可能是用lua編寫遊戲邏輯。

技術分享圖片

圖1. Lua引擎相關字符串

也可以配合留意下解壓出來的assets目錄下,是否包含腳本信息。這類信息一般是加密的(也有很多安全意識薄弱的是直接lua腳本明文存放的),但有個明顯特征是:有多個文件存放。如圖2和圖3所示,分別是兩款非常火熱的Lua手遊的assets目錄下的lua腳本信息。其中D手遊僅是對luac進行加密,而M手遊則是連名字也弄個哈希加密。

技術分享圖片

2. Lua手遊asserts下可疑腳本信息案例手遊D

技術分享圖片

3. Lua手遊asserts下可疑腳本信息案例手遊M

破解思路

Lua手遊的破解主要分成兩步,一步是能獲取遊戲lua腳本;第二步是替換lua腳本。核心是找到lua腳本,然後修改生效。不同安全級別的手遊,相應的lua腳本獲取時機點會有所不同。(本質是沿著Lua引擎加載lua腳本的整條加載鏈,如圖4所示,去不斷分析找到合適時機點dump和替換。)

另一類思路,是輔助工具常用的方法,比如叉叉的lua手遊輔助。只需要獲取遊戲lua腳本信息,然後無需替換,而是直接加載自身的一個lua腳本(該腳本和遊戲腳本在同一個命名空間,可直接修改遊戲腳本數據,調用函數)。

一、 直接assets資源可獲取lua腳本

這類比較初級,在assets目錄下可獲得lua或者luac源碼。

針對lua源碼類型,直接修改然後apktool重打包即可。

針對luac源碼類型(luac是lua編譯的lua字節碼文件,包含lua腳本所有信息,具體可搜索lua字節碼文件結構),可以使用unluac等開源項目/工具反編譯回lua源碼。然後修改直接替換回修改後的lua源碼文件即可(lua引擎加載腳本的時候,會識別luac magic number判斷是lua源碼還是luac,直接替換源碼下去是不會影響腳本加載執行的)。

二、 在luaL_loadbuffer函數處獲取

luaL_loadbuffer是一個走得比較頻繁的加載點。Cocos引擎的lua加載器為cocos2dx_lua_loader,如圖4所示,最終都是調用luaL_loadbuffer函數來加載。一般廠商會在這層上面對lua腳本進行解密,既是在luaL_loadbuffer函數獲取buff參數可得到解密後的lua腳本。修改邏輯後可以直接在這個點替換回去。

技術分享圖片

4. cocos2dx_lua_loader函數

三、 更底層的reader函數處獲取

lua引擎加載lua腳本最底層是到lua_reader函數。該函數負責最底層的腳本buff遍歷,因此在此處dump出來的lua腳本是最純正的lua腳本,所有加密都已經被去除(修改lua opcode或者引擎邏輯除外)。

不過這個點的獲取不到足夠的文件信息(文件名、buff index等),需要配合上層函數拼湊lua腳本。

常用工具

技術分享圖片

一、 IDA工具

可以進行動態調試和靜態分析的工具,能在合適的位置下斷點,修改指定寄存器和編寫IDC腳本配合分析(這裏可用來dump luac文件),不多介紹。

二、 ChunkSpy

用於解析lua字節碼文件結構,方便luac的學習與閱讀。

技術分享圖片

三、 unluac

Unluac是一個lua反編譯器開源項目,可將luac文件反編譯為lua代碼。針對夢幻西遊、刀塔傳奇等修改了lua opcode的手遊,在靜態分析確認還原opcode後,可修改這個項目打包出個對應版本的反編譯工具(直接修改OpcodeMap.java裏的map,改成對應遊戲修改後的Opcode即可)。

常用邏輯修改方法

1)修改全局變量(全局配置之類的)

2update函數的調用邏輯修改(不update或者update多次)

3)敵人類、主角類、武器類、技能的初始化過程,屬性修改

4)一些過程處理函數的邏輯修改(如傷害計算、命中部位判定等)

實戰案例

案例一:修改全局變量(開心消消樂暴分)

在lua_reader函數可直接dump出遊戲lua源碼,在其/zoo/gamePlay/GamePlayConfig.lua文件中配置了遊戲分數獎勵等屬性,修改如圖5 所示為幾個特效額外得分即可輕松暴分。

技術分享圖片

5. 開心消消樂分數配置表

案例二:多次調用遊戲響應函數(刀塔傳奇快速戰鬥)

這裏給出叉叉的一個例子。叉叉針對刀塔傳奇有相應的輔助,其中快速戰鬥實現如圖6 所示:是通過HOOK了update函數(lua中函數名是指針,備份原先函數指針,直接重寫即可實現HOOK),在update函數尾調用10次tick實現。

技術分享圖片

6. 叉叉實現快速戰鬥

案例三:修改函數內部邏輯(開心消消樂增加步數)

在lua_reader函數可直接dump出遊戲lua源碼,如圖7 所示:MoveMode::useMove函數負責處理步數扣除,直接修改為增加10步即可實現步數增加功能。

技術分享圖片

7. 開心消消樂步數修改

小結

Lua手遊相對來說,還是不夠安全的。因為lua引擎不僅是開源的,而且相對python等腳本引擎更簡單。外掛作者在lua引擎底層如魚得水。上面介紹的分析破解思路,就是沿著lua引擎加載腳本的函數鏈進行分析,找到一個解密後的點dump出腳本,針對腳本進行詳細分析,嘗試構造攻擊點破解版遊戲實現外掛功能。

Lua遊戲逆向及破解方法介紹