求助 影之诗Beyond如何解包

Steam端已经预加载并可下载资源了,除了data.unity3d的通用资源外,在Persistent/dat中的asset都无法直接提取

读取报错:

System.IO.IOException: Lz4 decompression error, write -1 bytes but expected 77876 bytes
  1. 手动查看文件头,Unity rev版本被改写成0.0.0, 改为正确Unity版本2022.3.18f1后仍报错
  2. 手动检查Unity文件格式,header正常 (lz4hc 压缩, flags 0x243),lz4 block info正常, 但解压lz4 block时异常
  3. 游戏目录下仅有GameAssembly,未找到global-metadata.dat

怀疑lz4 block的内容有点问题, 因为dump出来的部分完全没有可见的合理字符串,但没有啥思路。问问大佬们有没有思路,或者安卓包如果是Mono打包的,能不能直接BepInEx挂插件dump出来。

测试文件

2A7KVQH2TLJ6MFXCUFXAZAS6QM.zip (118.5 KB)

LZ4 block
compressed_bytes.zip (118.3 KB)

看了下手机端,global-metadata.dat的处理有几千行,简直不是人


改成dump, dump出来添上魔术也没法得到dump.cs
而且一用frida hook就闪退,等大佬来看看吧 :melting_face:

更新一下:
看到GameAssembly里导入了Plugins/x86_64/libnative.dll里的LZ4_decompress_safe_ext和Z4_compress_default_ext, 应该是在LZ4加解密外加了一层。

把ghidra反汇编的代码扔给LLM看,AI认为解压之前有一个CFB模式的加解密。

但是这个o3的代码真是看着头秃… 不会key还是动态读的吧。用Ollydbg下断点也不行,应该有某种anti debugger

直接LoadLibraryA libnative.dll 对assetbundle 每个字节为起始跑,无法解压
写DLL Proxy,直接转发原dll,程序也会卡住

x64dbg+ScrytheHide倒是可以下断点,不过现在看不出啥,就有几个compress decompress的触发

这下没思路了

同求,安卓是这种规格。

更新2:x64dbg+ScyllaHide 可以attach上进程加断点,成功用以下script dump出decompress函数的输入输出,但是每次都得敲完一遍script逐步执行,不知道有没有啥方法让他自动执行

memdumps.zip (918 字节)

不知道是没开服还是找的不对,现在dump出来的还是一些维护信息,看着跟直接json写的差不多…

x64dbg script:

decompress_addr = libnative.dll:LZ4_decompress_safe_ext
compress_addr = libnative.dll.LZ4_compress_default_ext

bp decompress_addr
bp compress_addr

SetBreakpointCommand decompress_addr, "scriptcmd call cb_decompress_entry"
SetBreakpointCommand compress_addr, "scriptcmd call cb_compress_entry"

erun
ret

cb_decompress_entry:
    mov src_ptr, rcx          
    mov dst_ptr, rdx          
    mov src_len, r8           
    mov dst_cap, r9           

    rtr

    mov dst_len, rax          

    savedata "memdumps/decompress_src_{breakpointcounter}.bin", src_ptr, src_len       
    savedata "memdumps/decompress_dst_{breakpointcounter}.bin", dst_ptr, dst_len

    erun   
    ret

cb_compress_entry:
    mov src_ptr, rcx          
    mov dst_ptr, rdx          
    mov src_len, r8           
    mov dst_cap, r9           

    rtr

    mov dst_len, rax          

    savedata "memdumps/compress_src_{breakpointcounter}.bin", src_ptr, src_len       
    savedata "memdumps/compress_dst_{breakpointcounter}.bin", dst_ptr, dst_len

    erun   
    ret