axhlzy / Il2CppHookScripts

frida-based libil2cpp.so runtime parsing script
MIT License
530 stars 167 forks source link

byte[]参数如何获取和修改 #14

Closed xavieryang007 closed 3 years ago

xavieryang007 commented 3 years ago

U3D函数参数是byte[] 应该如何hook查看和修改

axhlzy commented 3 years ago

使用b (methodinfo)解析出来的 byte[] 会带出 byte所属 class 指针( 或者是使用 findClass()去找到cls),再用m(class) 可以查看该class下面的方法,最后用callFunction(functionPtr,args....) 去调用拿值 至于byte具体要怎么改 你可以用 hexdumpA(mptr) 去读内存,Memory.writeByteArray 去写内存

xavieryang007 commented 3 years ago

我试试 多谢

xavieryang007 commented 3 years ago

我测试了上述方法,不过觉得这样查询一个值需要嵌套太多次查询。

struct System_Byte_array {
    Il2CppObject obj;
    Il2CppArrayBounds *bounds;
    il2cpp_array_size_t max_length;
    uint8_t m_Items[65535];
};

struct Il2CppClass;

struct Il2CppObject
{
    Il2CppClass *klass; 
    void *monitor; 
};

typedef uintptr_t il2cpp_array_size_t;
typedef int32_t il2cpp_array_lower_bound_t;
struct Il2CppArrayBounds
{
    il2cpp_array_size_t length; 
    il2cpp_array_lower_bound_t lower_bound; 
};

可以看到byte[] 对应结构体System_Byte_array ,那么byte的长度为max_length,数据存放在m_Items当中,

当我获取到参数byte[],那么该地址我偏移一定地址之后不就应该获取到max_length么,这里有些不懂,因为获取到的是类的地址,和这个结构体如何关联

xavieryang007 commented 3 years ago
struct Il2CppClass;

struct Il2CppObject
{
    Il2CppClass *klass; 1
    void *monitor; 4
};

typedef uintptr_t il2cpp_array_size_t;
typedef int32_t il2cpp_array_lower_bound_t;
struct Il2CppArrayBounds
{
    il2cpp_array_size_t length; 4
    il2cpp_array_lower_bound_t lower_bound; 2
};

如果我偏移11个字节,获取到的仍然不是max_length,这块比较迷糊

xavieryang007 commented 3 years ago

通过IDA发现,byte[]的长度是基址偏移24

axhlzy commented 3 years ago

通过IDA发现,byte[]的长度是基址偏移24

那意思是 64位 你把它当成32位再看?

HimekoEx commented 2 years ago

数组([])类型就是Il2cppArray,直接拿来用就行了

话说你这个脚本写的好杂啊...看不懂@axhlzy