「贪吃蛇大作战」的刷分尝试
昨天同学推荐了一个最近比较火的游戏「贪吃蛇大作战」,今天已经到了 AppStore 总榜第二的位置。这两天一有空就会掏出手机玩几盘,不过无尽模式玩到 3000 分左右就遇到了瓶颈,于是怀着单纯的目的想研究下这个游戏的接口… 使用 Charles 抓取请求 既然是研究接口,第一步就是看看接口的 URL 和参数返回都是什么了,请出神器 Charles。 通过 Charles 可以清楚地看到,游戏提交分数的接口和参数,至于返回,貌似没什么用。接下来仔细研究下请求,有几个参数能比较容易的判断他们的含义和作用。 device_id: 设备ID game_mode: 1是无尽模式 2是限时模式 kill: 击杀次数 length: 蛇的长度 market: 我抓的是iOS设备发的请求,所以这里是apple platform: 抓到的请求里是1,还不太明白具体的意思 push_channel: 也是1,不明白意思 push_id: 固定值111111111222222223333333344444444,后面逆向apk也证明了这一点 sid: 每次登录都会更新 snake_sign: 签名 uid: 用户ID version: 我使用的版本是固定值2.1 通过逆向 APK 获取签名算法 明确了参数的意思,接下来就可以伪造请求了,不过在伪造请求之前,还有一个参数比较麻烦,那就是 snake_sign,请求签名,从图中 snake_sign 的内容看,似乎有点像是一个 base64 过的东西,不过 base64decode 发现,根本不可读。与其猜签名算法,不如考虑一下其他办法。 「贪吃蛇大作战」还有安卓版本,并且引导下载的页面提供了 apk,于是下载 apk,使用jadx-gui进行逆向,使用 jadx-gui 打开 apk 后,代码一览无余。 通过查看代码,可以清楚的看到 snake_sign 字段的签名逻辑,首先将请求中所有参数按 ASCII 码顺序排列拼接成字符串,然后在字符串前添加POST& + [URL Path],添加后使用 Key 进行 SHA1 加密,key 也可以在代码中获取到。对加密生成的结果,需要做一次 base64,才是最终 snake_sign 字段的结果。 ...