找回密码
 立即注册
首页 业界区 业界 Unity Mono 安卓游戏逆向实战:APK 分析 + Frida Hook ...

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

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

前言

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


  • 通过手机 前后翻转控制角色
  • 人物只要 发生碰撞(翻车 / 头部触地)就会立即失败
  • 没有明显的数值判定,属于典型的 物理 + 碰撞触发死亡
本文完整记录了我 从 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 启动

上传到手机:
  1. adb push frida-server-17.5.1-android-arm64 /data/local/tmp/
复制代码
  1. adb shell chmod +x /data/local/tmp/frida-server-17.5.1-android-arm64
复制代码
启动frida-server-17.5.1-android-arm64
  1. adb shell /data/local/tmp/frida-server-17.5.1-android-arm64
复制代码
二、从 APK 入手:判断游戏架构

1️⃣ 解包 APK
  1. apktool d trial.apk
复制代码
重点关注:

  • AndroidManifest.xml
  • lib/armeabi-v7a / lib/arm64-v8a
  • assets/
2️⃣ 查看 so 文件(关键判断点)

在 lib/arm64-v8a/ 目录下发现:
  1. libmono.so
  2. libu.so
复制代码
同时:

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

这是一个 Unity Mono 架构游戏(非 IL2CPP)
三、确认 C# 脚本存在

在:
  1. assets/bin/Data/Managed/
复制代码
中可以看到:
  1. Assembly-CSharp.dll
  2. 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 执行模型简化图
  1. Unity 物理 / 碰撞
  2.         ↓
  3. C# 脚本 (Update / OnCollisionEnter)
  4.         ↓
  5. IL Code
  6.         ↓
  7. mono_runtime_invoke
  8.         ↓
  9. Native 执行
复制代码
所有 C# 方法最终都会经过 mono_runtime_invoke
这意味着:
Hook 一个函数,就能观察并控制所有 C# 方法调用。
六、附加进程并 Hook

1️⃣ 查找游戏 PID
  1. adb shell ps -A | grep com.galapagossoft.trial
复制代码
输出示例:
  1. u0_a236   19480   ...   com.galapagossoft.trial
复制代码
2️⃣ Frida Attach
  1. frida -U -p 19480 -l mono_base.js
复制代码
七、Hook 脚本(核心代码)
  1. console.log("[*] mono_base.js loaded");
  2. var mono = Process.findModuleByName("libmono.so");
  3. if (!mono) {
  4.     console.log("libmono.so not found");
  5.     return;
  6. }
  7. var mono_method_get_name_ptr = mono.getExportByName("mono_method_get_name");
  8. var mono_runtime_invoke_ptr = mono.getExportByName("mono_runtime_invoke");
  9. var mono_method_get_class_ptr = mono.getExportByName("mono_method_get_class");
  10. var mono_class_get_name_ptr = mono.getExportByName("mono_class_get_name");
  11. var mono_method_get_name = new NativeFunction(
  12.     mono_method_get_name_ptr, "pointer", ["pointer"]
  13. );
  14. var mono_method_get_class = new NativeFunction(
  15.     mono_method_get_class_ptr, "pointer", ["pointer"]
  16. );
  17. var mono_class_get_name = new NativeFunction(
  18.     mono_class_get_name_ptr, "pointer", ["pointer"]
  19. );
  20. var orig_mono_runtime_invoke = new NativeFunction(
  21.     mono_runtime_invoke_ptr,
  22.     "pointer",
  23.     ["pointer", "pointer", "pointer", "pointer"]
  24. );
  25. Interceptor.replace(
  26.     mono_runtime_invoke_ptr,
  27.     new NativeCallback(function (method, obj, params, exc) {
  28.         var klass = mono_method_get_class(method);
  29.         var className = mono_class_get_name(klass).readCString();
  30.         var methodName = mono_method_get_name(method).readCString();
  31.         // 关键:拦截碰撞触发
  32.         if (className === "Bone" && methodName === "OnCollisionEnter") {
  33.             console.log("[BLOCK] " + className + "::" + methodName);
  34.             return ptr(0);
  35.         }
  36.         return orig_mono_runtime_invoke(method, obj, params, exc);
  37.     }, "pointer", ["pointer", "pointer", "pointer", "pointer"])
  38. );
复制代码
八、分析过程与关键突破

1️⃣ 先打印观察调用

日志中依次出现:
  1. Fork::Update
  2. Fork::OnCollisionStay
  3. FailController::OnGUI
  4. Bone::OnCollisionEnter
复制代码
2️⃣ 排除错误目标

<ul>
FailController::OnGUI

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册