android cocoscreator jsc js 间加解密(六)

article/2025/10/3 14:41:55

前言

前面 学了 aandroid cocoscreator 热更新 超详细篇(五)
这章 主要学习 cocoscreator 构建后 jsc 与js 文件 之间相互转化(加解密)并实际测试.
可以配置cocoscreator热更新使用
1: 准备
win7 64位
cocoscreator2.0.10 (新版本如 2.4.7应该也是可以的)

2:创建个cocoscreator helloworld工程,并构建

在这里插入图片描述
构建完后 在 build\jsb-link\src (这里选择是link 模板) 有3个jsc文件,在build\jsb-link\js backups (useful for debugging) 有这3个的未加密的原文件
在这里插入图片描述
在这里插入图片描述
这里主要用到 xxtea加解密算法 压缩用的是gzip,下图是引用了别人的
这张图是引用别人的地址如下 https://www.jianshu.com/p/4272e0805da3
这里自己用go写了小工具
主要代码如下

//eh create
package mainimport ("bytes""compress/gzip""github.com/xxtea/xxtea-go/xxtea""io""io/ioutil""log""os""path""path/filepath""strconv"
)func main() {var strkey stringvar deensign uint8 //-s 1bit  0 解密 1 加密   2bit 0 无解压或加压  1 需要解压或压缩var filename stringvar outputpath string  //简化到了,直接输出到当前目录//decodeencodejsc -fif len(os.Args)&1 != 1 {log.Printf("eg:decode  decodeencodejsc -s 0  -k 123456 -f 1.jsc " +"encode  decodeencodejsc -s 1  -k 123456 -f 1.js ")return}for i := 1; i < len(os.Args); i += 2 {switch os.Args[i] {case "-s":if tflag, ef := strconv.Atoi(os.Args[i+1]); ef == nil {deensign = uint8(tflag)if deensign > 3 {log.Printf("-s params(1bit  0 解密 1 加密   2bit 0 无解压或加压  1 需要解压或压缩) ")}deensign &= 3} else {log.Printf("-s params is error!")return}case "-k":strkey = os.Args[i+1]case "-f":filename = os.Args[i+1]case "-p"://这个参数暂时没用到outputpath = os.Args[i+1]println("%v", outputpath)default:log.Printf("params is error")return}}//strkey = "dc6c9a10-42bb-4f"//decode unzip
//	filename = "tmp/settings.jsc"//filename = "zip/settings.jsc"
//	deensign = 2//encode zip//filename = "enzip/settings.js"//deensign = 3//jsc 352 byte  js 453 byteif len(filename) < 4 || len(strkey) < 4 { //|| len(outputpath) < 1log.Printf("check params is error!")return}cfgpath, _ := filepath.Abs(filepath.Dir(os.Args[0]))absolutepathname := path.Join(cfgpath, filename)cfg, err := os.Open(absolutepathname)if err != nil {log.Printf("can't find ", filename)return}data, err := ioutil.ReadAll(cfg)if err != nil {cfg.Close()return}cfg.Close()if deensign&1 == 0 { //decode 解密//*.jsctarfile := absolutepathname[:len(absolutepathname)-4]decodedata := xxtea.Decrypt(data, []byte(strkey))if deensign&2 > 0 { //解压if nlen, tdata := fungzip(decodedata); nlen > 0 {decodedata = make([]byte, nlen)copy(decodedata, tdata)} else {log.Printf("fungzip fail %v", absolutepathname)return}}writefile(tarfile+".js", decodedata)} else { //encode 加密//*.jstarfile := absolutepathname[:len(absolutepathname)-3]decodedata := dataif deensign&2 > 0 { //加压if nlen, tdata := fgzip(data); nlen > 0 {decodedata = make([]byte, nlen)copy(decodedata, tdata)} else {log.Printf("fgzip fail %v", absolutepathname)return}}decodedata = xxtea.Encrypt(decodedata, []byte(strkey))writefile(tarfile+".jsc", decodedata)}
}func checkFileIsExist(filename string) bool {var exist = trueif _, err := os.Stat(filename); os.IsNotExist(err) {exist = false}return exist
}//31 139 8        //0-2
// 0 0 0 0 0 0      (6个0) //3-8
//10 141 144 75 111  (9-13)
//194 48 16 132 255 139  (14-19)
func fungzip(data []byte) (int32, []byte) {b := new(bytes.Buffer)// Test NewReader.in := bytes.NewReader(data)r2, err := gzip.NewReader(in)if err != nil {log.Printf("ungzip error=%v", err)return 0, []byte{}}defer r2.Close()b.Reset()//n, err := io.Copy(b, r2)n, err := io.Copy(b, r2)if err != nil {//t.Errorf("%s: io.Copy: %v want %v", tt.desc, err, tt.err)log.Printf("ungzip error=%v", err)return 0, []byte{}}return int32(n), b.Bytes()
}//func fgzip(data []byte, filename string) (int32, []byte) {
func fgzip(data []byte) (int32, []byte) {//buf := new(bytes.Buffer)w := gzip.NewWriter(buf)n0 := buf.Len()if n0 != 0 {//t.Fatalf("buffer size = %d before writes; want 0", n0)log.Printf("fgzip buffer size = %d before writes; want 0", n0)defer w.Close()return 0, []byte{}}w1, e1 := w.Write(data)if e1 != nil {log.Printf("fgzip buffer size = %d before writes; want %v", w1, n0)defer w.Close()return 0, []byte{}}//	log.Printf("write date len=%v", w1)n1 := buf.Len()if err := w.Flush(); err != nil {log.Printf("fgzip err=%v", err.Error())defer w.Close()return 0, []byte{}}n2 := buf.Len()if n2 == n1 {log.Printf("no data after first flush")defer w.Close()return 0, []byte{}}w.Close()n3 := buf.Len()//	log.Printf("write date len=%v", n3)return int32(n3), buf.Bytes()//
}func writefile(filename string, filedata []byte) bool {if f, e := os.Create(filename); e == nil {f.Write(filedata)f.Close()return true}return false
}

假如编译的执行文件叫 decodeencodejsc

1:解密
执行文件跟jsc 文件放同目录下
1> 不需要解压
decodeencodejsc -s 0 -k 密钥 -f 1.jsc
2> 需要解压
decodeencodejsc -s 2 -k 密钥 -f 1.jsc
同目录下生成1.js

2:加密
执行文件跟js 文件放同目录下
1> 不需要压缩
decodeencodejsc -s 1 -k 密钥 -f 1.js
2> 需要压缩
decodeencodejsc -s 3 -k 密钥 -f 1.js
同目录下生成1.jsc

3:测试
1:把cocoscreator生成jsc解密
在这里插入图片描述
执行后得到,结果是OK的
在这里插入图片描述
2:把js 加密
在这里插入图片描述怎么测试呢,把生成jsc文件替换掉 build\jsb-link\src 的,再打包成apk 运行就知道了

4:查看引擎的xxtea zip 代码
万一XXTEA zip 版本跟引擎的不一致呢,会不会出错
这里告诉大家引擎版本的的原文件位置(构建后,以android为例用as打开)
在这里插入图片描述
如需工程代码后续在上传,执行文件下载地址(x86_64架构下 windows7 centos7 执行文件)
https://download.csdn.net/download/yunteng521/74707369

重复下 使用说明
假如执行文件叫 decodeencodejsc
1:解密
执行文件跟jsc 文件放同目录下
1> 不需要解压
decodeencodejsc -s 0 -k 密钥 -f 1.jsc
2> 需要解压
decodeencodejsc -s 2 -k 密钥 -f 1.jsc
同目录下生成1.js

2:加密
执行文件跟js 文件放同目录下
1> 不需要压缩
decodeencodejsc -s 1 -k 密钥 -f 1.js
2> 需要压缩
decodeencodejsc -s 3 -k 密钥 -f 1.js
同目录下生成1.jsc


http://chatgpt.dhexx.cn/article/qr9OfrM7.shtml

相关文章

jsc反编译以及二进制修改

参考&#xff1a;https://www.52pojie.cn/thread-814217-1-1.html 最近碰到jsc的游戏&#xff0c;游戏中有跳过功能但有限制&#xff0c;想着对游戏进行修改达到无条件跳过。 首先&#xff0c;反编译jsc文件&#xff0c;使用这个工具https://github.com/irelance/jsc-decompile…

jsc反编译工具编写探索之路

对于经常做游戏安全逆向的读者来说&#xff0c;可能会经常遇到Cocos2dx编写的游戏。这个国产开源的游戏开发引擎支持多种编程语言进行游戏开发&#xff1a;发括主流的C/C/JavaScript/Lua&#xff0c;之前&#xff0c;与大家讨论的Lua软件安全系列的文章&#xff0c;讨论的是采用…

vue.jsc初体验

Vue 1.安装脚手架 (1)npm install -g vue-cli (2)Vue -v //查看是否安装成功 (3)Vue init webpack name(名称) (4)Npm install (5) (6)Npm install (7)Npm run dev 2.用vue构建项目笔记3(引入jquery和bootstrap) 其实用了vue以后&#xff0c;并不建议再去用jquery. vue是视图…

jsc转js工具使用方法

近日难得手闲写了这个小工具&#xff0c;发上来让大家参考参考。之前没有写详细使用说明&#xff0c;这里补一下 进到工具的文件夹下&#xff0c;直接执行exe可以看到要什么参数 这个新弹出的窗口可以直接关闭&#xff0c;这个只是让你看它需要什么参数的 2.所以如果你要解密…

Day07Spark多语言开发

Spark多语言开发 学习目标 1.掌握使用Java语言开发Spark程序 2.了解线性回归算法案例 3.了解使用Python语言开发Spark程序 4.了解决策树分类算法案例 1. JavaSpark 1.1 编程语言说明 Spark 在诞生之初就提供了多种编程语言接口&#xff1a;Scala、Java、Python 和 SQL&#x…

cocos creator jsc 逆向解码为js

cocos creator 下的jsc cocos creator 编译之后的所生成的jsc文件&#xff0c;虽然后缀是jsc,但其实和js虚拟机所执行的字节码(jsc)是二个不同的东西&#xff0c;只是使用xxtea对js文件进行加密而已。xxtea是可逆的&#xff0c;所以cocos creator下的jsc是完全可逆的&#xff…

Cocos2dx-js 资源.jsc和.pkm反编译

.jsc 解密 1. 找到apk里面的libcocos2djs.so. 用编辑器utf-b模式打开 2. 搜索Cocos Game 紧接着的 220404db-d3df-4b 就是密码 3. 使用工具decrypt.exe 即可解密 下载地址:https://download.csdn.net/download/liutietuo/86511410 cocos creator script decrypt version 1.0…

jsc 解码窥探

先使用 JS_DecodeScript反编译jsc 得到AST树 AST树词法解析 http://esprima.org/ AST还原成源码&#xff1a; npm install escodegen AST树遍历&#xff1a;npm install estraverse https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals/Byte…

cocos2d-js中jsc逆向为js

1.mac系统 2.安装php7以上的版本 ubuntu $ sudo apt install php7.0 mac $ brew install php7.0 windows just google an binary one 查看php安装的版本这里mac电脑为例子: 输入:php -v 只要7以上的版本即可 3.cd到自己的项目位置 cd path/to/project 安装composer,…

如何设置input默认值

之前聊过input最大字数限制&#xff0c;今天看下如何设置输入框默认值 placeholder属性 如下&#xff1a; <input type"text" maxlength"11" placeholder"名字"/> 输入框展示效果如下&#xff1a;

input标签点击移除默认值

使用onfocus事件检查当前输入框内的值,如果是默认得值,就将value属性置空. <input type"text" value"请输入内容" onfocus"javascript:if(this.value请输入内容)this.value;"> 操作之前: 操作之后:

Python input输入超时选择默认值自动跳过

Python input输入超时选择默认值自动跳过 Python input 等待键盘输入&#xff0c;超时选择默认值&#xff0c;释放input&#xff0c;之后重新进入等待键盘输入状态&#xff0c;直到用户输入可用数据。 一、调用 func_timeout 模块实现超时控制 1、安装 func_timeout 库 pip…

html文本框设置默认值,HTML input文本框设置和移除默认值

这里想实现的效果是&#xff1a;设置和移除文本框默认值&#xff0c;如下图鼠标放到文本框中的时候&#xff0c;灰字消失。 1.可以用简单的方式&#xff0c;就是给input文本框加上onfocus属性&#xff0c;如下代码&#xff1a; οnfοcusif(this.value"请输入关键字进行搜…

使用js代码修改input的默认值

内容&#xff1a;使用js代码来对input设置的默认值进行修改&#xff0c;点击按钮修改input的默认值 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><scrip…

html设置input默认值,使用jQuery给input标签设置默认值

由于项目需求&#xff0c;简单地写了一个input默认值设置&#xff0c;实现给.form中所有的input设置默认值的方法。input默认值设置 $(function() { //集体调用 $(".form input").each(function(){ $(this).setDefauleValue(); }); //单个调用 $("#key").s…

antd 给input设置值_Antd 中 Input 组件默认值的显示

1、input标签中有placeholder可以显示默认值 但是有少量样式的问题(字体颜色会淡一点) placeholder属性 2、用Input组件中的defaultValue属性 defaultValue属性 3、form表单组件中的initialValue参数 注意&#xff1a;当Form组件和Input组件一起用时&#xff0c;defaultValue在…

Ant Design React中 Form.Item 中设置Select,Input.TextArea,Input默认值

<Formref{this.formRef}name"dynamic_rule"initialValues{{ one: 0, two: 0, three: "0", desc:"尝试一下" }}></Form>在Form 使用initialValues{{ name:"value" }}>

踩坑 antd Form表单获取input默认值失败,Form表单校验input 必填 默认值为undefined

问题描述&#xff1a;1&#xff0c;跳转页面后&#xff0c;通过url传参&#xff0c;将参数自动回填到下一个页面的input输入框里&#xff0c;打开页面后&#xff0c;input成功显示回写内容。2&#xff0c;为FormItem添加必填校验required:true。3&#xff0c;提交表单&#xff…

js压缩混淆加密工具,解密工具

js压缩混淆加密有什么不同 压缩 compress&#xff1a; 去掉空格&#xff0c;换行&#xff0c;注释等&#xff0c;格式紧凑&#xff0c;节约存储空间。 混淆 obfuscate/garble&#xff1a;替换变量名或方法名&#xff0c;让js不容易看懂。也做到了压缩的效果。 加密 encrypt&…

对JS文件中每个函数单独混淆加密

自动化脚本&#xff1a;单独对JS代码中的每个函数进行混淆加密 用自动化脚本工具&#xff0c;对JS代码中的每个函数分别进行单独混淆加密。这样加密得到的JS代码&#xff0c;比直接对整个JS代码进行混淆加密&#xff0c;效果要好很多。所谓“好”体现在&#xff1a;加密结果安…