Android逆向 Lua游戲逆向及破解方法介紹

背景介紹

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

識(shí)別Lua游戲

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

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

圖1. Lua引擎相關(guān)字符串

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

Lua手游asserts下可疑腳本信息案例手游D
Lua手游asserts下可疑腳本信息案例手游M

破解思路

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

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

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

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

針對(duì)lua源碼類型,直接修改然后apktool重打包即可。

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

二、 在luaL_loadbuffer函數(shù)處獲取

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

image.png

圖4. cocos2dx_lua_loader函數(shù)

三、 更底層的reader函數(shù)處獲取

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

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

常用工具

ida.jpg

一、 IDA工具

可以進(jìn)行動(dòng)態(tài)調(diào)試和靜態(tài)分析的工具,能在合適的位置下斷點(diǎn),修改指定寄存器和編寫IDC腳本配合分析(這里可用來dump luac文件),不多介紹。

二、 ChunkSpy

用于解析lua字節(jié)碼文件結(jié)構(gòu),方便luac的學(xué)習(xí)與閱讀。

三、 unluac

Unluac是一個(gè)lua反編譯器開源項(xiàng)目,可將luac文件反編譯為lua代碼。針對(duì)夢(mèng)幻西游、刀塔傳奇等修改了lua opcode的手游,在靜態(tài)分析確認(rèn)還原opcode后,可修改這個(gè)項(xiàng)目打包出個(gè)對(duì)應(yīng)版本的反編譯工具(直接修改OpcodeMap.java里的map,改成對(duì)應(yīng)游戲修改后的Opcode即可)。

常用邏輯修改方法

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

(2)update函數(shù)的調(diào)用邏輯修改(不update或者update多次)

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

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

實(shí)戰(zhàn)案例

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

在lua_reader函數(shù)可直接dump出游戲lua源碼,在其/zoo/gamePlay/GamePlayConfig.lua文件中配置了游戲分?jǐn)?shù)獎(jiǎng)勵(lì)等屬性,修改如圖5 所示為幾個(gè)特效額外得分即可輕松暴分。

開心消消樂分?jǐn)?shù)配置表

案例二:多次調(diào)用游戲響應(yīng)函數(shù)(刀塔傳奇快速戰(zhàn)斗)

這里給出叉叉的一個(gè)例子。叉叉針對(duì)刀塔傳奇有相應(yīng)的輔助,其中快速戰(zhàn)斗實(shí)現(xiàn)如圖6 所示:是通過HOOK了update函數(shù)(lua中函數(shù)名是指針,備份原先函數(shù)指針,直接重寫即可實(shí)現(xiàn)HOOK),在update函數(shù)尾調(diào)用10次tick實(shí)現(xiàn)。

叉叉實(shí)現(xiàn)快速戰(zhàn)斗

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

在lua_reader函數(shù)可直接dump出游戲lua源碼,如圖7 所示:MoveMode::useMove函數(shù)負(fù)責(zé)處理步數(shù)扣除,直接修改為增加10步即可實(shí)現(xiàn)步數(shù)增加功能。

開心消消樂步數(shù)修改

小結(jié)

Lua手游相對(duì)來說,還是不夠安全的。因?yàn)閘ua引擎不僅是開源的,而且相對(duì)python等腳本引擎更簡(jiǎn)單。外掛作者在lua引擎底層如魚得水。上面介紹的分析破解思路,就是沿著lua引擎加載腳本的函數(shù)鏈進(jìn)行分析,找到一個(gè)解密后的點(diǎn)dump出腳本,針對(duì)腳本進(jìn)行詳細(xì)分析,嘗試構(gòu)造攻擊點(diǎn)破解版游戲?qū)崿F(xiàn)外掛功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 14,235評(píng)論 0 38
  • 1. 寫在前面 很多時(shí)候我們都需要借助一些腳本語言來為我們實(shí)現(xiàn)一些動(dòng)態(tài)的配置,那么就會(huì)涉及到如何讓腳本語言跟原生語...
    杰嗒嗒的阿杰閱讀 3,500評(píng)論 9 31
  • collision: 碰撞; swap: 交換; source:根源 destination:目標(biāo)地; figur...
    果木山閱讀 272評(píng)論 0 0
  • 18歲,多么神圣的季節(jié)。 這生命的轉(zhuǎn)折口,我們逐漸褪去幼稚的外衣,一步步走向成熟。聽多了“你還小,還不懂事”...
    對(duì)不起借過一下閱讀 804評(píng)論 0 2
  • 悵然若失, 從未后悔。 早日開悟, 從世俗中脫凡塵。
    胡涂格格閱讀 346評(píng)論 0 0

友情鏈接更多精彩內(nèi)容