吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1532|回复: 0
收起左侧

[求助] il2cpp游戏使用frida-il2cpp-bridge无法hook

[复制链接]
fatkun 发表于 2025-8-21 17:38
一个windows的unity il2cpp的游戏,使用Cpp2IL无法获取全部dll,但是通过frida-il2cpp-bridge启动游戏后,可以dump出来。这里dump出来有些奇怪,这几个方法的地址都是一样的,实际上后面看到他们不是同一个方法。

// Assembly-CSharp
class SDKManager : X.Singleton<SDKManager>
{

    System.Void UseACoin2BCoin(System.Int32 a, System.String t, System.Int32 n); // 0x002ab330
    System.Void UseACoin(System.Int32 a, System.String t, System.Int32 n); // 0x002ab330
    System.Void UseBCoin(System.Int32 b, System.String t, System.Int32 n); // 0x002ab330
}

不过我想hook这个方法却没办法
[JavaScript] 纯文本查看 复制代码
    const  Assembly = Il2Cpp.domain.assembly("Assembly-CSharp").image;
    Il2Cpp.trace().classes(Assembly.class("SDKManager")).and().attach();

    let useACoinMethod = Il2Cpp.domain.assembly("Assembly-CSharp").image.class("SDKManager").method("UseACoin");
    Interceptor.attach(useACoinMethod.virtualAddress, {
        onEnter(args) {
            // args[0] 是 'this'(实例指针),args[1+] 是参数
            console.log("[*] Entering SDKManager.UseACoin()");
            console.log("  - this: " + args[0].toString());
            // 如果有参数,例如假设第一个参数是 int:console.log("  - arg1: " + args[1].toInt32());
            // 可修改参数:args[1] = ptr(999); // 示例:修改参数为 999
        },
        onLeave(retval) {
            // retval 是返回值
            console.log("[*] Leaving SDKManager.UseACoin()");
            console.log("  - Return value: " + retval.toString());
            // 可修改返回值:retval.replace(ptr(1)); // 示例:强制返回 true
        }
        });


我能确定这个方法是被调用的,因为我hook网络请求,打印backtrace有调用这个方法。
我怀疑是frida-il2cpp-bridge没找对地址,像这种怎么找到方法的地址?

我后面发现有个LoadDll方法,它是动态加载DLL的方式,而且dll还不加密

[C#] 纯文本查看 复制代码
private IEnumerator LoadLocalDll(Action cb = null)
{
	foreach (string asset in LoadDll.AssemblyFiles)
	{
		string text = this.localDllFolder + "/" + asset;
		if (!text.Contains("://"))
		{
			text = "file://" + text;
		}
		LoadDll.glog("start local asset:" + text);
		UnityWebRequest www = UnityWebRequest.Get(text);
		yield return www.SendWebRequest();
		if (www.result != 1)
		{
			Debug.LogError("Load local dll fail:" + www.error);
		}
		else
		{
			byte[] data = www.downloadHandler.data;
			LoadDll.glog(string.Format("local dll:{0}  size:{1}", asset, data.Length));
			LoadDll.s_assetDatas.set_Item(asset, data);
		}
		www = null;
		asset = null;
	}
	List<string>.Enumerator enumerator = default(List<string>.Enumerator);
	if (cb != null)
	{
		cb();
	}
	yield break;
	yield break;
}


为什么这种加载方式没法hook方法?是因为frida-il2cpp-bridge找错函数地址了吗?这种动态的有没有办法找到真实的地址?

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

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2026-8-7 14:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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