吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1681|回复: 1
收起左侧

[经验求助] 关于CE寻找unity开发的端游MOMO框架函数基址的问题

[复制链接]
木有海鲜 发表于 2025-1-16 14:11
25吾爱币
本帖最后由 木有海鲜 于 2025-1-21 20:13 编辑


如图,因为unity引擎开发的端游,momo打包的。所以,直接查看Assembly-CSharp,找到对应的函数,CardOpeningSequence方法,该方法在内存中的地址是动态的,每次退出重新登录之后就找不到了。故应该如何寻找基址。
尝试过,指针扫描和地址寻找,都发现是固定偏移,但是CardOpeningSequence方法的地址是变的。
希望广大网友可以提供思路或者解决办法,不胜感激!!!
游戏是TCG卡片商店模拟器


本人问题已经解决。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

langzqf 发表于 2025-8-12 23:08
你的问题涉及到Unity游戏的逆向分析,特别是动态内存地址的基址定位问题。由于 CardOpeningSequence 方法的地址每次启动都会变化(因为Unity的Mono/IL2CPP运行时动态加载代码),传统的指针扫描可能无法直接找到稳定的基址。以下是几种可行的解决方案和思路:

 

1. 静态分析:通过反编译Assembly-CSharp.dll

适用场景

游戏使用Mono后端(非IL2CPP),且未进行混淆。
你可以直接反编译 Assembly-CSharp.dll ,找到 CardOpeningSequence 的IL代码或C#伪代码。

步骤

1. 提取Assembly-CSharp.dll
使用 UnityExplorer 或 AssetStudio 解包游戏资源,找到 Managed/Assembly-CSharp.dll 。
用 dnSpy 或 ILSpy 打开它,搜索 CardOpeningSequence 方法。
2. 分析调用链
找到调用 CardOpeningSequence 的类(例如 CardShopManager 或 GameController )。
如果这个方法是通过事件或委托触发的,可能需要跟踪事件订阅逻辑。
3. 定位关键偏移
如果方法属于某个类的成员函数,可以尝试找到该类的实例指针( this 指针),然后通过 this + 偏移 访问方法。

 

2. 动态分析:Hook Mono/IL2CPP函数

适用场景

游戏使用Mono或IL2CPP,但你需要动态拦截 CardOpeningSequence 的调用。
你可以使用 BepInEx 、 HarmonyX 或 MelonLoader 进行运行时Hook。

步骤(以Mono为例)

1. 安装BepInEx
将 BepInEx 注入游戏,确保能加载插件。
2. 用HarmonyX Hook方法

using HarmonyLib;
using UnityEngine;

[HarmonyPatch(typeof(CardShop), "CardOpeningSequence")]
class CardOpeningSequenceHook {
    static bool Prefix(CardShop __instance) {
        Debug.Log("CardOpeningSequence called!");
        // 修改参数或阻止原方法执行
        return true; // true=继续执行原方法, false=拦截
    }
}
3. 获取实例地址
在Hook里打印 __instance ( this 指针),观察是否每次调用都是同一个对象。
如果是,可以用 指针扫描 追踪该对象的基址。

 

3. 基址定位:通过特征码或RTTI(适用于IL2CPP)

适用场景

游戏使用IL2CPP,方法地址完全动态,但类结构固定。
你可以扫描内存,找到包含 CardOpeningSequence 的类虚函数表(vTable)。

步骤

1. 用Cheat Engine附加游戏
找到 CardOpeningSequence 的临时地址,记录它。
2. 分析vTable结构
在 dnSpy 里查看 CardShop 类的虚方法表,计算 CardOpeningSequence 的偏移(如第5个函数)。
用CE搜索 CardShop 实例,找到它的 vTable 指针。
3. 构建指针链
可能的稳定基址路径:
GameManager -> CardShopManager -> CardShop实例 -> vTable -> CardOpeningSequence
用 指针扫描 + 偏移 找到稳定的基址。

 

4. 替代方案:日志注入 + 动态分析

适用场景

如果无法直接Hook或反编译,可以尝试让游戏自己告诉你关键数据。

步骤

1. 修改游戏日志
用 dnSpy 编辑 Assembly-CSharp.dll ,在 CardOpeningSequence 里添加 Debug.Log :
Debug.Log($"CardOpeningSequence called! this={this.GetInstanceID()}");
重新打包游戏,运行后观察日志,找到 this 指针的规律。
2. 结合CE搜索
用日志输出的 this 值,在CE里搜索 CardShop 实例,再追踪基址。

 

5. 终极方案:IL2CPP Dumper + 符号恢复

适用场景

游戏使用IL2CPP,且符号被剥离,但你想恢复类名和方法名。

步骤

1. 使用Il2CppDumper
提取 global-metadata.dat 和 GameAssembly.dll ,运行 Il2CppDumper 恢复符号。
得到 script.json ,里面会有 CardOpeningSequence 的偏移信息。
2. 用IDA/Ghidra分析
结合 script.json 在IDA里定位 CardOpeningSequence 的汇编代码,分析调用约定。

 

总结

方法                          适用场景                   难度            稳定性
静态分析(dnSpy) Mono未混淆         ⭐⭐               高
动态Hook(BepInEx) Mono/IL2CPP ⭐⭐⭐          中
vTable扫描(CE)      IL2CPP                ⭐⭐⭐⭐      中
日志注入          无法Hook时                      ⭐⭐                低
IL2CPP Dumper IL2CPP无符号            ⭐⭐⭐⭐⭐ 高

推荐方案

1. 先用dnSpy反编译,确认 CardOpeningSequence 的归属类和调用逻辑。
2. 尝试HarmonyX Hook,动态获取 this 指针。
3. 如果游戏是IL2CPP,用 Il2CppDumper 恢复符号,再结合CE找vTable基址。

如果你能提供更多信息(如游戏是Mono还是IL2CPP、是否有Anti-Cheat等),我可以给出更具体的方案! 🚀
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-9-18 04:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表