• il2cpp分析-gobal-metadata.dat解密


    gobal-metadata.dat解密

    工具:010Editor,IDA 7.5,Jadx,VS Code
    样本Last Island of Survival_6.3_Apkpure.xapk

    分析Il2cpp文件

    打开ida,把libil2cpp拖到ida中按快捷键Shift+F12等待字符串分析完后,搜索global-metadata.dat
    在这里插入图片描述

    双击搜索出来的结果
    在这里插入图片描述

    点击aGlobalMetadata 然后按快捷键X查看引用
    在这里插入图片描述

    选中sub_57E558+3C 然后点击Ok跳转
    在这里插入图片描述

    按F5 查看伪代码
    在这里插入图片描述

    对比il2cpp源代码分析加密位置

    VSCode打开il2cpp源代码,全局搜索global-metadata.dat
    双击搜索出来的结果,切记要选il2cpp目录下的
    在这里插入图片描述

    对比源代码和伪代码
    在这里插入图片描述

    发现

    sub_57EE7C("global-metadata.dat");
    
    • 1

    就是

    vm::MetadataLoader::LoadMetadataFile("global-metadata.dat");
    
    • 1

    ida中双击sub_57EE7C进入,VS code中也跳转到LoadMetadataFile函数
    根据字符串特征ERROR: Could not open %s 定位到Open函数

    os::File::Open(resourceFilePath, kFileModeOpen, kFileAccessRead, kFileShareRead, kFileOptionsNone, &error);
    
    • 1

    在这里插入图片描述

    接着根据源码对比,找出加密位置
    在这里插入图片描述

    算法分析

    根据特征
    while
    v15 = 0;
    v16 = 0;
    v15++
    ^=
    判断加密逻辑为根据文件的长度循环读取字节码做亦或加密
    亦或值从dword_2A26E10中获取
    大致加密逻辑为

    int v15 = 0;
    while(v15<文件流大小){
    	文件流[v15]^=dword_2A26E10[(v15/0x32)%50]
    	v15++;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    还原算法
    import struct
    
    if __name__ == '__main__':
        f = open('global-metadata.dat', 'rb')
        a = ""
        a = f.read()
        key = [0xFE, 0x98, 0xAB, 0xDE, 0x99, 0x76, 0x36, 0x33, 0xBC,
               0xFE, 0xAB, 0x65, 0xAD, 0x61, 0x97, 0xBE, 0x89, 0xAB,
               0xA, 0x93, 0x98, 0x8A, 0x2D, 0x93, 0x23, 0xDF, 0xB3,
               0x35, 0xD, 0x32, 0x4D, 0xE2, 0xE8, 0xDB, 0xE, 0xAE,
               0x8E, 0x3D, 0xA, 0xE9, 0xA8, 0xE8, 0xEB, 0x38, 0xEF,
               0xBD, 0xE8, 0x9B, 0x39, 0xE9, 0, 0]
        with open('global-metadata_fix.dat', 'wb') as fp:
            n = 0
            while n < len(a):
                num = struct.unpack("
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    测试结果

    在这里插入图片描述

  • 相关阅读:
    什么是 SudoSwap,如何使用 NFT AMM 进行高效交易?
    (附源码)springboot养老院系统 毕业设计 645488
    扫雷游戏(C语言)
    JavaScript基础语法_JavaScript循环
    VR点亮元宇宙丨酷雷曼与你相约2022世界VR产业大会
    JAVA----钉钉机器人-订单提醒功能
    当你使用ChatGPT时,选择合适的提示(prompt)是引导对话方向的关键
    Python的无限魅力:探索其广泛应用领域
    BeanUtils--浅拷贝--实例/原理
    `VUE`的介绍
  • 原文地址:https://blog.csdn.net/Android_machong/article/details/132758130