cocos2d游戏lua解密分析

很长一段时间没有写解密分析了,最近遇到的cocos2d解密比较多,于是就选了一个比较典型的来分析一下。
cocos2d游戏中lua是经常需要解密的,最常见的加密手段就是使用xxtea。常规的xxtea使用128bit作为密钥进行加密,并且在cocos2d中还附加了显著的标记sign作为记号。加密的文件头部x个字节通常就是sign。解密的关键通常就是找到128bit的key。
其实一般来说,在ida分析中,sign和key都会被经过各种手段加密混淆。还有的人也会对xxtea本身下手进行魔改。不过大差不大,基本上不会出现太麻烦的加密混淆。

本次需要解密的是一款问x手游,lua文件的特征非常明显,并且是xxtea加密。
将游戏的so拖入ida中分析,在经过漫长的等待后,搜索导出表关键词xxtea。

首先先跟踪一下xxtea_decrypt这个函数,看看函数的交叉引用,



经过跳转找到xxtea_decrypt_ex这个函数,显然这是一个后期封装的函数。
根据xxtea_decrypt的函数签名对参数名进行修改,
然后向上查看代码。


根据key这个参数向上寻找最终定位到,发现data值来自于tree_data的索引结果,在向上可以看到,tree_data在函数开始从全局接受值。所以我们的目标已经明确,就是要找到tree_data这个全局变量,在哪里被赋值。

可以看到交叉引用还是挺多的,不过我们既然是在找xxtea的key那么基本上可以先从xxtea_set_sign_key这个函数入手




通过多次跳转后找到一个非常可疑的函数,
可以看到这一块多次调用xxtea_set_sign_key,并且参数都是hex值,经验来讲这一块基本上就是sign和key的初始化位置。
而xxtea_set_sign_key这个函数就是解密的关键入口,回过来在分析xxtea_set_sign_key函数。

前面看到的两个字符串参数,在函数开始就被调用(后期分析后将该处函数名修改成decode便于理解),大概猜测是将hex值转为字节数组当然其中应该是有解密过程的(在前期分析时已经通过脚本将所有字符串转为字节数组,发现都是无法理解的字符,并且迭代遍历所有可能的key,无法解密出文件,说明这些字节还经过加密)。
于是从寻找key,转变为寻找key的解密函数。


进入decode函数,经过一系列分析,中间一块代码就是常规的hex转byte,真正的解密区域再下面,可以看出key是经过des加密的。
于是我用des的密钥,写了个脚本去解析这些字符,发现解出来仍是乱码,可见des的密钥(des_key)也是经过加密的。可见开发者是多么丧心病狂,疯狂套娃。
于是要先分析makekey这个函数,因为deskey经过分析就是常规的des子密钥生成函数,所以makekey就是解密的关键。




函数里面也没什么好分析的,从start位置开始就是解密的关键部分,
key_r和key_l是两个des的密钥,生成了两串dessubkey,然后在最下面对输入的key进行解密
是典型的des3流程,只是在des3的中间有一个小插曲,就是函数传入的key逐字节与key_l进行xor。结果通过指针传出。
于是到此,所有的关键函数都差不多分析完了。
整个流程就是
xxtea_set_sign_key 设置sign和key,
sign和key为des3加密所得,加密密钥写死在函数内部。
当然再回过来看,xxtea_set_sign_key会发现还有第三个int类型的参数,
如果分析过xxtea源码的话一看这些数字就会知道,基本上都接近delta。
所以根据经验判断,这个游戏的开发者不仅对key,sign进行加密,还对xxtea本身动了手脚,不过手段一般,可能会难道一些小白。