首页
社区
课程
招聘
[原创]Cocos2d-x 游戏逆向分析文档
发表于: 3小时前 84

[原创]Cocos2d-x 游戏逆向分析文档

3小时前
84

Cocos2d-x 游戏逆向分析文档

项目名称: 好友赛 (haoyousai)分析日期: 2026-03-29分析者: 小白 ????目标路径: /Users/a/back/PycharmProjects/iosx/coco2D


目录结构概览

coco2D/
├── CLAUDE.md                    # Claude Code 使用指南
├── cocos2dx_frida_toolkit.js    # 主分析工具 (1610行)
├── CardRecorder/                # Theos Tweak 原生实现
│   ├── Makefile
│   ├── Tweak.mm                 # 原生 dylib 实现
│   └── control
├── haoyousai.app/               # 目标应用
│   ├── haoyousai                # 主可执行文件 (15.9MB)
│   ├── Info.plist               # 应用配置信息
│   ├── main.js                  # 入口 JS 文件
│   ├── project.json             # Cocos 项目配置
│   ├── project.manifest         # 资源清单
│   ├── script/                  # 游戏脚本目录
│   ├── src/                     # 源代码目录
│   ├── res/                     # 资源文件目录
│   └── Frameworks/              # 依赖框架
└── scripts/                     # 动态捕获的脚本文件
    ├── *.jsc_*.bin              # JSC 字节码文件
    └── js_*.js                  # 解密的 JS 脚本

1. 目标应用分析

1.1 基本信息

  • 应用名称: 好友赛 (haoyousai)
  • Bundle ID: com.oedere.lid23
  • 版本: 1.0 (59)
  • 平台: iOS (iPhoneOS 18.2)
  • 架构: arm64
  • 引擎: Cocos2d-x + JavaScriptCore

1.2 应用特性

  • 横屏游戏: 仅支持横屏方向
  • 微信集成: 包含多个微信 SDK 配置
  • 权限要求: 定位、麦克风、相册、运动健康、语音识别
  • 网络配置: 允许任意 HTTP 加载 (NSAllowsArbitraryLoads: true)

1.3 技术栈识别

  1. 游戏引擎: Cocos2d-x (JavaScript 绑定)
  2. 脚本引擎: JavaScriptCore (iOS 内置)
  3. 脚本格式: JSC 字节码 + 明文 JS
  4. 资源管理: project.manifest 资源清单
  5. 加密方式: 可能存在简单 XOR 或自定义加密

2. 逆向分析工具集

2.1 cocos2dx_frida_toolkit.js (v1.1)

文件大小: 76.8KB (1610行)功能: 全面的 Cocos2d-x 游戏逆向分析工具

2.1.1 核心功能模块

  1. 脚本引擎检测

    • Lua 引擎检测 (luaL_loadbuffer, lua_pcall)
    • JavaScriptCore 检测 (JSEvaluateScript)
    • SpiderMonkey 检测 (JS_EvaluateScript)
    • Cocos JS 绑定检测 (jsb_* 函数)
  2. 脚本拦截与解密

    • Lua 脚本拦截与导出
    • JS 脚本拦截与导出
    • JSC 字节码捕获
    • 实时脚本监控
  3. 游戏逻辑分析

    • Cocos2d-x 类方法 Hook
    • 游戏状态监控
    • UI 事件追踪
    • 网络通信分析
  4. 输入输出监控

    • 触摸事件监控
    • 键盘输入监控
    • 游戏控制器监控
    • 文件 I/O 监控 (可选)
    • 网络 I/O 监控 (可选)
  5. 性能分析

    • 函数调用频率统计
    • 热点函数识别
    • 性能瓶颈分析

2.1.2 关键技术修复 (v1.1)

  1. 超时崩溃修复: 限制扫描范围,避免遍历所有模块
  2. Hook 稳定性: 增加可执行地址检查,避免数据符号 Hook
  3. ObjC 桥接修复: 正确包装字符串和指针类型
  4. 目录创建修复: 使用正确的 ObjC 方法调用
  5. 性能优化: 限制 ObjC 类遍历数量 (maxHooksPerCategory: 50)

2.2 CardRecorder Tweak

类型: Theos Tweak (原生 dylib)目的: 将 Frida 脚本中的出牌记录功能原生实现

2.2.1 核心功能

  1. JSEvaluateScript Hook: 拦截 JavaScript 执行
  2. JSContext 捕获: 自动识别游戏 JS 上下文
  3. 手牌监控注入: 向游戏注入监控脚本
  4. 定时数据采集: 每秒轮询游戏状态
  5. 本地日志存储: 将数据写入沙盒 Documents/card_log.json

2.2.2 注入逻辑

// 检测包含 "setRoomData" 的大型脚本
if (strstr(buf, "setRoomData") != NULL) {
    // 注入监控代码
    injectCardMonitor(ctx);
}

2.2.3 监控脚本内容

setInterval(function(){
    try {
        if(typeof iGame==='undefined'||!iGame.Data||!iGame.Data.roomData||!iGame.Data.roomData.players)return;
        var self_seat=iGame.Data.getSelfSeatNo?iGame.Data.getSelfSeatNo():0;
        var players=iGame.Data.roomData.players;
        var result={self_seat:self_seat,my_hold:[],players:[]};
        players.forEach(function(p){
            if(p.seat_no===self_seat){
                result.my_hold=(p.hold||[]).filter(function(c){return c>0;});
            }
            result.players.push({seat:p.seat_no,out:p.out||[],kou:p.kou||[]});
        });
        window.__cardData=JSON.stringify(result);
    }catch(e){}
},1000);

3. 动态分析结果

3.1 捕获的脚本文件

scripts/ 目录中发现以下文件:

3.1.1 JSC 字节码文件

  1. G212.jsc_1774770976633.bin (101KB) - 游戏模块 212
  2. G30.jsc_1774770909867.bin (29KB) - 游戏模块 30
  3. SYG30.jsc_1774770968778.bin (49KB) - 系统模块 30
  4. SYHall.jsc_1774770963515.bin (584KB) - 大厅模块

3.1.2 明文 JS 脚本

  1. js_1774770963709.js (1.7MB) - 主游戏逻辑
  2. js_1774770976843.js (302KB) - 游戏模块
  3. js_1774770968967.js (147KB) - 系统模块
  4. 多个小型 JS 文件 (88B-2KB) - 配置和工具函数

3.2 游戏架构分析

通过分析捕获的脚本,识别出以下游戏架构:

3.2.1 模块系统

// 典型的 Cocos2d-x 模块定义
__require = function t(e, i, a) {
    // 模块加载器实现
    // ...
};

3.2.2 游戏对象模型

  • iGame: 全局游戏对象
  • iGame.Data: 游戏数据管理
  • iGame.Data.roomData: 房间数据
  • iGame.Data.getSelfSeatNo(): 获取玩家座位号

3.2.3 数据结构

// 玩家数据结构
{
    seat_no: number,      // 座位号
    hold: number[],       // 手牌
    out: number[],        // 出牌
    kou: number[]         // 扣牌
}

// 游戏状态数据结构
{
    self_seat: number,    // 自己座位
    my_hold: number[],    // 自己手牌
    players: player[]     // 所有玩家
}

4. 逆向技术要点

4.1 Frida 注入方法

# 附加到运行进程
frida -U -n haoyousai -l cocos2dx_frida_toolkit.js

# 通过 Bundle ID 附加
frida -U -b com.oedere.lid23 -l cocos2dx_frida_toolkit.js

# 启动并附加
frida -U -f com.oedere.lid23 -l cocos2dx_frida_toolkit.js --no-pause

4.2 交互命令

// 生成分析报告
cocos.getReport()

// 内存模式搜索
cocos.searchMemory(pattern)

// 开始性能分析
cocos.startProfiling()

// 快速 Hook 任意地址
quickHook(addr, name)

// 搜索 Cocos 函数
findCocosFunctions(keyword)

// 监控 ObjC 类
monitorObjCClass(className)

4.3 Theos Tweak 编译

# 进入 CardRecorder 目录
cd CardRecorder

# 编译 Tweak
make

# 安装到设备
make package install

5. 安全分析

5.1 加密机制

  1. JSC 字节码: iOS JavaScriptCore 预编译字节码
  2. 资源加密: project.manifest 可能包含加密配置
  3. 网络通信: 可能存在自定义加密协议

5.2 反调试检测

  • 未发现明显的反调试代码
  • 可正常使用 Frida 注入
  • Theos Tweak 可正常运行

5.3 数据安全

  • 游戏状态数据在内存中明文存在
  • 可通过 JSContext 直接访问游戏对象
  • 网络通信可能加密,但本地数据可读

6. 应用场景

6.1 游戏分析

  • 理解游戏逻辑和状态机
  • 分析游戏平衡性和算法
  • 研究游戏经济系统

6.2 自动化工具开发

  • 自动出牌机器人
  • 游戏状态监控
  • 数据统计和分析

6.3 安全研究

  • 游戏漏洞挖掘
  • 反作弊机制分析
  • 数据保护评估

7. 总结与建议

7.1 技术总结

  1. 目标应用: 使用 Cocos2d-x + JavaScriptCore 的 iOS 游戏
  2. 逆向工具: 开发了完整的 Frida 工具包和原生 Tweak
  3. 分析深度: 从脚本拦截到游戏逻辑分析的完整链条
  4. 实用性: 工具稳定可用,已修复多个关键 Bug

7.2 后续工作建议

  1. 扩展分析范围: 支持更多 Cocos 版本和脚本引擎
  2. 性能优化: 进一步减少 Hook 对游戏性能的影响
  3. 自动化增强: 开发更智能的游戏状态识别
  4. 跨平台支持: 扩展到 Android 平台

7.3 使用注意事项

  1. 法律合规: 仅用于学习和研究目的
  2. 游戏公平: 避免用于破坏游戏平衡
  3. 技术伦理: 尊重开发者劳动成果
  4. 数据隐私: 保护用户隐私数据


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回