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加密的游戏的分析就写到这里了,这是这类游戏比较通用的分析方法,难度不是很大,有些难度大些的碰到再说了。
大家如果要解密和分析这类游戏,到这里来,肯定没错,大家多交流。
别忘点“在看”、“赞”和“分享”
新的规则,及时收推文要先给公号星标
别忘了星标一下,不然就错过了
长按进行关注,时刻进行交流。
相关文章:

laravel5 MAC is invalid
如果本机的环境更换过,项目中用来加密Crypt组件中的参数会变更. 如果出现这个问题,得更换数据库中加密后的变量 stackoverflow上找到的解决方法都是 composer dump-autoload composer clear-cache 之后再清空浏览器缓存 其实最简单的解决方法是将数据库中的所有数据重新encrpt一…

不大于N的所有素数
算法如下: #include<stdio.h> #include<math.h> void Sieve(int n) {int p,j,i;int A[n1],L[n1];for(p2;p<n;p)A[p]p;for(p2;p<sqrt(n);p){if(A[p]!0){jp*p;while(j<n){A[j]0;jjp;}}}i0;for(p2;p<n;p){if(A[p]!0){L[i]A[p];i;}}for(p0;p<…

3集合与函数类型
import UIKit var str “Hello, playground” // 1 数组 // 创建一个空的数组 var arr1 Int; arr1.append(6); // 创建一个特定大小 并且所有数据都被默认的构造方法 // 以下数组有6个5 var arr2 Array(repeating: 5, count: 6); // 通过两个数组相加创建一个数组 var a…

非凡推崇_2015年值得推崇的25位编码者
非凡推崇by freeCodeCamp通过freeCodeCamp 2015年值得推崇的25位编码者 (25 Coders Worth Following on Twitter in 2015) Our community upvoted the following 25 coders, in no particular order, as “Coders Worth Following in 2015”:我们的社区对以下25位编码员进行了…
CSS中各种各样居中方法的总结
在开发前端页面的时候,元素的居中是一个永远都绕不开的问题。看似简单的居中二字,其实蕴含着许许多多的情况,对应着很多的处理方法,本文就试图对页面布局中的居中问题进行总结~~ 居中问题分为水平居中和竖直居中两种;而…

iOS 流式播放音频文件
方式一: https://github.com/tumtumtum/StreamingKit 方式二: https://github.com/AlexanderYeah/SK_PlayOnWavFileDemo

java 创建 HMAC 签名
ava 创建 HMAC 签名 psd素材 1. []ComputopTest.java package com.javaonly.hmac.test; import java.io.IOException; import java.security.InvalidKeyException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import …

2014年数字:我的人生在命令行中
by freeCodeCamp通过freeCodeCamp 2014年数字:我的人生在命令行中 (2014 in Numbers: My Life Behind the Command Line) For 2014, I decided to simplify my life. Rather than pursuing a variety of human experiences, as I had previously, I wanted to focu…

c# unity PlayerPrefs 游戏存档,直白点就是讲游戏数据本地保存下来
在游戏会话中储存和访问游戏存档。这个是持久化数据储存,比如保存游戏记录。 我的理解是通过某个特殊的标签来保存在本地,而且该标签为key的意思,初始值不用赋值。 在游戏开发中较为实用。 暂时用到了 SetInt(string key, int value); 还有Ge…

4-类和结构体和可选类型
import UIKit var str “Hello, playground” // 1 枚举语法 // 与 C 和 Objective-C 不同,Swift 的枚举成员在被创建时不会被赋予一个默认的整型值 // 书写方式一 enum sizeType{ case small case middle case large } // 书写方式二 enum sizeNumber { case x,…

android处理url中的特殊字符
java处理url中的特殊字符(如&,%...) URL(Uniform Resoure Locator,统一资源定位器)是Internet中对资源进行统一定位和管理的标志。 一个完整的URL包括如下内容: 应用协议名称,包括http,ftp,file等标志 资源定位…

图的连通性和连通分量_英语,人口,连通性和露营地
图的连通性和连通分量by Evaristo Caraballo通过Evaristo Caraballo 英语,人口,连通性和露营地 (English, Population, Connectivity and Campsites) 在世界范围内推动使用Free Code Camp的因素 (Factors driving the use of Free Code Camp worldwide)…

jQuery源码分析系列:属性操作
属性操作 1.6.1相对1.5.x最大的改进,莫过于对属性.attr()的重写了。在1.6.1中,将.attr()一分为二: .attr()、.prop(),这是一个令人困惑的变更,也是一个破坏性的升级,会直接影响到无数的网站和项目升级到1.6…

HDU 5972 Regular Number(ShiftAnd+读入优化)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid5972 【题目大意】 给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串的长度为n,并且第i个字符需要在给定的字符集合Si中 【题解】 利用Sh…

把握机缘_机缘巧合,蒙太奇训练以及我的朋友如何使自己失业
把握机缘by Wiley Jones通过威利琼斯 机缘巧合,蒙太奇训练以及我的朋友如何使自己失业 (Serendipity, training montages, and how my friend automated himself out of a job) “No one person’s Hollywood success story has anything in common with anybody e…

Servlet(一)
BS架构的优势 1.数据库之负责数据库的管理 2.Web服务器负责业务逻辑的处理 3.浏览器提供操作界面 4.不需要单独安装客户端 5.开发相对于CS简单,客户端和服务器的通信模块都是使用标准的HTTP协议进行通信 CS架构 1.数据库作为Server,使用数据库特定的编程语言编写业务…

visual webgui theme designer
转载于:https://www.cnblogs.com/jintan/p/3804095.html

51单片机编码自学_这是9个月的自学式编码看起来像什么
51单片机编码自学by Stephen Mayeux斯蒂芬马约(Stephen Mayeux) 这是9个月的自学式编码看起来像什么 (Here’s What 9 Months of Self-Taught Coding Looks Like) 只是划伤表面 (Just Scratching the Surface) Today marks 9 months since I embarked on my journey as a self…

19.Remove Nth Node From End of List
方法1:由于链表不能随机访问,所以很自然的想法是第一遍得到链表长度,然后计算倒数第n个结点的位置,但这样时间复杂度O(n2),想到用空间换取时间,可以用一个地址数组存储每个结点的地址,然后直接删…

HTML 5中SEO可以用那些代码来做优化
头部代码 1、标题标签(title标签) 在HTML5中标题标签依然存在,其仍然具有不可替代的作用;不过我们看到还有更多的可供搜索引擎识别的代码,我们将改代码的等级微降。 2、元标签(meta标签) 字符集编码声明标签 该标签原本就是搜索引擎必看且首先要看的标签…

XCode 导入头文件不提示解决
File --> WorkSpace Settings ---> Build Sysytem ---> Legacy Build System

构建node.js基础镜像_在Android上构建Node.js应用程序
构建node.js基础镜像by Aurlien Giraud通过AurlienGiraud 在Android上构建Node.js应用程序-第1部分:Termux,Vim和Node.js (Building a Node.js application on Android - Part 1: Termux, Vim and Node.js) If you are excited about Node.js and own a…

MyEclipse设置默认的文档注释和背景色设置
转载于:https://www.cnblogs.com/999-/p/6086219.html
C语言之数组中你所不在意的重要知识
#include<stdio.h>void simpleArray();void main() {simpleArray();}//数组的简单操作 void simpleArray() {//数组的声明并赋值int c[5] { 1, 2, 3, 4, 5 };printf("\nC数组内存中占%d个字节",sizeof(c));// /0在内存中会占一个字节,可是仅仅针…

swift 4.0 创建tableview 自定义cell
// // ViewController.swift // AlamofileDemo // // Created by Alex on 2019/3/5. // Copyright © 2019 AlexanderYeah. All rights reserved. //import UIKit import Alamofire// 遵守协议方法 class ViewController: UIViewController,UITableViewDataSource,UITa…

ux体验网站 英国_?? 用户体验(UX)资源和工具的完整列表??
ux体验网站 英国by Jason Hreha杰森赫雷哈(Jason Hreha) ?? 用户体验(UX)资源和工具的完整列表?? (?? The Complete List of User Experience (UX) Resources & Tools ??) 超过100个链接,可以链接到最好的书籍,课程,新闻通讯和工…

Android 第三方图表类 MPChart 的使用
先看看条形图的的效果还不错是吧,实现这样的效果很合适呢! 还有折线图、饼图很多效果 效果不错对吧~ 下面我们就先来看看条形图的实现方法吧! 第一步: 引入第三方包 MPChart 如果你碰巧看过我之前写的Recycleview的博客这就简单多…

C++ STL的sort 函数 以及自定义的比较函数
没什么特别擅长的内容,先做个小笔记好了。在编程时,使用C的标准模板库(STL)能节约工作量,增加代码的可读性,能灵活运用无疑会提高编程的效率,俗话说:Write less, create more ~ 然后…

7-构造器方法
import UIKit// 1 构造器 // 结构体和类在实例的构造过程中会调用一种特殊的方法init,称之为构造器 // 构造器的主要作用是初始化存储属性 // 如果存储属性在构造器中没有初始化 在定义的时候也没有初始化 就会产生编译错误class Employee{let no:Int;var name:Stri…

模糊推理 控制 易于实现_代码“易于推理”是什么意思?
模糊推理 控制 易于实现by Preethi Kasireddy通过Preethi Kasireddy 代码“易于推理”是什么意思? (What does it mean when code is “easy to reason about”?) You’ve probably heard the expression “easy to reason about” enough times to make your ear…