求助 影之诗Beyond如何解包

更新4: 其实global-metadata.dat就是放在GameAssembly里, 只是读取的时候xor了一个key, 还把sanity和version改掉了.

il2cpp_init逻辑没变, 但是函数名混淆了, 找global-metadata.dat这个字符串可以找到initializeMetadata (不知道为啥第一次ghidra没给我找到这个字符串… 也可以找mscorlib.dll). 下断点后, x64dbg没有插件, 手动算下total size, 直接savedata filename,[rax],size+0x100. 最后需要前八个字节改回AF 1B B1 FA 1D 00 00 00.

IL2CppDumper可以直接导出, 不需要找key, 就是ghidra读到现在还没分析完 (


分析完了,跟上面贴的Github一样,看AssetBundleStream ctor/Read方法就行。baseKey可以下断点拿到,asset key看传参

def calc_key(base_key, asset_key):
    buffer = [0] * (len(base_key) * len(asset_key))
    base_idx = 0
    
    for i in range(len(base_key)):
        for j in range(len(asset_key)):
            buffer[i * len(asset_key) + j] = base_key[i] ^ asset_key[j]
    
    return bytes(buffer)


def decrypt(content, key):
    offset = 0x100
    output = [0] * len(content)
    
    output[0:offset] = content[0:offset]
    
    for i in range(offset, len(content), len(key)):
        
        for j in range(len(key)):

            if offset >= len(content):
                break

            key_idx = offset % len(key)           
            output[offset] = content[offset] ^ key[key_idx]
            offset += 1
        
    return bytes(output)

一个未知问题就是,本地有没有存每个asset的key 这样就不用调cygames api拿key了