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

本文介绍了Cocos2dx+JavaScript游戏的打包流程,重点探讨了jsc反编译的难点,涉及到SpiderMonkey的JS_DecompileScript函数。作者通过分析源码,发现Cocos2dx在编译js为jsc时不包含源码,导致反编译困难。文章还尝试了使用SpiderMonkey的API进行反汇编,但未能实现完全的反编译功能。
摘要由CSDN通过智能技术生成

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

在新版本Cocos2dx+js的组合下,开发的游戏最终打包时,会将js编写的游戏代码编译生成jsc文件,这个经过编译并二进制优化后的脚本文件,在提升游戏运行性能的同时,也显著的提高了逆向分析的门槛。今天的主要思路是,想办法编写一款针对jsc文件的二进制反编译器。

初步分析

研究逆向先看正向,这通常是一个好的出发点。

jsc游戏打包流程

我们下载好Cocos2dx,这里选择的是cocos2d-x-3.16版本。安装配置好后,执行如下命令:

 

$ cocos new -p test_jsc_cocos2dx -l js -d ~/Documents/project/test_jsc_cocos2dx

本人使用的分析与开发平台是macOS 10.12系统,其他平台的读者可能需要调事路径参数。命令执行完成后,会生成一个JavaScript的游戏工程test_jsc_cocos2dx。效果如图所示:

test_jsc_cocos2dx

可以执行如下命令查看项目中有很多js源文件:

 

$ tree -f | egrep [.]js$ | tail -10

tree命令以树的形式显示目录层次,"-f"参数显示完整的路径;egrep工具用来正式表达式方式过滤结果,“[.]js$”表示js扩展名的文件;tail -10表示只输出结果的前10行。输出效果如图所示:

egrep_js

我这里选择macOS平台进行编译,执行如下命令:

 

$ cd MyJSGame $ cocos run -p mac

效果如图所示:

cocos2dx_js_build

当然,你也可以选择更直观的IDE方式进行编译,使用Xcode打开文件,选择js-tests Mac进行编译即可。如图所示:

cocos2dx_js_xcode

编译完成会在test_jsc_cocos2dx/MyJSGame/simulator/mac目录下生成MyJSGame-desktop.app游戏程序。并自动运行,如图所示:

cocos2dx_js_run

我们来看看生成的MyJSGame-desktop.app游戏程序里面的代码,执行如下命令:

 

$ tree -f simulator/mac/MyJSGame-desktop.app/Contents | egrep [.]js$ | tail -20 $ file simulator/mac/MyJSGame-desktop.app/Contents/Resources/script/jsb_property_apis.js

效果如图所示:

cocos2dx_js_app

你看到的没错,默认生成的游戏程序的js文件是没有加密的,需要手动生成jsc。执行cocos -h可以看到如下输出:

 

$ cocos -h ~/cocos2d-x-3.16/tools/cocos2d-console/bin/cocos.py 2.3 - cocos console: A command line tool for Cocos2d-x. Available commands: run Compiles, deploy and run project on the target. gen-libs Generate prebuilt libs of engine. The libs will be placed in 'prebuilt' folder of the engine root path. luacompile Encrypt and/or compile lua files. deploy Compile and deploy a project to a device/simulator. package Manage package for cocos. compile Compile projects to binary. gen-simulator Generate Cocos Simulator. new Creates a new project. jscompile Compile and/or compress js files. Available arguments: -h, --help Show this help information. -v, --version Show the version of this command tool. --ol ['en', 'zh', 'zh_tr'] Specify the language of output messages. --agreement ['y', 'n'] Skip the agreement with specified value. Example: cocos new --help cocos run --help

jscompile是一个有用的命令行选项,支持将js编译成jsc。执行下面的命令生成jsc:

 

$ cocos jscompile -s simulator/mac/MyJSGame-desktop.app/Contents/Resources -d simulator/mac/MyJSGame-desktop.app/Contents/Resources

效果如图所示:

cocos2dx_js_jsc

执行下面的命令查看是否生成成功:

 

$ tree -f simulator/mac/MyJSGame-desktop.app/Contents | egrep [.]jsc$ | tail -20

效果如图所示:

cocos2dx_js_egrep_jsc

很好很可以!一切都没有问题。执行如下面命令将未加密的js源文件删除:

 

$ find simulator/mac/MyJSGame-desktop.app/Contents/Resources -type f -name "*.js"| xargs rm -rf

完事以后,双击MyJSGame-desktop.app游戏程序,可以运行起来ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值