cocos creator 下的jsc
cocos creator 编译之后的所生成的jsc文件,虽然后缀是jsc,但其实和js虚拟机所执行的字节码(jsc)是二个不同的东西,只是使用xxtea对js文件进行加密而已。xxtea是可逆的,所以cocos creator下的jsc是完全可逆的,因为本质上是一个加解密过程。
当然creator在构建之后形成的js文件本身已经有过一些混淆&压缩,所以jsc还原成js看到的也不是开发时候的源文件了。
一、如何解码文件
涉及到解码文件,我比较常用的方法分为静态分析、动态调试。
1.1、静态分析
静态分析就是利用一些工具(我一般用IDA、nodepad++、Hworks、ILspy),查看被编译之后的加密算法/解码算法。如果是一些三方的加密算法,网上应该能找到很多现成的逆向实现;如果是项目自有实现的加密,就得自己写一个逆向实现了。
1.2、动态调试
动态调试我一般用IDA(具体的动态调试过程以后再单独写一篇),直接在解码之后的位置输出明文即可。当然也先进行静态分析,查找到解码的位置。
动态调试的好处就是不需要关心算法。有些时候自有实现的算法代码量大或看不懂别人算法的时候,用动态调试就很省力。
二、准备工作
了解了cocos creator 的jsc的本质之后,逆向就变得很简单,就是xxtea的解码。那么xxtea如何解码呢,对xxtea算法有所了解的或使用xxtea算法加密过文件的(cocos2d的lua加密也是用的这算法)应该都知道,在加密时候会设置一个key值,解码就是利用这个key值去反着运行一次加密过程。所以逆向之前我们需要准备2样东西,一是加密时所设置的key值;二是xxtea算法的实现:
- 加密时所设置的key值;
- xxtea加密算法的逆向实现;
2.1、如何查询xxtea的key
基于前文1.1、1.2中提到2种分析方式都可以进行key的查找。
不过creator的jsc文件中的key我一般直接用HWorks直接打开查看。
利用HWorks打开libcocos2djs.so文件,查询jsb-adapter/jsb-builtin.js字符串即可,在jsb-adapter/jsb-builtin.js之前的16字节长度的字符串就是key了。
2.2、xxtea的解码实现
这一块网上已经各种语言版本的实现了,用的较多的应该是python版本的。不过我用的是c++,好处就是我是直接编译的引擎自带的xxtea文件,所以保证算法实现一定没问题,也省去了算法理解和编程过程。将引擎自带的xxtea编译成dll文件,可以给其他程序直接调用。
使用vstudio的,可以基于cocos工程直接去调用xxtea解码。不过现在cocos creator 用vscode的较多,所以这里在编译cpp文件的时候,会有一个vscode下配置cpp环境和编译成dll,这一点单独会在写一篇vscode下的c++开发环境配置&dll动态库生成。
最后
这里主要是分析一个crator的jsc文件的本质以及逆向的思路。具体的实现其实也不难,加上网上已经很多的现成案例,这里就不展开了(主要难得打字和组织语言)。有什么问题欢迎交流,整个逆向的工程,放在github上了,工程是基于c++的,运行源码的话需要编译环境,可查看另一篇关于vscode配置c++开发环境的笔记。