Unity 游戏逆向:使用 Il2CppDumper 还原 C# 符号表,修改 DLL 实现“无敌模式”

标签:#GameSecurity #ReverseEngineering #Unity #Il2Cpp #Assembly #IDA


🧱 前言:Mono vs Il2Cpp

  • Mono: C# -> IL (中间语言)。DLL 包含元数据,极易反编译。
  • Il2Cpp: C# -> IL -> C++ -> Native Code (机器码)。DLL 只有汇编,元数据(类名、方法名)被剥离并打包到了global-metadata.dat中。

逆向难度对比 (Mermaid):

Il2Cpp 模式 (困难)

IDA

Il2CppDumper

Il2CppDumper

GameAssembly.dll (机器码)

sub_123456 (无名字)

合并

global-metadata.dat (元数据)

DummyDll (含符号结构)

IDA Script (重命名函数)

Mono 模式 (简单)

DnSpy

Assembly-CSharp.dll

C# 源码 (完全可见)


🛠️ 一、 准备工作:提取核心文件

你需要从游戏安装目录中找到两个文件:

  1. GameAssembly.dll(或libil2cpp.so): 存放逻辑代码。
  2. global-metadata.dat: 存放字符串、类定义、方法签名。通常在.../Il2Cpp_Data/Metadata/目录下。

工具准备:

  • Il2CppDumper: 开源神器,用于提取地址映射。
  • DnSpy: 用于查看还原后的 C# 结构。
  • IDA Pro(或 Ghidra): 用于分析和修改汇编指令。

🔓 二、 还原符号:Il2CppDumper 实战

运行Il2CppDumper.exe,依次选择GameAssembly.dllglobal-metadata.dat
程序运行完毕后,会生成一个输出文件夹,其中最核心的是:

  1. DummyDll/: 这是一个文件夹,里面包含了一堆 DLL。
  • 注意:这些 DLL 只有“壳”(类和方法定义),没有“肉”(具体代码逻辑是空的)。
  1. script.json&il2cpp.h: 用于在 IDA 中导入符号。
1. 使用 DnSpy 搜索逻辑

打开 DnSpy,加载DummyDll文件夹下的Assembly-CSharp.dll
虽然方法体是空的,但你可以看到完整的类结构!

搜索关键词:Health,Damage,PlayerController,BattleManager

假设我们要实现“无敌”,我们找到了这样一个类:

// 在 DnSpy 中看到的伪代码publicclassPlayerHealth:MonoBehaviour{// 关键点!Dumper 告诉了我们这个方法在内存中的偏移地址 (Offset)[Address(RVA="0x180ABC10",Offset="0xABC10")]publicvoidTakeDamage(intdamage){}}

信息获取:
我们拿到了核心情报:TakeDamage函数的地址是0x180ABC10


💉 三、 深入汇编:IDA 修改逻辑

有了地址,我们就可以去 IDA 里操作手术了。

1. 加载并恢复符号

用 IDA 打开原始的GameAssembly.dll。等待分析完成。
File -> Script file -> 选择 Dumper 生成的ida_with_struct_py3.py,并加载script.json
奇迹发生了:原本的sub_180ABC10自动变成了PlayerHealth$$TakeDamage

2. 分析汇编逻辑

双击跳转到该函数。你可能会看到类似这样的 x64 汇编(示意):

PlayerHealth$$TakeDamage: sub rsp, 20h mov eax, [rcx+30h] ; 读取当前血量 (rcx是this指针) sub eax, edx ; 血量 - 伤害 (edx是参数damage) mov [rcx+30h], eax ; 写回血量 ; ... 判断是否死亡 ... add rsp, 20h retn
3. 实施“无敌”修改 (Hex Patch)

要实现无敌,最简单的方法是:让扣血函数直接返回,什么都不做。

我们只需要修改函数开头指令,让它直接RET

  • x64 指令:C3(ret)
  • ARM64 指令:C0 03 5F D6(ret)

修改步骤:

  1. 在函数开头按KeyPatch(如果没有插件就用 Hex View)。
  2. 将开头的指令修改为ret(或者nop掉减法指令)。
  3. Edit -> Patch program -> Apply patches to input file。

修改后的逻辑:

PlayerHealth$$TakeDamage: retn ; 直接返回!血量不会减少 ; ... 下面的代码永远不会执行 ...

🛡️ 四、 进阶:Hook 注入 (Frida/C++)

直接修改 DLL 文件(静态修改)容易被游戏完整性校验(CRC)发现导致封号。
更高阶的做法是Hook (动态修改)

我们可以编写一个 DLL 注入到游戏进程,利用MinHook库,在内存中拦截0x180ABC10

// C++ Hook 伪代码typedefvoid(*TakeDamage_t)(void*_this,intdamage);TakeDamage_t Original_TakeDamage=nullptr;voidHooked_TakeDamage(void*_this,intdamage){// 只有当受击者是主角时,才免疫伤害if(IsPlayer(_this)){return;// 啥都不做,无敌!}// 敌人还是正常扣血Original_TakeDamage(_this,damage);}voidInit(){uint64_tbase=(uint64_t)GetModuleHandle("GameAssembly.dll");// Hook Dumper 找到的偏移地址MH_CreateHook((void*)(base+0xABC10),&Hooked_TakeDamage,(void**)&Original_TakeDamage);MH_EnableHook(MH_ALL_HOOKS);}

🔒 五、 防御:开发者如何应对?

作为开发者,看到自己的代码被扒得底裤都不剩,该怎么办?

  1. Metadata 加密
    Dumper 的工作原理是解析global-metadata.dat。修改 Unity 源码,对该文件进行 XOR 或 AES 加密,并在加载时动态解密,可以防住 90% 的脚本小子。
  2. 代码混淆 (Obfuscation)
    使用 Obfuscator Pro 等插件,把TakeDamage重命名为a,把类名混淆。即使 Dumper 还原了符号,黑客看到的也是一堆乱码。
  3. 完整性校验
    在游戏启动时计算GameAssembly.dll的 Hash 值,如果发现被修改(Hex Patch),直接闪退。

🎯 总结

Il2CppDumper 是连接 “C# 逻辑” 和 “C++ 汇编” 的桥梁。

  • DnSpy用来看懂结构。
  • IDA用来修改指令。
  • Frida/Hook用来实现复杂的运行时修改。

Next Step:
找一个练手用的单机 Unity 游戏(APK 或 PC版),尝试使用Frida脚本动态 Hook 一个get_Gold()函数,打印出当前的返回值,并尝试将其返回值修改为 999999。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1174759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度剖析AI原生应用的用户体验优化

深度剖析AI原生应用的用户体验优化:从"工具盒子"到"智能伙伴"的进化之旅关键词:AI原生应用、用户体验优化、智能交互、上下文感知、信任构建摘要:当ChatGPT用自然对话帮你写周报,当Midjourney根据只言片语生成…

springclouded集成nacos3读取不到nacos配置

起因是今天写毕设,通过nacos配置DataSourece时,发现微服务启动报错没找到url。但是放本地又能正常启动,因为这个问题导致我折腾半天。没想到实际却很简单。 在nacos服务上的配置文件的data-id没有文件后缀名(图1)…

【多式联运】基于AFO算法、GA和PSO算法求解不确定多式联运路径优化问题,同时和MATLAB自带的全局优化搜索器进行对比附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

C#多线程编程03-异步编程

1、多线程编程侧重于分而治之的方面,异步编程同样是多线程编程但是侧重于将长时间运行的任务卸载,其强调了有任务在主线程之外运行的情况2、多线程编程通常用于CPU密集型操作,异步编程特别适用于I/O密集型操作:大多…

【多输入多输出(MIMO)干扰网络的能效优化】基于采用迭代半定规划-加权最小均方误差(SDP-WMMSE)算法与逐次凸逼近(SCA)算法求解MIMO干扰无线网络的能效优化问题研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

Unity 鼠标控制 API 技术文档

成员 类型 说明Cursor.visible bool 控制鼠标指针是否可见。true 表示显示,false 表示隐藏。Cursor.lockState CursorLockMode 控制鼠标指针的锁定状态。Cursor.SetCursor(Texture2D texture, Vector2 hotspot, Curso…

【多无人机】面向并行数据采集的多无人机粗粒度闭环轨迹设计无人机检测研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

【多无人机】面向城市空中交通的多无人机路径规划研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

导师推荐8个AI论文写作软件,助你轻松搞定本科论文!

导师推荐8个AI论文写作软件,助你轻松搞定本科论文! AI 工具让论文写作不再难 在当今信息爆炸的时代,本科生们面对的不仅是繁重的课程压力,还有论文写作这一道“硬关”。无论是开题报告、文献综述还是最终的毕业论文,都…

揭秘提示工程架构师在智能作曲的实用应用技巧

提示工程架构师的智能作曲手册:用文字“编写”音乐的10个实用技巧 关键词 提示工程、智能作曲、大语言模型(LLM)、音乐生成、Prompt设计、上下文锚点、风格迁移 摘要 凌晨三点,短视频导演小王盯着电脑里的素材——老人摸着旧书店的…

用户态网络栈:DPDK 入门实战,绕过 Linux 内核实现“零拷贝”收发包

标签: #DPDK #NetworkProgramming #C #LinuxKernel #HighPerformance #ZeroCopy🐢 前言:Linux 内核为何成了瓶颈? 在传统的网络路径中,数据包的旅程是漫长而曲折的: 硬件中断:网卡收到包 -> …

Android 脱壳实战:Frida 脚本 Hook dlopen,在内存中 dump 出被加固的 DEX 文件

标签: #AndroidReverse #Frida #脱壳 #MobileSecurity #Hook #DEX ⚠️ 免责声明:本文仅供技术研究与安全防御教学使用。请勿将相关技术用于非法破解、制作外挂或破坏商业软件,否则后果自负。📉 前言:脱壳的核心原理—…

导师严选2026 TOP8一键生成论文工具:专科生毕业论文必备测评

导师严选2026 TOP8一键生成论文工具:专科生毕业论文必备测评 2026年专科生论文写作工具测评:如何选择真正实用的助手 随着高校对论文质量要求的不断提升,专科生在毕业论文写作过程中面临的挑战也日益增加。从选题构思到文献检索,从…

【无人机通信】无人机 - 电力线宽带同步算法,该算法借助农场现有的电网基础设施,实现经济高效、可扩展的数据采集附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &#…

基于Java的家政行业智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 家政行业智慧管理系统的设计与实现结合了丰富的功能模块和先进的技术框架,旨在为家政企业提供全面的信息化管理解决方案。系统主要包含21个子模块:家政人员、客户、服务项目、薪资记录等,并通过SpringM…

Chet.QuartzNet.UI 分析页重构,数据可视化体验升级!

🔥 Chet.QuartzNet.UI 分析页重构,数据可视化体验升级! 🎯 为什么要重构分析页? 之前的分析页虽然能展示数据,但界面不够直观,数据展示形式单一,用户体验有待提升。为了让开发者能…

Java广播 —如何利用广播做服务发现

通过广播可以在局域网内广播信息,广播接收端通过监听广播信息,可以自动发现局域网内所有的设备/服务信息。 1. 发送广播 在 Java 中通过将 DatagramSocket 设置 setBroadcast(true) 来发送广播。 DatagramSocket socket new DatagramSocket(); socket…

WPF 使用 HLSL #x2B; Clip 实现高亮歌词光照效果

最近在搓一个Lyricify Lite类似物,原本使用渐变画刷实现歌词高亮,但是发现视觉效果与Apple Music相去甚远:单纯使用白色渐变画刷缺乏“高亮”的光照感觉,而Apple Music的歌词高亮则更像是有光线投射在歌词上,形成一种柔…

java controller的DTO如果有内部类,应该注意什么

在Java Controller中使用带有内部类的DTO时,需要注意以下关键点:1. 内部类必须是静态的(static)// ✅ 正确做法 public class UserDTO {private String name;private Address address;public static class Address { // 必须是st…

Nano Banana AI 绘画创作前端代码(使用claude code编写)

在线 https://chat.xutongbao.top/nextjs/light/nano use clientimport Header from /components/header import {ArrowLeft,Send,RefreshCw,Sparkles,Upload,X,Download,Copy,Check,ImagePlus,Maximize2, } from lucide-react import { useRouter } from next/navigation imp…