首页
社区
课程
招聘
[原创]frida-il2cpp-bridge使用
发表于: 2025-2-22 17:21 6181

[原创]frida-il2cpp-bridge使用

2025-2-22 17:21
6181

关于附加/改写/使用/原理

图片描述
我:这是原理
图片描述
我:这是案例,接下来我给你一个BuildCSMsg的原型
图片描述
图片描述
我:你这个拿到的附加是不打印object内容的是吧
我:例如返回对象是类
我:或者 参数是类 他是不打印的

图片描述
他:对 得到的是这样的

我:还是这个函数原型
图片描述
我:他是这样的 返回值的net.CSPkg。是一个类 那么就不会打印。
我:所以我们要重写这个方法。
图片描述
我:再给你看一下net.CSPkg的原型
图片描述
我:假如不想一个个去对比字段,那我们该怎么拿到全部字段名称
图片描述

他:有点困难了。
我:根据类型判断啊。value = 某Obj.field('name').vue

他:如果是这种,ecm是一个枚举类型。system.object 是obj
图片描述
他:这样写,为什么连参数都没打印呢
图片描述

我:打印一下方法是否拿到了
图片描述

他:确实可以
图片描述

他:怪了,又不给输出了。
图片描述

我:那就是没走这个函数?怎么确定走没走 附加整个类就行了
图片描述

他:太强了,哥。就是这个

关于万能打印函数

图片描述
图片描述
图片描述
我:所以不管get 还是 set 之后 你动能拿到当前实例的 有了当前实例
我:你就可以 this.method("set_x", 1).invoke(666);

他:就是这样。既然如此,我应该可以改这个数值,达到瞬移的效果。如果服务器没校验的话。
图片描述

他: 这个万能打印函数要放到哪里?这样嘛
图片描述

我:我是放到外层的
图片描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
 * 获取Il2Cpp的实例化对象的值
 *
 * @param objValue  对象
 * @returns     对象的值字符串
 */
function get2cppObjectValue(objValue: Il2Cpp.Object | Il2Cpp.ValueType | NativePointer): string {
    try {
        // 检查是否为空
        if (!objValue || objValue == null || objValue == undefined || typeof objValue != "object" || objValue.isNull()) {
            if (typeof objValue === "string") {
                return objValue;
            } else if (typeof objValue === "number") {
                return objValue;
            }
            return "";
        }
        // 如果是指针类型,那么转换成对象
        if (objValue instanceof NativePointer) {
            objValue = new Il2Cpp.Object(objValue);
            if (!objValue || objValue.isNull()) {
                return "";
            }
        }
        const clz = objValue instanceof Il2Cpp.Object ? objValue.class : objValue instanceof Il2Cpp.ValueType ? objValue.type.class : null;
        if (!clz || clz == null || clz == undefined || clz.isNull()) {
            return "";
        }
        // 最终字符串
        let jsonStr = "{" + "\"" + clz.name + "\":{";
        const readNativeIterator = (block) => {
            const array = [];
            const iterator = Memory.alloc(Process.pointerSize);
            let handle = block(iterator);
            while (!handle.isNull()) {
                array.push(handle);
                handle = block(iterator);
            }
            return array;
        }
        // 开始逐个字段获取值
        const fields = readNativeIterator(_ => Il2Cpp.api.classGetFields(clz.handle, _)).map(_ => new Il2Cpp.Field(_).withHolder(objValue))
        let lastNum = 0;
        fields.forEach((field: Il2Cpp.Field) => {
            const fieldName = field.name;
            const fieldType = field.type;
            const fieldValue = field.value;
            // 如果是空值,那么跳过
            if (fieldValue == null || fieldValue == undefined || (fieldValue instanceof Il2Cpp.Object && fieldValue.isNull())) {
                return;
            }
            // 如果是对象,那么递归获取
            if (fieldValue instanceof Il2Cpp.Object) {
                jsonStr += "\"" + fieldName + "\":" + get2cppObjectValue(fieldValue) + ",";
            }
            else if (fieldType.typeEnum == Il2Cpp.Type.enum.string) {
                jsonStr += "\"" + fieldName + "\":" + fieldValue + ",";
            } else if (fieldType.typeEnum == Il2Cpp.Type.enum.array) {
                jsonStr += "\"" + fieldName + "\":[";
                if (lastNum > 0) {
                    for (let i = 0; i < lastNum; i++) {
                        if (i >= fieldValue.length) {
                            break;
                        }
                        const value = fieldValue.get(i);
                        if (value == null || value == undefined || value.toString() == "null") {
                            continue;
                        }
                        jsonStr += get2cppObjectValue(value) + ",";
                    }
                    jsonStr = jsonStr.substring(0, jsonStr.length - 1);
                }
                jsonStr += "],";
            } else {
                if (typeof fieldValue === "number") {
                    lastNum = fieldValue;
                }
                if (fieldValue.toString() === "") {
                    jsonStr += "\"" + fieldName + "\":\"\",";
                } else {
                    // 如果是普通类型,那么直接获取值
                    jsonStr += "\"" + fieldName + "\":" + fieldValue + ",";
                }
 
            }
        });
        jsonStr = jsonStr.substring(0, jsonStr.length - 1);
        jsonStr += "}}";
        return jsonStr;
    } catch (e: any) {
        console.error("Il2CppMethod getObjectValue Error =>", e.stack);
    }
    return "";
};

他:牛逼 哥。真可以了。
图片描述

我:角色信息都有了,登录包都出来了,必是这个了 剩下的就是进ida分析代码了


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 4
支持
分享
最新回复 (7)
雪    币: 3333
活跃值: (4262)
能力值: ( LV5,RANK:61 )
在线值:
发帖
回帖
粉丝
2
早些看到了就不用那么辛苦捣鼓了,感谢大佬的付出
2025-2-22 20:14
0
雪    币: 104
活跃值: (5701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
66666666666
2025-2-23 12:08
0
雪    币: 2126
活跃值: (5457)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
我:咋没早点发现
2025-2-24 10:55
0
雪    币: 4676
活跃值: (5046)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
先收藏,慢慢学。
2025-2-24 12:46
0
雪    币: 29
活跃值: (1533)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个好
2025-2-24 18:24
0
雪    币: 102
活跃值: (2785)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
mark
2025-3-11 22:18
0
雪    币: 5
活跃值: (3010)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2025-3-28 18:02
0
游客
登录 | 注册 方可回帖
返回