更新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了