当前位置: 首页 > article >正文

从注入到调用:一个完整的Unity il2cpp运行时Hook实战指南(附C++代码)

从注入到调用一个完整的Unity il2cpp运行时Hook实战指南附C代码在游戏开发与逆向工程领域Unity引擎的il2cpp后端因其性能优势被广泛采用但也带来了动态分析的独特挑战。本文将深入探讨如何通过运行时注入技术实现对il2cpp编译后应用的精准控制——从定位内存结构到重定向关键函数调用整个过程就像在黑暗森林中搭建一座可控制的桥梁。1. 理解il2cpp运行时架构il2cpp并非简单的C#到C的转译器而是一个完整的AOTAhead-Of-Time编译系统。当选择il2cpp后端时Unity会执行以下转换流程C#源码 → IL中间码 → C代码 → 原生机器码关键组件构成GameAssembly.dll/libil2cpp.so核心运行时库包含转换后的游戏逻辑global-metadata.dat保存类型系统映射关系的元数据仓库导出函数表提供运行时反射能力的API接口典型内存布局特征内存区域内容描述访问方式代码段编译后的机器指令函数指针调用元数据段类型系统结构体API查询指针解析动态内存区实例对象与运行时数据指针追踪偏移计算注意不同Unity版本中il2cpp内部结构体可能存在字段偏移差异实战中需结合具体版本验证。2. 注入环境的精密准备2.1 动态链接库注入方案Windows平台推荐采用经典的DLL注入技术// 基础注入器示例需管理员权限 HANDLE hProcess OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetPID); LPVOID pMem VirtualAllocEx(hProcess, NULL, dllPath.size(), MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(hProcess, pMem, dllPath.c_str(), dllPath.size(), NULL); HANDLE hThread CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(kernel32), LoadLibraryA), pMem, 0, NULL);Android平台则需要结合ptrace或LD_PRELOAD技术这里展示一个dlopen的替代方案# 在注入器中执行 adb push injector /data/local/tmp adb push libhook.so /data/local/tmp adb shell chmod x /data/local/tmp/injector adb shell /data/local/tmp/injector com.game.package2.2 运行时API定位策略il2cpp的导出函数通常包含版本特征可通过模式匹配动态定位// 动态获取API函数指针示例 auto il2cpp_resolve_export(const char* pattern) { HMODULE base GetModuleHandle(GameAssembly); IMAGE_NT_HEADERS* nt (IMAGE_NT_HEADERS*)((BYTE*)base ((IMAGE_DOS_HEADER*)base)-e_lfanew); IMAGE_EXPORT_DIRECTORY* exports (IMAGE_EXPORT_DIRECTORY*)((BYTE*)base nt-OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); DWORD* names (DWORD*)((BYTE*)base exports-AddressOfNames); for(DWORD i 0; i exports-NumberOfNames; i) { const char* name (const char*)base names[i]; if(strstr(name, pattern)) { return (void*)((BYTE*)base ((DWORD*)((BYTE*)base exports-AddressOfFunctions))[i]); } } return nullptr; }3. 元数据导航与类型定位3.1 程序集加载与类查询通过三级跳转完成类方法定位// 典型查询路径示例 auto domain il2cpp_domain_get(); auto assembly il2cpp_domain_assembly_open(domain, Assembly-CSharp); auto image il2cpp_assembly_get_image(assembly); auto targetClass il2cpp_class_from_name(image, , PlayerController);关键结构体关系图Il2CppDomain → Il2CppAssembly → Il2CppImage → Il2CppClass → MethodInfo3.2 方法签名处理技巧il2cpp方法调用存在隐式this指针参数需要特殊处理// 方法Hook前后对比 Original: int Player_GetHealth(Player* this) { return this-health; } il2cpp转换后: int Player_GetHealth(Player* this, void* unused) { return this-health; } // 因此调用时需 typedef int (*Player_GetHealth_t)(Player*, void*); auto original (Player_GetHealth_t)method-methodPointer; int health original(playerInstance, nullptr);4. 实战Hook实现方案4.1 虚函数表替换技术对于虚方法可采用直接修改vtable的方案void hook_virtual_method(Il2CppClass* klass, const char* name, void* newFunc) { for(uint16_t i 0; i klass-vtable_count; i) { if(strcmp(klass-vtable[i].method-name, name) 0) { DWORD oldProtect; VirtualProtect(klass-vtable[i].methodPtr, sizeof(void*), PAGE_READWRITE, oldProtect); klass-vtable[i].methodPtr newFunc; VirtualProtect(klass-vtable[i].methodPtr, sizeof(void*), oldProtect, oldProtect); break; } } }4.2 机器码级Hook方案更通用的指令跳转方案x64平台示例#pragma pack(push, 1) struct JmpCode { uint8_t opcode 0xE9; uint32_t offset; }; #pragma pack(pop) void install_detour(void* original, void* hook) { JmpCode jmp; jmp.offset (uint32_t)((BYTE*)hook - (BYTE*)original - sizeof(JmpCode)); DWORD oldProtect; VirtualProtect(original, sizeof(JmpCode), PAGE_EXECUTE_READWRITE, oldProtect); memcpy(original, jmp, sizeof(JmpCode)); VirtualProtect(original, sizeof(JmpCode), oldProtect, oldProtect); }4.3 上下文保存与恢复安全的Hook实现应保存原始上下文// 典型Hook代理函数 __declspec(naked) void HookProxy() { __asm { pushad pushfd // 自定义处理逻辑 call [g_customHandler] popfd popad // 跳回原函数或替代逻辑 jmp [g_originalFunc] } }5. 高级调试技巧与异常处理5.1 元数据校验绕过当遇到元数据加密时可采用动态重建策略Il2CppClass* safe_get_class(const char* name) { static std::unordered_mapstd::string, Il2CppClass* cache; if(auto it cache.find(name); it ! cache.end()) return it-second; auto klass il2cpp_class_from_name(/*...*/); if(!klass) { // 尝试通过特征码扫描定位类实例 uintptr_t classPtr scan_memory_for_class(name); if(classPtr) { klass reinterpret_castIl2CppClass*(classPtr); // 手动填充必要字段 klass-name strdup(name); } } cache[name] klass; return klass; }5.2 线程安全防护措施多线程环境下的Hook操作需要同步机制std::recursive_mutex g_hookMutex; void thread_safe_hook() { std::lock_guardstd::recursive_mutex lock(g_hookMutex); suspend_all_threads(); // 执行Hook操作 resume_all_threads(); }6. 实战案例属性修改器实现完整工作流程示例// 1. 注入初始化 void on_attach() { auto playerClass il2cpp_class_from_name(/*...*/, Player); auto healthProp il2cpp_class_get_property_from_name(playerClass, Health); // 2. 获取原始存取器 auto getter il2cpp_property_get_get_method(healthProp); auto setter il2cpp_property_get_set_method(healthProp); // 3. 安装Hook g_originalGet getter-methodPointer; install_detour(g_originalGet, hooked_getter); // 4. 持久化监控 create_mod_thread(); }典型问题排查表现象可能原因解决方案注入后立即崩溃版本不匹配验证Unity版本和偏移量调用时参数错乱this指针处理错误检查调用约定和参数数量部分功能失效元数据混淆采用动态特征码定位多线程环境下崩溃竞态条件添加线程同步机制在实际项目中我发现最有效的调试方式是结合Cheat Engine的内存扫描与IL2CPP Dumper的输出交叉验证。例如当Hook一个玩家移动方法时可以先用CE定位速度变量的内存地址再通过反推访问路径来确定需要拦截的类方法。

相关文章:

从注入到调用:一个完整的Unity il2cpp运行时Hook实战指南(附C++代码)

从注入到调用:一个完整的Unity il2cpp运行时Hook实战指南(附C代码) 在游戏开发与逆向工程领域,Unity引擎的il2cpp后端因其性能优势被广泛采用,但也带来了动态分析的独特挑战。本文将深入探讨如何通过运行时注入技术&am…...

UE5新手教程:给你的游戏加个“道具栏”,实现鼠标拖拽放置物品功能

UE5道具栏系统开发指南:从拖拽交互到场景放置全流程 在独立游戏开发中,道具栏系统是连接玩家与游戏世界的核心交互界面。无论是《我的世界》式的物品建造,还是RTS游戏的单位部署,流畅的拖拽放置体验直接影响游戏品质。本文将完整演…...

PHP安全实战:利用phar://协议和.htaccess绕过实现文件上传漏洞的几种高级玩法

PHP安全实战:深入剖析phar协议与.htaccess的高级攻击手法 1. 从CTF到实战:理解PHP协议处理机制的潜在风险 在2019年D3CTF的EzUpload赛题中,一道看似简单的文件上传漏洞背后,隐藏着PHP协议处理机制的深层安全问题。这道题目不仅考察…...

CAD_Sketcher:让Blender设计师从“手绘思维“升级到“工程思维“的智能约束系统

CAD_Sketcher:让Blender设计师从"手绘思维"升级到"工程思维"的智能约束系统 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher 你是否曾在Blen…...

5分钟在Windows 10上畅玩安卓应用:WSA反向移植完全指南

5分钟在Windows 10上畅玩安卓应用:WSA反向移植完全指南 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 还在羡慕Windows 11用户能直接…...

YetAnotherKeyDisplayer:实时按键可视化创新方案提升操作透明度

YetAnotherKeyDisplayer:实时按键可视化创新方案提升操作透明度 【免费下载链接】YetAnotherKeyDisplayer App for displaying pressed keys of the keyboard 项目地址: https://gitcode.com/gh_mirrors/ye/YetAnotherKeyDisplayer 在游戏直播、软件教学和演…...

2026年企业项目管理软件推荐:8款适合产研测协同的平台

本文将深入对比8款适合产品、研发、测试协同的项目管理软件:PingCode、Worktile、Jira Confluence、Azure DevOps、GitLab、ClickUp、monday dev、Asana。一、企业为什么需要产品、研发、测试协同型项目管理软件1、很多团队的问题,不是没有工具&#xf…...

私有化项目管理平台怎么选?8类方案优劣势全解读

本文将深入对比8类私有化项目管理方案:PingCode、Worktile、Jira Confluence、GitLab Self-Managed、OpenProject、Redmine、Taiga、Tuleap。一、企业为什么还在持续选择私有化项目管理系统1、项目管理系统已经从“工具”变成了“管理底座”企业早期选项目管理工具…...

怎样用3步完成QQ空间数据备份:GetQzonehistory实用工具指南

怎样用3步完成QQ空间数据备份:GetQzonehistory实用工具指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里那些珍贵的青春记忆会随着时间流逝而消失&…...

PiliPlus:如何用一款跨平台B站客户端实现全设备无缝追番体验

PiliPlus:如何用一款跨平台B站客户端实现全设备无缝追番体验 【免费下载链接】PiliPlus PiliPlus 项目地址: https://gitcode.com/gh_mirrors/pi/PiliPlus 想要在手机、平板、电脑上都能流畅观看B站内容吗?PiliPlus作为一款基于Flutter开发的开源…...

Python3 模块精讲|python-docx 万字实战:全自动读写 Word 文档,办公效率直接翻倍

文章标签:#Python #python-docx #办公自动化 #Word 处理 #Python 实战 📝 本章学习目标:本章聚焦 Python 办公自动化最强刚需技能,帮助读者从零到一完全掌握python-docx模块的创建、读取、修改、样式、表格、图片、批量生成等全套…...

PPTAgent智能体框架:基于反思机制的自动化PPT生成技术解析

1. PPTAgent:一个能“思考”的PPT生成智能体框架深度解析做PPT这件事,估计是很多职场人、学生和研究人员的“痛点”。从构思大纲、搜集资料、撰写内容,到排版设计、寻找配图,一套流程下来,少则几小时,多则一…...

告别电脑轰鸣声:FanControl中文版让你的电脑安静如图书馆

告别电脑轰鸣声:FanControl中文版让你的电脑安静如图书馆 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

Chrome 0-Day危机:WebGPU时代的首个致命漏洞与全球安全防线崩塌

引言:CVE-2026-5281深度解析与GPU计算时代的浏览器安全重构 2026年4月2日,美国网络安全和基础设施安全局(CISA)发布红色紧急警告,要求所有联邦机构在24小时内完成Google Chrome浏览器的紧急更新。这一不同寻常的指令源…...

Python数据分析教程

Python数据分析教程 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。 项目地址: https://gitcode.com/gh…...

GIPC(处理器间通信) - 多核的桥梁:剖析硬件队列、门铃中断与共享内存的数据一致性困局

该文章同步至OneChan 当多个核心需要高效协同,硬件队列、门铃中断和共享内存如何构建无锁通信的桥梁,又如何在数据一致性、延迟和吞吐量之间艰难平衡? 导火索:一个多核系统中的处理器间通信性能瓶颈 在一个异构多核系统中&…...

多模态Agent:从文本到图像、语音的全能进化

多模态Agent:从文本到图像、语音的全能进化 引入与连接 你有没有过这样的经历:电脑突然蓝屏,你手忙脚乱拍了照片,发给技术朋友求助,还要费劲打字描述蓝屏前的操作;给孩子讲数学题,孩子指着练习册上的图形题说听不懂,你要绞尽脑汁把图形转化成文字,再找合适的例子解释…...

未来 5 年 AI Agent Harness Engineering 技术发展路线图预测

未来 5 年 AI Agent Harness Engineering 技术发展路线图预测1. 引入与连接:从“工具链运维”到“超级智慧体牧场主”——你的下一个职业赛道正在解锁 核心概念预览 在正式展开前,我们先通过一组通俗直观的“牧场主-工具链-牲畜链”类比框架,…...

MCP 2026调度策略迁移避坑指南,12个生产环境血泪案例(含某TOP3云厂商未公开故障复盘)

更多请点击: https://intelliparadigm.com 第一章:MCP 2026调度策略迁移的底层逻辑与演进全景 MCP(Multi-Cluster Policy)2026调度策略并非简单配置升级,而是面向异构算力联邦、跨云服务网格与实时SLA保障的范式重构。…...

VS Code远程容器开发环境配置避坑清单:97%开发者踩过的5大配置陷阱及修复代码

更多请点击: https://intelliparadigm.com 第一章:VS Code远程容器开发环境配置避坑总览 核心依赖与前置检查 在启用 VS Code 的 Dev Containers 功能前,必须确保本地已安装 Docker Desktop(v4.18)并启用 WSL2 后端&…...

远程开发环境冷启动从47s到≤3s,全链路优化实战,含Docker Compose缓存策略、devcontainer.json深度配置与GPU直通配置

更多请点击: https://intelliparadigm.com 第一章:远程开发环境冷启动性能瓶颈全景分析 远程开发环境的冷启动延迟是影响开发者首次编码体验的关键障碍。当开发者从零拉起一个云端 IDE 实例(如 VS Code Server、Gitpod 或 JetBrains Space&a…...

深度学习核心技术解析:从神经网络到AI应用实践

1. 深度学习:从神经网络到人工智能革命2006年,多伦多大学教授Geoffrey Hinton在《Science》杂志上发表了一篇关于深度信念网络的论文,这个看似普通的学术事件却意外点燃了人工智能的第三次浪潮。当时很少有人能预料到,这个被称为&…...

3个理由告诉你为什么gifuct-js是现代前端GIF处理的最佳选择

3个理由告诉你为什么gifuct-js是现代前端GIF处理的最佳选择 【免费下载链接】gifuct-js Fastest javascript .GIF decoder/parser 项目地址: https://gitcode.com/gh_mirrors/gi/gifuct-js 你是否曾经在前端项目中处理GIF动图时感到头疼?加载缓慢、内存占用高…...

Minion框架深度解析:高性能AI智能体开发实战指南

1. 项目概述:一个能“包办一切”的高性能AI智能体框架如果你最近在折腾AI智能体,想找一个既灵活又强大的框架来构建自己的AI助手,那你可能已经听说过Minion这个名字了。它给自己的定位是“能做任何事情的高性能智能体框架”,这话听…...

ControlFlow:构建可控可观测AI工作流的Python框架实践

1. 项目概述:从“黑盒”到“白盒”的AI工作流革命如果你和我一样,在过去一年里尝试过用大语言模型(LLM)构建自动化应用,大概率经历过这样的挫败:你写了一段提示词,扔给GPT,它返回了一…...

R语言caret包:机器学习建模的统一接口与实战技巧

1. Caret包:R语言中的机器学习瑞士军刀在数据科学和统计建模领域,R语言长期占据着不可替代的地位。作为一名使用R进行预测建模的实践者,我深刻体会到选择合适的工具对工作效率的影响。在众多R包中,caret(Classificatio…...

视频修复终极指南:用Untrunc高效恢复损坏的MP4/MOV文件

视频修复终极指南:用Untrunc高效恢复损坏的MP4/MOV文件 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 视频文件修复和MP4视频恢复是每个数码用户都可能…...

轻松搞定文件压缩:7-Zip新手完全入门指南

轻松搞定文件压缩:7-Zip新手完全入门指南 【免费下载链接】7z 7-Zip Official Chinese Simplified Repository (Homepage and 7z Extra package) 项目地址: https://gitcode.com/gh_mirrors/7z1/7z 你是不是经常遇到这样的情况?电脑硬盘空间告急&…...

如何在Blender中实现CAD级精确建模:CAD_Sketcher完全指南

如何在Blender中实现CAD级精确建模:CAD_Sketcher完全指南 【免费下载链接】CAD_Sketcher Constraint-based geometry sketcher for blender 项目地址: https://gitcode.com/gh_mirrors/ca/CAD_Sketcher 你是否曾在Blender中绘制精确尺寸的机械零件时感到力不…...

红牌作战是什么?红牌作战的实施步骤与核心要点

很多工厂推行5S时都遇到过“整治—反弹”的死循环,这时候就需要红牌作战来破局。红牌作战是什么?简单来说,红牌作战就是利用醒目的红色标签,将现场不符合标准的问题点标识出来,并明确责任人和整改期限,强制…...