Steam端已经预加载并可下载资源了,除了data.unity3d的通用资源外,在Persistent/dat中的asset都无法直接提取
读取报错:
System.IO.IOException: Lz4 decompression error, write -1 bytes but expected 77876 bytes
- 手动查看文件头,Unity rev版本被改写成0.0.0, 改为正确Unity版本2022.3.18f1后仍报错
- 手动检查Unity文件格式,header正常 (lz4hc 压缩, flags 0x243),lz4 block info正常, 但解压lz4 block时异常
- 游戏目录下仅有GameAssembly,未找到global-metadata.dat
怀疑lz4 block的内容有点问题, 因为dump出来的部分完全没有可见的合理字符串,但没有啥思路。问问大佬们有没有思路,或者安卓包如果是Mono打包的,能不能直接BepInEx挂插件dump出来。
看了下手机端,global-metadata.dat的处理有几千行,简直不是人
改成dump, dump出来添上魔术也没法得到dump.cs
而且一用frida hook就闪退,等大佬来看看吧
更新一下:
看到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