吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8476|回复: 28
收起左侧

[Android 原创] 底层源码分析jsc解密过程与动态调试获取解密key

  [复制链接]
Ichild 发表于 2021-9-8 18:55
前言
        去年在家里上网课那段时间无聊,就找了一些小游戏玩玩。正好当时也学了一点逆向,就尝试拿这个游戏练练手。然而当时太菜,对apk的逆向分析基本仅限于简单的java层,这个游戏的逻辑不在java层,所以当时的分析没啥结果。

一、初识cocos2d-js
        java层没有有用的信息,找找其它地方。lib目录下只有一个so文件libcocos2djs.so,在assets/src下看到3个jsc文件:cocos2d-jsb.jsc、project.jsc、setting.jsc,搜索一下就知道了这是cocos2d-js框架搭建的游戏,游戏内代码都是用js编写,可加密为jsc文件。

        继续搜索,尝试了一些网上的给出jsc解密方式,都失败了,根本原因就是找不到解密的密钥。

        初步的尝试这样结束了,这件事也搁置了很久。

二、分析so层代码
        一年后,不断学习的我能力提升了不少,决定再次尝试。

        游戏逻辑开始之前必定是要从jsc中解密出js脚本的,这个解密的程序一定在本地,于是将目标锁定到唯一的so:libcocos2djs.so。

        去年搜索的时候大致确定是xxtea算法加解密,所以IDA加载完毕后,导出表中找到xxtea_decrypt函数,交叉引用找到两处,跟入第一处sub_4A9320,关键代码如下:
        code.png

        其中,std::string结构体(类)参考 https://joellaity.com/2020/01/31/string.html 再在代码中比较可构造出来,剩下的简单结构体可根据代码含义恢复出来,虚函数表也有对应的符号信息,很容易恢复。

        这就是jsc的解密过程了,果然是xxtea解密,而xxtea_key仍是未知的。

三、获取key
        xxtea_key是一个全局变量,那么可以在游戏启动后在内存中查看它的值,这涉及到ida动态调试,网上有很多教程,但是那些教程大多都是连接调试器后才运行,这里需要运行后再附加调试器,而且不需要暂停。大部分过程是相同的,简单介绍如下:

        1.开启夜神模拟器,安装软件,将android_server放到/data/local/tmp/目录下,赋予可执行权限;
        step1.png

        2.运行android_server,新开一个控制台转发端口;
        step2.png

        3.模拟器上打开游戏,新开ida窗口,Debugger->Attach->Remote Arm Linux/Android debugger,Hostname为127.0.0.1,端口为23946,其它不用管,直接OK,然后选择此应用;
        step3.png

        4.在窗口IDA View中按ctrl+s弹出段窗口,找到libcocos2djs.so段,记录起始地址0xC000000;
        step4.png

        5.xxtea_key在libcocos2djs.so中偏移为0xDB5698,那么这里按g,跳转到CDB5698,第一个_DWORD为33表示这是长字符串,cap为33,第二个_DWORD值为16表示字符串长度为16,第三个_DWORD为一个指针,指向保存的字符串,所以可以看到key为a64fe959-4a0e-4e。
        step5.png

        至此,成功获得xxtea_key。

四、解密jsc
        有了key后应该可以直接用网上的方法解密,但是分析so时看着源码很简单,还不如自己直接写个xxtea程序解密(将ida中xxtea_decrypt部分F5后的代码复制过来,再简单改改就行了)。

        so层xxtea解密后判断是否是Gzip压缩,判断很简单,就是前两个字节是否是1F和8B,所以解密后需要多一步判断操作。实际解密project.jsc后确实是Gzip压缩,那么将解密后数据保存在project.js.gz文件中,Gzip解压缩也不需要写代码了,双击gz文件,将project.js拖出来即可。
        gzip_unzip.png

        这样,jsc就成功解密了。
        js_1.png
        js_2.png

五、后话
        上面的步骤是几个月前做的,这次重复一遍,分析so时查看xxtea_key交叉引用,找到jsb_set_xxtea_key函数,继续交叉引用,找到AppDelegate::applicationDidFinishLaunching函数,这里直接可以看到key,原来这么简单,大意了。也是因为这里用snprintf将key的各个部分重新组合,所以当时并没有找到key。
       

set xxtea_key

set xxtea_key


        不过几个月前我从上面的步骤中学到了很多,觉得很有用,就记录一下,分享给大家。

免费评分

参与人数 6威望 +1 吾爱币 +25 热心值 +5 收起 理由
A-tom + 1 我很赞同!
zy1234 + 1 + 1 谢谢@Thanks!
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
石碎大胸口 + 1 + 1 热心回复!
-yuy- + 1 + 1 谢谢@Thanks!
鹤舞九月天 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Ichild 发表于 2022-10-31 09:12
kewei1996 发表于 2022-10-30 23:53
大佬,请问有的游戏安装包的src里没有project.jsc该怎么办?

project.jsc是源代码整合到一个文件里加密的,有可能没有整合,就有很多个jsc文件,这些都可能是加密的源代码。当然文件后缀不一定是jsc,这些都是开发时可以自己修改的。反正只要是cocos2d-js,源代码(可能加密)一定是在assets目录下的,找一找就行了。
 楼主| Ichild 发表于 2021-12-22 21:53
kin8642 发表于 2021-12-20 22:22
楼主您好,解密正确出来的JS,打开之后是乱码,带有PK开头,PK结尾,请问是哪里出问题? 是否因为没有解压 ...

嗯,需要解压,PK开头的二进制文件一般就是zip压缩。
我上面的分析过程有解密出来判断是否GZIP压缩,这里相似,是zip压缩。将文件后缀改为zip即可
syc_song 发表于 2021-9-9 12:38
aa860415 发表于 2021-9-9 20:37
感谢分享,比较通俗易懂
咔c君 发表于 2021-9-9 20:49
学习了不错
lyghost 发表于 2021-9-10 08:18
这个方式和lua一样的,都是在初始化的时候赋值key
fengziyu632 发表于 2021-9-10 08:20
大佬厉害了,学习了。
咔c君 发表于 2021-9-10 21:13
学习了不错
ongp1347 发表于 2021-9-11 07:59
简单明了 谢谢楼主分享
zy1234 发表于 2021-10-5 11:40
兄弟加个好友帮我看下JSC的解密
 楼主| Ichild 发表于 2021-10-7 08:13
本帖最后由 Ichild 于 2021-10-7 08:22 编辑
zy1234 发表于 2021-10-5 11:40
兄弟加个好友帮我看下JSC的解密

等级不够加不了好友
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:00

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表