-
-
[原创]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 技术栈识别
- 游戏引擎: Cocos2d-x (JavaScript 绑定)
- 脚本引擎: JavaScriptCore (iOS 内置)
- 脚本格式: JSC 字节码 + 明文 JS
- 资源管理: project.manifest 资源清单
- 加密方式: 可能存在简单 XOR 或自定义加密
2. 逆向分析工具集
2.1 cocos2dx_frida_toolkit.js (v1.1)
文件大小: 76.8KB (1610行)功能: 全面的 Cocos2d-x 游戏逆向分析工具
2.1.1 核心功能模块
脚本引擎检测
- Lua 引擎检测 (luaL_loadbuffer, lua_pcall)
- JavaScriptCore 检测 (JSEvaluateScript)
- SpiderMonkey 检测 (JS_EvaluateScript)
- Cocos JS 绑定检测 (jsb_* 函数)
脚本拦截与解密
- Lua 脚本拦截与导出
- JS 脚本拦截与导出
- JSC 字节码捕获
- 实时脚本监控
游戏逻辑分析
- Cocos2d-x 类方法 Hook
- 游戏状态监控
- UI 事件追踪
- 网络通信分析
输入输出监控
- 触摸事件监控
- 键盘输入监控
- 游戏控制器监控
- 文件 I/O 监控 (可选)
- 网络 I/O 监控 (可选)
性能分析
- 函数调用频率统计
- 热点函数识别
- 性能瓶颈分析
2.1.2 关键技术修复 (v1.1)
- 超时崩溃修复: 限制扫描范围,避免遍历所有模块
- Hook 稳定性: 增加可执行地址检查,避免数据符号 Hook
- ObjC 桥接修复: 正确包装字符串和指针类型
- 目录创建修复: 使用正确的 ObjC 方法调用
- 性能优化: 限制 ObjC 类遍历数量 (maxHooksPerCategory: 50)
2.2 CardRecorder Tweak
类型: Theos Tweak (原生 dylib)目的: 将 Frida 脚本中的出牌记录功能原生实现
2.2.1 核心功能
- JSEvaluateScript Hook: 拦截 JavaScript 执行
- JSContext 捕获: 自动识别游戏 JS 上下文
- 手牌监控注入: 向游戏注入监控脚本
- 定时数据采集: 每秒轮询游戏状态
- 本地日志存储: 将数据写入沙盒 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 字节码文件
G212.jsc_1774770976633.bin(101KB) - 游戏模块 212G30.jsc_1774770909867.bin(29KB) - 游戏模块 30SYG30.jsc_1774770968778.bin(49KB) - 系统模块 30SYHall.jsc_1774770963515.bin(584KB) - 大厅模块
3.1.2 明文 JS 脚本
js_1774770963709.js(1.7MB) - 主游戏逻辑js_1774770976843.js(302KB) - 游戏模块js_1774770968967.js(147KB) - 系统模块- 多个小型 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 加密机制
- JSC 字节码: iOS JavaScriptCore 预编译字节码
- 资源加密: project.manifest 可能包含加密配置
- 网络通信: 可能存在自定义加密协议
5.2 反调试检测
- 未发现明显的反调试代码
- 可正常使用 Frida 注入
- Theos Tweak 可正常运行
5.3 数据安全
- 游戏状态数据在内存中明文存在
- 可通过 JSContext 直接访问游戏对象
- 网络通信可能加密,但本地数据可读
6. 应用场景
6.1 游戏分析
- 理解游戏逻辑和状态机
- 分析游戏平衡性和算法
- 研究游戏经济系统
6.2 自动化工具开发
- 自动出牌机器人
- 游戏状态监控
- 数据统计和分析
6.3 安全研究
- 游戏漏洞挖掘
- 反作弊机制分析
- 数据保护评估
7. 总结与建议
7.1 技术总结
- 目标应用: 使用 Cocos2d-x + JavaScriptCore 的 iOS 游戏
- 逆向工具: 开发了完整的 Frida 工具包和原生 Tweak
- 分析深度: 从脚本拦截到游戏逻辑分析的完整链条
- 实用性: 工具稳定可用,已修复多个关键 Bug
7.2 后续工作建议
- 扩展分析范围: 支持更多 Cocos 版本和脚本引擎
- 性能优化: 进一步减少 Hook 对游戏性能的影响
- 自动化增强: 开发更智能的游戏状态识别
- 跨平台支持: 扩展到 Android 平台
7.3 使用注意事项
- 法律合规: 仅用于学习和研究目的
- 游戏公平: 避免用于破坏游戏平衡
- 技术伦理: 尊重开发者劳动成果
- 数据隐私: 保护用户隐私数据
赞赏
他的文章
赞赏
雪币:
留言: