欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

cocos2d游戏jsc文件格式解密,SpideMonkey大冒险

程序员文章站 2022-06-22 10:38:53
“ 介绍cocos2d游戏中常用的jsc格式文件的解密。” 01 — 在破解游戏应用中,经常会碰到后缀为jsc的文件,这是基于cocos2d开发的游戏的加密代码,本质上是js文件,只是被加密了。 例如之前分析的网络赌博应用奥迪棋牌和它的兄弟途游斗地主,都是cocos2d游戏,其游戏代码主体就是使用j ......

 介绍cocos2d游戏中常用的jsc格式文件的解密。

 

01

 

在破解游戏应用中,经常会碰到后缀为jsc的文件,这是基于cocos2d开发的游戏的加密代码,本质上是js文件,只是被加密了。

 

例如之前分析的网络赌博应用奥迪棋牌和它的兄弟途游斗地主,都是cocos2d游戏,其游戏代码主体就是使用js写的,然后加密成jsc格式。

 

如果想对这两款应用的加密及破解进行了解,可参考之前的文章:

途游斗地主加密协议分析及破解

博彩应用奥迪棋牌协议破解分析与揭秘

 

如果想了解一个jsc游戏的逻辑,就需要将它解密,但是,这个jsc加密,网上相关的资料很少。

 

在分析这两款应用的过程中,本来准备偷点懒,看看网上有没有现成的工具,找了很久都没找到,于是只好苦逼地自己来破解它了,参考了一些找到的资料,但资料与实际情况有些出入,所以,一切应以实战为准。

 

本文去除了繁琐的探索步骤,只展示破解jsc格式文件的方法,相信大家看完后也能够解cocos2d游戏代码中的jsc文件。

 

解密的完整源码已经在github上公开,在这里就不放了,大家如果有需要可以去上面找。

 

 

02

 

前面已经提到,jsc文件是js加密后的数据,常在cocos2d游戏中用到。

 

其实,真正在js和jsc文件中进行转换的是spidermonkey,一个mozilla项目中用c写的javascript脚本引擎。

 

cocos2d中使用了spidermonkey来进行javascript脚本的处理。

 

spidermonkey已经迭代了很多版本,早期的版本为方便调试,默认生成jsc文件时,原始的js脚本就在这个文件的尾部,直接就能抠出来用了,网上很多资料所谓的解密就是指的这个。

 

网上另外还有一个非虫写的解密jsc的文章,是真的解密,但是按他的文章进行无脑傻瓜式操作,编译spidermonkey都过不去,只能参考下使用的接口,自己来写了。

 

在解密之前,需要注意jsc文件的最开始有文件的版本,具体解密过程中,如果使用的spidermonkey版本不对,是不会解的,版本号有大版本和小版本,需要完全一致才可以,能够和cocos2d匹配的spidermonkey在cocos2d的github内可以找到,大版本是v33,如果需要其它版本,就去spidermonkey官网找找,不一定能找到。

 

虽然spidermonkey看着很大,但解密jsc文件只需要其中一点点,都在js/src/里面,另外,针对具体使用的编译环境,需要修改configure文件内的编译器,我当时的环境是修改configure.in内c99为gnu99。

 

真正的解密过程,其实就是调用接口,解密接口为js_decodescript,为了解密后的数据能够输出,还需要实现一个将解密结果输出的函数,我使用的名称是js_dumpjsc,是从spidermonkey代码中其它地方拷出来的。

 

具体各个接口怎么用,spidermonkey代码中其实都有,我采用的是比较省事的方法,直接模仿gdb-tests.cpp来玩,代码量很少,主要是有一套使用框架,照葫芦画瓢就行了。

 

关键的解密代码是这样子,入参cx为照葫芦画瓢初始化好的jscontext,jsc_file_path为jsc文件路径:jscontext

bool decode_jsc(jscontext *cx,char *jsc_file_path) {
uint32_t datalen = 0; void *bytecode_data = load_string_from_file(jsc_file_path,(int *)&datalen);
if (bytecode_data!=null) { js::rootedscript *script = new js::rootedscript(cx); *script = js_decodescript(cx, bytecode_data, datalen,nullptr); char outfilename[255]={0}; sprintf(outfilename,"%s.jsdec",jsc_file_path); if(js_dumpjsc(cx,*script,outfilename)) //js_dumpjscfile(cx,*script,outfilename) { printf( "run ok."); } } return true;}

 

它的编译,可以参考spidemonkey官网的资料,大概是这样子:

autoconf-2.13 

cd build-linux 

../configure --enable-debug --disable-optimize 

make

然后,你就可以使用你写的解密器进行jsc的解密了。

 

当然,spidemonkey的使用过程有很多小坑。

 

03

 

是不是看着摸不着头脑,没关系,动手去搞就是了,搞一次就全明白了。

 

如果有jsc解密的需求,可以自己动手去玩玩。


cocos2d游戏jsc文件格式解密,SpideMonkey大冒险

长按进行关注,时刻进行交流。

 

点击“在看”,与朋友一起分享↘