cocos2dx小游戏数据签名算法破解

点击上方蓝字[协议分析与还原]关注我们


 快速破解小游戏常见的数据签名算法。

最近在分析各种小游戏的协议,本文以《我不是无双》这款小游戏为样例介绍这类小游戏的分析方法。

01

抓包

在分析开始,首先明确分析的目的是学习这款游戏的网络协议算法,当然,对协议的分析得从抓包开始,很容易,我们抓到了协议流量报文,像下面这样:

POST https://light-wbsws.ohayoo.cn/102 HTTP/1.1
Accept-Encoding: identity
Content-Type: application/json;charset=UTF-8
User-Agent: 协议分析与还原
Host: light-wbsws.ohayoo.cn
Connection: Keep-Alive
Content-Length: 182


{"platform":"jrtt","openId":"ProtoSec","time":1614995503,"version":3,"sig1":"555555555555555?0CQEGKL@5UEA?O1O2VVXWSNBH1BK34UWUJTO./","sig":"aaaaaaaaaabd920d9c329251d4bc4a81"}

简单分析就发现,这里面有两个值sig1和sig,是用来对数据校验的特征,那我们的目标就更明确了,是分析这两个值的生成算法。

02


解包

要分析校验值的生成算法,当然要解包了,解开apk,很容易知道这款游戏是使用cocos2d进行开发的,打开assets目录,能够看到jsc文件:

打开jsc看一眼,不是spidermonkey编译的那类,当然,lib目录下面还有libcocos2djs.so,毫无疑问,游戏的实现逻辑在jsc内,将jsc解密,得到原始的js即可找到签名算法的实现了。

03


hook分析

这类加密的jsc文件,在应用打开时会被解密成js,这个过程在libcocos2djs.so内完成,所以分析这个文件就可以找到算法了。

一般来说,大部分游戏内的jsc文件的加密方式都是xxtea,很多密钥也是在so中写死的,所以,很多时候,可以直接用工具从so中将内置字符串导出,然后找到固定位置来取密钥字符串。

这里稍微复杂点,介绍更通用的方法,就是hook了,首先,我们使用IDA打开so,很容易就找到了xxtea的解密函数位置:

打开xxtea_decrypt函数:

记下地址,顺便看下函数的伪码方便确定我们要查看的函数参数:

我们使用Frida来hook,根据函数地址及参数,写好后运行,很容易就得到了结果:

这arg2的六个字节就是xxtea密钥,使用jsc解密工具解开,就拿到了原始的js文件了:

一般这种小游戏,逻辑基本在index.js内,根据需要具体分析即可,你看,逻辑很完整:

04


算法

拿到了原始的js文件,那接下来的分析基本就没难度了,当然,有的时候也有,毕竟,代码看不懂是常事。

通过阅读代码,很容易就得到无双的两个签名的算法。

sig1是一个字符串编码(deviceid,time) ,加time得到的值。

而sig是一个包含platform、openId、version、data、clientVersion、sig1等项的md5值,并且包含salt值(获取ProtoSec),这现在基本是常规操作啦。

大家有兴趣就自己分析下,这里不详细写了。

05


结束

这类jsc加密的游戏的分析就写到这里了,这是这类游戏比较通用的分析方法,难度不是很大,有些难度大些的碰到再说了。

大家如果要解密和分析这类游戏,到这里来,肯定没错,大家多交流。

别忘点“在看”、“赞”和“分享”

新的规则,及时收推文要先给公号星标

别忘了星标一下,不然就错过了

长按进行关注,时刻进行交流。

猜你喜欢

转载自blog.csdn.net/yeyiqun/article/details/115743710
今日推荐