首页
社区
课程
招聘
[原创]IL2CPP runtime dump
2022-11-14 14:03 10418

[原创]IL2CPP runtime dump

2022-11-14 14:03
10418

IL2CPP runtime dump

关键词:G*nshin、米忽悠

版本:3.2

该游戏的保护又升级了,围观一下安全性怎么样。

分析

一些il2cpp导出函数被隐藏掉了,现在只有两个

image-20221108193222302

很明显,il2cpp_get_api_table 第一个就是il2cpp_init。image-20221108195110137

对比未被修改的unity(隐藏了,但是几乎没隐藏)

根据分析il2cpp_class_from_name,可以看出mhy对Il2CppImage、class等内存结构进行了修改。


之前的版本内存结构没有太大变化,可以在SetupMethodsLocked下hook拿到的相关信息,但现在的SetupMethodsLocked实在是太乱了。毫无疑问,这里已经不适合去获取信息了。(此处的dlclose也十分异常

此时在il2cpp里面分析确实过于麻烦了,换个思路,il2cpp相关的api是需要unity调用的。所以unity里面的一些信息可以反推il2cpp的table表。


接下来就是体力活去对比一下未加密的unity.so分析,附上一些关键的函数(在unity.so里面):

附上frida代码:

let so = Process.findModuleByName("libil2cpp.so")
let il2cpp_method_get_name = new NativeFunction(so.base.add(0x4260354),'pointer',['pointer'])
let il2cpp_method_get_param = new NativeFunction(so.base.add(0x425FEC4),'pointer',['pointer','int'])
let il2cpp_method_get_return_type = new NativeFunction(so.base.add(0x42306EC),'pointer',['pointer'])

let il2cpp_class_from_type = new NativeFunction(so.base.add(0x4251ED8),'pointer',['pointer'])
let il2cpp_class_get_name  = new NativeFunction(so.base.add(0x4252E48),'pointer',['pointer'])



Interceptor.attach(so.base.add(0x4252BE4),{
    onEnter:function (args) {
        // console.log("---------il2cpp_class_get_methods--------")
        this.class = args[0]

    },
    onLeave:function (ret) {
        try{
            let classname = this.class.add(40).readPointer().readCString()
            let namespace = this.class.add(120).readPointer().readCString()
            let name_ptr = il2cpp_method_get_name(ret)
            let ret_type = il2cpp_method_get_return_type(ret)
            let ret_type_class = il2cpp_class_from_type(ret_type)
            let ret_class_name = il2cpp_class_get_name(ret_type_class)

            //InvokerMethod ret.add(16)  methodPointer ret
             let parameters_count = ret.add(50).readU8()
            let pstr = "("
            for(let idx = 0;idx<parameters_count;idx++){
                let param = il2cpp_method_get_param(ret,idx)
                let type = il2cpp_class_from_type(param)
                let typeName = il2cpp_class_get_name(type)
                pstr += ptr(typeName).readCString() + "  a"+idx +" ,"
            }
            pstr+=");"
            console.log("[*]"+ret.readPointer()+"   --> "+ptr(ret_class_name).readCString()+"  "+namespace+"."+classname+"."+ptr(name_ptr).readCString()+pstr)

        }catch (e) {
            console.log(e.toString())
        }

    }
})

一些获取到的信息,比如一些被处理过的符号信息:

一些sdk api:

一些unity的api:


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞4
打赏
分享
最新回复 (4)
雪    币: 1486
活跃值: (1990)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huluxia 2022-11-15 00:32
2
0
过了爱玩游戏的年纪,不然一定搞几个游戏试试楼主的教程。哈哈
雪    币: 1112
活跃值: (2634)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Amun 2022-11-16 14:34
3
1
和两年半之前某个单机手游的保护有点像,只能防一下静态分析。
雪    币: 4709
活跃值: (1544)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
如斯咩咩咩 2022-11-16 16:00
4
0
换汤不换药
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
744722817 2023-6-8 11:30
5
0
il2cpp这种破法通用性太差了
游客
登录 | 注册 方可回帖
返回