对于经常做游戏安全逆向的读者来说,可能会经常遇到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。效果如图所示:
可以执行如下命令查看项目中有很多js源文件:
$ tree -f | egrep [.]js$ | tail -10
tree
命令以树的形式显示目录层次,"-f"参数显示完整的路径;egrep
工具用来正式表达式方式过滤结果,“[.]js$”表示js扩展名的文件;tail -10
表示只输出结果的前10行。输出效果如图所示:
我这里选择macOS平台进行编译,执行如下命令:
$ cd MyJSGame $ cocos run -p mac
效果如图所示:
当然,你也可以选择更直观的IDE方式进行编译,使用Xcode打开文件,选择js-tests Mac进行编译即可。如图所示:
编译完成会在test_jsc_cocos2dx/MyJSGame/simulator/mac目录下生成MyJSGame-desktop.app游戏程序。并自动运行,如图所示:
我们来看看生成的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
效果如图所示:
你看到的没错,默认生成的游戏程序的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
效果如图所示:
执行下面的命令查看是否生成成功:
$ tree -f simulator/mac/MyJSGame-desktop.app/Contents | egrep [.]jsc$ | tail -20
效果如图所示:
很好很可以!一切都没有问题。执行如下面命令将未加密的js源文件删除:
$ find simulator/mac/MyJSGame-desktop.app/Contents/Resources -type f -name "*.js"| xargs rm -rf
完事以后,双击MyJSGame-desktop.app游戏程序,可以运行起来ÿ