当前位置: 首页 > 编程日记 > 正文

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的所有素数

算法如下&#xff1a; #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中各种各样居中方法的总结

在开发前端页面的时候&#xff0c;元素的居中是一个永远都绕不开的问题。看似简单的居中二字&#xff0c;其实蕴含着许许多多的情况&#xff0c;对应着很多的处理方法&#xff0c;本文就试图对页面布局中的居中问题进行总结~~ 居中问题分为水平居中和竖直居中两种&#xff1b;而…

iOS 流式播放音频文件

方式一&#xff1a; https://github.com/tumtumtum/StreamingKit 方式二&#xff1a; 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年数字&#xff1a;我的人生在命令行中 (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 游戏存档,直白点就是讲游戏数据本地保存下来

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

4-类和结构体和可选类型

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

android处理url中的特殊字符

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

图的连通性和连通分量_英语,人口,连通性和露营地

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

jQuery源码分析系列:属性操作

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

HDU 5972 Regular Number(ShiftAnd+读入优化)

【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid5972 【题目大意】 给出一个字符串&#xff0c;找出其中所有的符合特定模式的子串位置&#xff0c;符合特定模式是指&#xff0c;该子串的长度为n&#xff0c;并且第i个字符需要在给定的字符集合Si中 【题解】 利用Sh…

把握机缘_机缘巧合,蒙太奇训练以及我的朋友如何使自己失业

把握机缘by Wiley Jones通过威利琼斯 机缘巧合&#xff0c;蒙太奇训练以及我的朋友如何使自己失业 (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简单&#xff0c;客户端和服务器的通信模块都是使用标准的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&#xff1a;由于链表不能随机访问&#xff0c;所以很自然的想法是第一遍得到链表长度&#xff0c;然后计算倒数第n个结点的位置&#xff0c;但这样时间复杂度O(n2)&#xff0c;想到用空间换取时间&#xff0c;可以用一个地址数组存储每个结点的地址&#xff0c;然后直接删…

HTML 5中SEO可以用那些代码来做优化

头部代码 1、标题标签(title标签) 在HTML5中标题标签依然存在&#xff0c;其仍然具有不可替代的作用;不过我们看到还有更多的可供搜索引擎识别的代码&#xff0c;我们将改代码的等级微降。 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部分&#xff1a;Termux&#xff0c;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在内存中会占一个字节&#xff0c;可是仅仅针…

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个链接&#xff0c;可以链接到最好的书籍&#xff0c;课程&#xff0c;新闻通讯和工…

Android 第三方图表类 MPChart 的使用

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

C++ STL的sort 函数 以及自定义的比较函数

没什么特别擅长的内容&#xff0c;先做个小笔记好了。在编程时&#xff0c;使用C的标准模板库&#xff08;STL&#xff09;能节约工作量&#xff0c;增加代码的可读性&#xff0c;能灵活运用无疑会提高编程的效率&#xff0c;俗话说&#xff1a;Write less, create more ~ 然后…

7-构造器方法

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

模糊推理 控制 易于实现_代码“易于推理”是什么意思?

模糊推理 控制 易于实现by Preethi Kasireddy通过Preethi Kasireddy 代码“易于推理”是什么意思&#xff1f; (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…