尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Unity Mono 安卓游戏逆向实战:APK 分析 + Frida Hook 绕过死亡判定

Unity Mono 安卓游戏逆向实战:APK 分析 + Frida Hook 绕过死亡判定
📅 发布时间:2026/6/19 12:27:46

Android安卓游戏Unity Mono 游戏逆向实战:从 APK 到 Hook libmono.so 绕过死亡判定

前言

最近在分析一款 极限摩托基于手机重力控制的 Unity 游戏:

game

  • 通过手机 前后翻转控制角色
  • 人物只要 发生碰撞(翻车 / 头部触地)就会立即失败
  • 没有明显的数值判定,属于典型的 物理 + 碰撞触发死亡

本文完整记录了我 从 APK 分析 → 判断 Unity 架构 → Hook Mono Runtime → 精准拦截死亡函数 的全过程。

最终效果:

人物发生碰撞也不会死亡,游戏可正常继续运行。


一、实验环境

我使用的设备 & 工具版本

  • Android 10 真机(arm64)
  • Frida版本:17.5.2
  • Frida Server版本:frida-server-17.5.1-android-arm64
  • Python版本:3.10.0
  • 手机不方便可以使用手机模拟器

Frida Server 启动

上传到手机:

adb push frida-server-17.5.1-android-arm64 /data/local/tmp/
adb shell chmod +x /data/local/tmp/frida-server-17.5.1-android-arm64

启动frida-server-17.5.1-android-arm64

adb shell /data/local/tmp/frida-server-17.5.1-android-arm64

二、从 APK 入手:判断游戏架构

1️⃣ 解包 APK

apktool d trial.apk

重点关注:

  • AndroidManifest.xml
  • lib/armeabi-v7a / lib/arm64-v8a
  • assets/

2️⃣ 查看 so 文件(关键判断点)

在 lib/arm64-v8a/ 目录下发现:

libmono.so
libu.so

同时:

  • ❌ 不存在 libil2cpp.so
  • ❌ 不存在 libunity.so(部分 Mono 游戏本来就没有)

✅ 结论

这是一个 Unity Mono 架构游戏(非 IL2CPP)


三、确认 C# 脚本存在

在:

assets/bin/Data/Managed/

中可以看到:

Assembly-CSharp.dll
UnityEngine.dll

Assembly-CSharp.dll 可以使用ILSpy工具打开,可以直接看到关键代码Bone::OnCollisionEnter,进行分析

说明:

  • 游戏逻辑由 C# 编写
  • 运行在 Mono VM
  • 实际执行发生在 libmono.so

四、为什么选择 Hook libmono.so

❌ 不直接修改 DLL 的原因

  • 需要重打包 APK
  • 可能触发签名 / 完整性校验
  • 不利于动态调试

✅ Hook Mono Runtime 的优势

  • 不修改 APK
  • 可实时观察 C# 函数调用
  • 能拦截 Unity 生命周期 / 碰撞函数

五、锁定关键函数:mono_runtime_invoke

Mono 执行模型简化图

Unity 物理 / 碰撞↓
C# 脚本 (Update / OnCollisionEnter)↓
IL Code↓
mono_runtime_invoke↓
Native 执行

所有 C# 方法最终都会经过 mono_runtime_invoke

这意味着:

Hook 一个函数,就能观察并控制所有 C# 方法调用。


六、附加进程并 Hook

1️⃣ 查找游戏 PID

adb shell ps -A | grep com.galapagossoft.trial

输出示例:

u0_a236   19480   ...   com.galapagossoft.trial

2️⃣ Frida Attach

frida -U -p 19480 -l mono_base.js

七、Hook 脚本(核心代码)

console.log("[*] mono_base.js loaded");var mono = Process.findModuleByName("libmono.so");
if (!mono) {console.log("libmono.so not found");return;
}var mono_method_get_name_ptr = mono.getExportByName("mono_method_get_name");
var mono_runtime_invoke_ptr = mono.getExportByName("mono_runtime_invoke");
var mono_method_get_class_ptr = mono.getExportByName("mono_method_get_class");
var mono_class_get_name_ptr = mono.getExportByName("mono_class_get_name");var mono_method_get_name = new NativeFunction(mono_method_get_name_ptr, "pointer", ["pointer"]
);var mono_method_get_class = new NativeFunction(mono_method_get_class_ptr, "pointer", ["pointer"]
);var mono_class_get_name = new NativeFunction(mono_class_get_name_ptr, "pointer", ["pointer"]
);var orig_mono_runtime_invoke = new NativeFunction(mono_runtime_invoke_ptr,"pointer",["pointer", "pointer", "pointer", "pointer"]
);Interceptor.replace(mono_runtime_invoke_ptr,new NativeCallback(function (method, obj, params, exc) {var klass = mono_method_get_class(method);var className = mono_class_get_name(klass).readCString();var methodName = mono_method_get_name(method).readCString();// 关键:拦截碰撞触发if (className === "Bone" && methodName === "OnCollisionEnter") {console.log("[BLOCK] " + className + "::" + methodName);return ptr(0);}return orig_mono_runtime_invoke(method, obj, params, exc);}, "pointer", ["pointer", "pointer", "pointer", "pointer"])
);

八、分析过程与关键突破

1️⃣ 先打印观察调用

日志中依次出现:

Fork::Update
Fork::OnCollisionStay
FailController::OnGUI
Bone::OnCollisionEnter

2️⃣ 排除错误目标

  • FailController::OnGUI
    👉 只是 UI 显示失败画面,不是死亡原因

  • FailController::Start
    👉 失败后的初始化逻辑


3️⃣ 真正的死亡触发点

Bone::OnCollisionEnter

这正好符合游戏机制:

人物因重力翻转发生碰撞 → 立即失败


九、最终效果

成功拦截后:

  • 人物发生碰撞 不再死亡
  • 物理系统正常
  • 游戏流程可继续

✅ 无需修改 APK
✅ 无需重打包
✅ 精准绕过失败判定


十、总结

本文完整展示了一条 Unity Mono 游戏逆向的通用思路:

  1. 从 APK 判断 Unity 架构
  2. 确认 Mono 而非 IL2CPP
  3. 锁定 libmono.so
  4. Hook mono_runtime_invoke
  5. 通过 Runtime 级分析定位关键 C# 方法
  6. 精准拦截 OnCollisionEnter 实现逻辑绕过

理解引擎执行模型,比盲目改代码更重要。


后记

这套方法同样适用于:

  • Unity Mono 手游
  • 碰撞 / 判定 / 失败逻辑分析
  • 无源码、无符号环境下的动态逆向

后续我会继续分享更多 Unity / Mono / Frida 实战分析。

相关新闻

  • 2025苏州装修公司推荐前十强:口碑榜单 避坑指南 - 品牌测评鉴赏家
  • YOLO模型训练引入自监督学习预训练
  • 探索 BLDC 有感仿真模型:双闭环控制与霍尔传感器的奇妙结合

最新新闻

  • 大模型价格战背后的成本革命:从API调用到工程落地的全链路降本
  • 基于MCP协议与LLM的自动化渗透测试工作流构建实践
  • 重庆壹创新材料有限公司:专业珍珠棉包装材料厂家,隔音/加厚/易碎品保护优选 - 品牌推荐官
  • 后量子密码跨平台集成实战:兼容性挑战与工程解决方案
  • 构建后端纵深安全防线:从WAF、Nginx加固到DevSecOps实践
  • 宁波佳利达汽配抽油器系列推荐:抽油泵/电动抽油筒/手动抽油器专业制造 - 品牌推荐官

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号