一个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找错函数地址了吗?这种动态的有没有办法找到真实的地址?
|