cocos2d游戲lua解密分析

很長(zhǎng)一段時(shí)間沒有寫解密分析了,最近遇到的cocos2d解密比較多,于是就選了一個(gè)比較典型的來分析一下。
cocos2d游戲中l(wèi)ua是經(jīng)常需要解密的,最常見的加密手段就是使用xxtea。常規(guī)的xxtea使用128bit作為密鑰進(jìn)行加密,并且在cocos2d中還附加了顯著的標(biāo)記sign作為記號(hào)。加密的文件頭部x個(gè)字節(jié)通常就是sign。解密的關(guān)鍵通常就是找到128bit的key。
其實(shí)一般來說,在ida分析中,sign和key都會(huì)被經(jīng)過各種手段加密混淆。還有的人也會(huì)對(duì)xxtea本身下手進(jìn)行魔改。不過大差不大,基本上不會(huì)出現(xiàn)太麻煩的加密混淆。

本次需要解密的是一款問x手游,lua文件的特征非常明顯,并且是xxtea加密。
將游戲的so拖入ida中分析,在經(jīng)過漫長(zhǎng)的等待后,搜索導(dǎo)出表關(guān)鍵詞xxtea。

首先先跟蹤一下xxtea_decrypt這個(gè)函數(shù),看看函數(shù)的交叉引用,



經(jīng)過跳轉(zhuǎn)找到xxtea_decrypt_ex這個(gè)函數(shù),顯然這是一個(gè)后期封裝的函數(shù)。
根據(jù)xxtea_decrypt的函數(shù)簽名對(duì)參數(shù)名進(jìn)行修改,
然后向上查看代碼。


根據(jù)key這個(gè)參數(shù)向上尋找最終定位到,發(fā)現(xiàn)data值來自于tree_data的索引結(jié)果,在向上可以看到,tree_data在函數(shù)開始從全局接受值。所以我們的目標(biāo)已經(jīng)明確,就是要找到tree_data這個(gè)全局變量,在哪里被賦值。

可以看到交叉引用還是挺多的,不過我們既然是在找xxtea的key那么基本上可以先從xxtea_set_sign_key這個(gè)函數(shù)入手




通過多次跳轉(zhuǎn)后找到一個(gè)非??梢傻暮瘮?shù),
可以看到這一塊多次調(diào)用xxtea_set_sign_key,并且參數(shù)都是hex值,經(jīng)驗(yàn)來講這一塊基本上就是sign和key的初始化位置。
而xxtea_set_sign_key這個(gè)函數(shù)就是解密的關(guān)鍵入口,回過來在分析xxtea_set_sign_key函數(shù)。

前面看到的兩個(gè)字符串參數(shù),在函數(shù)開始就被調(diào)用(后期分析后將該處函數(shù)名修改成decode便于理解),大概猜測(cè)是將hex值轉(zhuǎn)為字節(jié)數(shù)組當(dāng)然其中應(yīng)該是有解密過程的(在前期分析時(shí)已經(jīng)通過腳本將所有字符串轉(zhuǎn)為字節(jié)數(shù)組,發(fā)現(xiàn)都是無法理解的字符,并且迭代遍歷所有可能的key,無法解密出文件,說明這些字節(jié)還經(jīng)過加密)。
于是從尋找key,轉(zhuǎn)變?yōu)閷ふ襨ey的解密函數(shù)。


進(jìn)入decode函數(shù),經(jīng)過一系列分析,中間一塊代碼就是常規(guī)的hex轉(zhuǎn)byte,真正的解密區(qū)域再下面,可以看出key是經(jīng)過des加密的。
于是我用des的密鑰,寫了個(gè)腳本去解析這些字符,發(fā)現(xiàn)解出來仍是亂碼,可見des的密鑰(des_key)也是經(jīng)過加密的。可見開發(fā)者是多么喪心病狂,瘋狂套娃。
于是要先分析makekey這個(gè)函數(shù),因?yàn)閐eskey經(jīng)過分析就是常規(guī)的des子密鑰生成函數(shù),所以makekey就是解密的關(guān)鍵。




函數(shù)里面也沒什么好分析的,從start位置開始就是解密的關(guān)鍵部分,
key_r和key_l是兩個(gè)des的密鑰,生成了兩串dessubkey,然后在最下面對(duì)輸入的key進(jìn)行解密
是典型的des3流程,只是在des3的中間有一個(gè)小插曲,就是函數(shù)傳入的key逐字節(jié)與key_l進(jìn)行xor。結(jié)果通過指針傳出。
于是到此,所有的關(guān)鍵函數(shù)都差不多分析完了。
整個(gè)流程就是
xxtea_set_sign_key 設(shè)置sign和key,
sign和key為des3加密所得,加密密鑰寫死在函數(shù)內(nèi)部。
當(dāng)然再回過來看,xxtea_set_sign_key會(huì)發(fā)現(xiàn)還有第三個(gè)int類型的參數(shù),
如果分析過xxtea源碼的話一看這些數(shù)字就會(huì)知道,基本上都接近delta。
所以根據(jù)經(jīng)驗(yàn)判斷,這個(gè)游戲的開發(fā)者不僅對(duì)key,sign進(jìn)行加密,還對(duì)xxtea本身動(dòng)了手腳,不過手段一般,可能會(huì)難道一些小白。