本文最后更新于 645 天前,其中的信息可能已经有所发展或是发生改变。
之前一直只用 frida 来打印 il2cpp 注入后的函数,今天遇到一个游戏,需要在 unity 层去注入lua,因为用的 xlua 框架,从 so 里面注入无法注入。
分析了一段时间后,可以从从 il2cpp_string_new 这个函数入手
const il2cpp = Module.findBaseAddress("libil2cpp.so");
const il2cpp_string_new = new NativeFunction(
il2cpp.add(ptr("0x143FE80")), // il2cpp_string_new 函数地址
"pointer",
["pointer", "int"]
);
function createString(str) {
const length = str.length;
const strPtr = Memory.allocUtf8String(str);
const strObj = il2cpp_string_new(strPtr, length);
return strObj;
}
const str = createString("Hello, World!");
console.log("String Object:", str);
上面的代码中,il2cpp_string_new
函数的地址需要根据实际情况进行修改。createString
函数用于构造 C# string 对象,其中 str
参数是要构造的字符串。在函数内部,使用 Memory.allocUtf8String
函数将字符串转换为 UTF-8 编码的字节数组,然后调用 il2cpp_string_new
函数构造 C# string 对象。
这个问题还算稍微麻烦一点,记录一下方便之后遇到,可以直接解决。
其实可以直接find 找到 il2cpp_string_new 的,并不需要通过偏移地址;因为偏移地址大概率每次都不一样
你说的没错, android 大部分可以直接通过 find 找到偏移,但是 部分机器可能 find 会有问题,而且 iOS 中无法 find,因为 iOS 的二进制都被去除了符号。
为了快速验证,一般建议直接用 偏移