某手游cocos2djs逆向分享之分析思路及切入方法

admin 2025年4月9日23:20:14评论5 views字数 2787阅读9分17秒阅读模式

一,初探

拿到APP,先解压查看下加固情况,因为游戏类app一般都是使用cocos2d或者unity框架开发,先初步确定app开发框架,方便后续寻找大佬的成功经验,可以使用关键词做相关搜索.

某手游cocos2djs逆向分享之分析思路及切入方法

可以在./lib/arm64-v8a/路径下,看到最大的so文件为libcocos2djs.so,可以初步确定本样本为cocos2djs开发.

二,需求

某个接口有个sign算法需要确定其计算的方式,先抓包看看

三,抓包

直接使用root真机,安装样本app,尝试使用postern全局代理,发现app会出现断网的情况.改用proxydroid,还是断网.最后使用WIFI代理,成功抓取到对应的数据包.

可以看到sign的位置,以及其他一些线索关键词:create_order_v2,apipayh5

某手游cocos2djs逆向分享之分析思路及切入方法

四,分析

解压app到文件夹,直接cmd命令通过grep工具搜索关键词

某手游cocos2djs逆向分享之分析思路及切入方法

可以看到在classes.dex里面有线索,jadx-gui直接拖入dex文件进行搜索

某手游cocos2djs逆向分享之分析思路及切入方法

通过交叉引用一直往上找,最终定位到

某手游cocos2djs逆向分享之分析思路及切入方法

尝试hook,查看一下调用堆栈.

let YqSdkMgr = Java.use("org.cocos2dx.javascript.plugin.YqSdkMgr");YqSdkMgr["sdkVip"].implementation = function (str) {    console.log(`YqSdkMgr.sdkVip is called: str=${str}`);    this["sdkVip"](str);};
某手游cocos2djs逆向分享之分析思路及切入方法

可以看到sign是作为参数传入的,咨询AI可知在cocos2djs框架开发的app中jsc文件里面才有对应的线索.在/assets里面随便找一个后缀jsc的文件打开看看先

某手游cocos2djs逆向分享之分析思路及切入方法

不出意外,核心代码做了加密,那么接下来就是寻找jsc的解密方法.

五,尝试

1,根据经验,先将libcocos2djs.so拖入到winhex中搜索main.js,结果如下

某手游cocos2djs逆向分享之分析思路及切入方法

附近找到一个目测有点奇怪的字符串:c03ef3b<$21a4)11,长度也和之前研究过的jsc的key长度一样,填入解密工具,并拖入jsc文件尝试解密.

某手游cocos2djs逆向分享之分析思路及切入方法

解密失败.看来得上强度了.

六,动手

根据大佬的分享可知jsc文件一般是使用xxtea算法进行加解密.以下是frida脚本

var so_name = "libcocos2djs.so";var fun_name = "xxtea_decrypt";function do_hook() {    var addr = Module.findExportByName(so_name, fun_name);  console.log(addr);   Interceptor.attach(addr, {      onEnterfunction (args) {                console.log('key: ' + Memory.readCString (args[2]));      },      onLeavefunction (retval) {      }  })}function load_so_and_hook() {  var dlopen = Module.findExportByName(null"dlopen");  var android_dlopen_ext = Module.findExportByName(null"android_dlopen_ext");  Interceptor.attach(dlopen, {      onEnterfunction (args) {          var path_ptr = args[0];          var path = ptr(path_ptr).readCString();          console.log("[dlopen:]", path);          this.path = path;      }, onLeavefunction (retval) {          if (this.path.indexOf(so_name) !== -1) { // 如果包含我想要的so文件              console.log("[dlopen:]"this.path);              do_hook();          }      }  });  Interceptor.attach(android_dlopen_ext, {      onEnterfunction (args) {          var path_ptr = args[0];          var path = ptr(path_ptr).readCString();          this.path = path;      }, onLeavefunction (retval) {          if (this.path.indexOf(so_name) !== -1) {              console.log("nandroid_dlopen_ext加载:"this.path);              do_hook();          }      }  });}load_so_and_hook();

通过spwan方式启动app,并且在加载对应的so后执行xxtea_decrypt的解密,可以hook到对应的秘钥

某手游cocos2djs逆向分享之分析思路及切入方法

可以看到已经hook到对应的秘钥,再次尝试拖入JscDecodeCsharp进行解密:

某手游cocos2djs逆向分享之分析思路及切入方法

可以看到,已经解密得到核心js代码.但是还有一个问题,assets里面的jsc文件很多,一个一个解密定位很浪费时间.尝试寻找有没有批量解密的工具或者代码

最终在万能的github找到

https://github.com/MikaCybertron/Tool-Encryption-Decryption-JSC-Files-for-Cocos2djs-Games

里面有两份工具,一份是exe格式的,经测试,无法解密.还有一份是python代码,尝试在window10上面根据流程安装依赖库并执行,提示缺少C++14,无法运行.

于是更换使用ubuntu系统,成功批量解密所有jsc文件.

然后使用grep最终定位到核心代码位置如下

某手游cocos2djs逆向分享之分析思路及切入方法

可以看到sign是通过protobuf,服务器下发的,signParam应该就是用来签名的原始文本,但是具体算法在服务器执行,无法本地还原.

至于分析protobuf协议,看着头大,直接拖回收站去吧 

· 今 日 推 荐 ·

听歌有惊喜,包邮送书哦!!!欢迎私聊,vx:ivu123ivu

将下面地址复制到浏览器即可欣赏 

http://163cn.tv/DdLCYjl 

(来自@网易云音乐)

某手游cocos2djs逆向分享之分析思路及切入方法

本文内容来自网络,如有侵权请联系删除

原文始发于微信公众号(逆向有你):某手游cocos2djs逆向分享之分析思路及切入方法

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年4月9日23:20:14
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   某手游cocos2djs逆向分享之分析思路及切入方法http://cn-sec.com/archives/3932660.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息