快来注册~
您需要 登录 才可以下载或查看,没有账号?注册账号
x
如何计算《永劫无间》bundle文件中 DELTA 对应的 COMP_FIX/UNCOMP_FIX 值,本质是找到「文件头记录的大小」与「实际文件大小」的差值,再反向推导需要修正的块大小参数。下面我会用新手能看懂的方式,拆解计算逻辑和实操步骤。
一、先理解核心概念(计算的前提)在开始计算前,先明确几个关键变量的含义:
变量名
含义
SIZE8
bundle文件头中记录的文件总大小(脚本里用get SIZE8 longlong读取)
FSIZE
bundle文件实际的磁盘大小(脚本里用get FSIZE asize读取)
DELTA
差值 = SIZE8 - FSIZE(文件头记录的大小 - 实际大小)
COMP_FIX/UNCOMP_FIX
要计算的修正值,用于调整「压缩块/未压缩块」的数量,让文件头符合UnityFS标准
二、计算的核心逻辑永劫无间的bundle文件被加密/篡改后,SIZE8(记录大小)和FSIZE(实际大小)会不一致,且「压缩块/未压缩块数量」被人为偏移了一个固定值(就是COMP_FIX/UNCOMP_FIX)。
计算的本质是:找到这个被偏移的固定值,反向修正回去。
具体逻辑分两步:
- 先算出DELTA值;
- 用「正常的UnityFS文件」作为参考,对比「被篡改的文件」的块数量,差值就是COMP_FIX/UNCOMP_FIX。
三、实操计算步骤(手把手教)你需要准备2个工具:
- QuickBMS(带调试功能)或 010 Editor(二进制编辑器,推荐,可视化更强);
- 一个「已知可正常解析的UnityFS bundle文件」(作为参考,比如其他Unity游戏的正常bundle)。
步骤1:计算DELTA值(基础)首先拿到你要处理的Naraka bundle文件,先算出DELTA:
- 用010 Editor打开该bundle文件;
- 查看文件实际大小:右键文件→属性,记录FSIZE(比如102400字节);
读取SIZE8(文件头记录的大小):
- UnityFS格式的bundle文件头结构固定,SIZE8通常在「UnityFS标识 + 版本号」之后的8字节位置(偏移量约0x18);
- 在010 Editor中跳转到偏移0x18,读取8字节的十六进制值,转换为十进制,就是SIZE8;
- 计算DELTA = SIZE8 - FSIZE(比如SIZE8=102426,FSIZE=102400,则DELTA=26(0x1A))。
步骤2:计算COMP_FIX/UNCOMP_FIX(核心)这一步需要对比「正常UnityFS文件」和「Naraka篡改文件」的块数量,找到偏移值:
子步骤1:读取Naraka篡改文件的块数量- 用010 Editor打开Naraka的bundle文件(已解密但未修复的_dec.bundle);
跳转到「块数量」的偏移位置:
- UnityFS文件头中,BLOCKS_COMPRESSED(压缩块数量)在偏移0x28位置(4字节);
- BLOCKS_UNCOMPRESSED(未压缩块数量)在偏移0x2C位置(4字节);
- 记录这两个值:比如读取到BLOCKS_COMPRESSED=200,BLOCKS_UNCOMPRESSED=190。
子步骤2:读取正常UnityFS文件的块数量- 找一个正常的UnityFS bundle文件(比如从其他Unity游戏提取的、AssetStudio能直接识别的);
用同样的方法,读取它的BLOCKS_COMPRESSED和BLOCKS_UNCOMPRESSED:
- 比如正常文件的BLOCKS_COMPRESSED=20,BLOCKS_UNCOMPRESSED=20。
子步骤3:计算修正值修正值 = 「Naraka篡改文件的块数量」 - 「正常文件的块数量」(或反向,取决于SIGN是否为UnityFS):
- 如果文件头的SIGN(标识)不是 "UnityFS"(说明被篡改):
COMP_FIX = Naraka_COMP - 正常_COMP
UNCOMP_FIX = Naraka_UNCOMP - 正常_UNCOMP
示例:Naraka_COMP=200,正常_COMP=20 → COMP_FIX=180;Naraka_UNCOMP=190,正常_UNCOMP=20 → UNCOMP_FIX=170(对应脚本里DELTA=0x1A的情况)。
- 如果文件头的SIGN是 "UnityFS"(极少见):
COMP_FIX = 正常_COMP - Naraka_COMP
UNCOMP_FIX = 正常_UNCOMP - Naraka_UNCOMP
步骤3:验证计算结果把算出的COMP_FIX/UNCOMP_FIX写入脚本,替换对应DELTA的分支:
elif DELTA == 0xXX # 你算出的新DELTA值 math COMP_FIX = 你计算的修正值 math UNCOMP_FIX = 你计算的修正值然后用QuickBMS运行脚本,修复bundle文件:
- 若修复后AssetStudio能正常加载资源 → 计算正确;
- 若仍无法加载 → 检查「块数量偏移位置」是否读错,或正常参考文件的Unity版本是否匹配(永劫无间用的是Unity 2021+)。
四、简化版实操技巧(新手替代方案)如果不想手动读二进制,也可以用QuickBMS的调试模式快速获取关键值:
打开CMD,进入QuickBMS目录,运行调试命令:
quickbms.exe -d naraka_fix.bms 你的_dec.bundle 输出目录 (-d是调试模式,会输出所有变量的取值);
在调试日志中找到:
SIZE8 = [数值]FSIZE = [数值]DELTA = [数值]BLOCKS_COMPRESSED = [数值]BLOCKS_UNCOMPRESSED = [数值]
- 找一个正常的UnityFS bundle,用同样的调试命令读取它的BLOCKS_COMPRESSED/BLOCKS_UNCOMPRESSED;
- 按步骤2的公式计算修正值即可。
五、常见坑点(避免计算错误)- 字节序问题:UnityFS用「小端序」存储数值,010 Editor中要确认「字节序设置为Little Endian」,否则读取的SIZE8/块数量会是错的;
- 文件未解密:必须先对Naraka的bundle解密(生成_dec.bundle),再计算,加密状态下的数值无意义;
- Unity版本匹配:参考的正常bundle文件需和永劫无间的Unity版本一致(2021.x),否则文件头结构不同;
- DELTA为负数:若DELTA = SIZE8 - FSIZE < 0,说明文件被截断,需重新解包PAK获取完整的bundle文件。
总结- 计算的核心是:先算DELTA = 记录大小(SIZE8) - 实际大小(FSIZE),再对比「篡改文件」和「正常UnityFS文件」的块数量,差值就是COMP_FIX/UNCOMP_FIX;
- 实操优先用010 Editor(可视化)或QuickBMS调试模式(直接输出变量),避免手动算错;
- 关键前提:bundle文件需先解密,且参考的正常文件要匹配Unity版本(2021+)。
[size=102400,则DELTA=26(0x1A))。"},"attribs":{"0":"*0+2*0*1+l*0+3*0*1+c*0+1*0*1+c*0+2*0*1+8*0+8"}},"apool":{"numToAttrib":{"0":["author","4431501448972572"],"1":["inlineCode","true"]},"nextNum":2}},"type":"ordered"}},"NjXWfOQvgdlMNAczRYv5kc5elko":{"id":"NjXWfOQvgdlMNAczRYv5kc5elko","snapshot":{"align":"","author":"4431501448972572","children":[],"comments":[],"hidden":false,"locked":false,"parent_id":"M7mEfIigedRb4jcyylTctcsoncc","revisions":[],"text":{"initialAttributedTexts":{"text":{"0":"步骤2:计算COMP_FIX/UNCOMP_FIX(核心)"},"attribs":{"0":"*0+t"}},"apool":{"numToAttrib":{"0":["author","4431501448972572"]},"nextNum":1}},"type":"heading4"}},"WVCBffEEPdI4oWc1nZANQIoH3cj":{"id":"WVCBffEEPdI4oWc1nZANQIoH3cj","snapshot":{"align":"","author":"4431501448972572","children":[],"comments":[],"hidden":false,"locked":false,"parent_id":"M7mEfIigedRb4jcyylTctcsoncc","revisions":[],"text":{"initialAttributedTexts":{"text":{"0":"这一步需要对比「正常UnityFS文件」和「Naraka篡改文件」的块数量,找到偏移值:"},"attribs":{"0":"*0+18"}},"apool":{"numToAttrib":{"0":["author","4431501448972572"]},"nextNum":1}},"type":"text"}},"NbzzfpegzdnBC6cMo8xqAeShJ0e":{"id":"NbzzfpegzdnBC6cMo8xqAeShJ0e","snapshot":{"align":"","author":"4431501448972572","children":[],"comments":[],"hidden":false,"locked":false,"parent_id":"M7mEfIigedRb4jcyylTctcsoncc","revisions":[],"text":{"initialAttributedTexts":{"text":{"0":"子步骤1:读取Naraka篡改文件的块数量"},"attribs":{"0":"*0+l"}},"apool":{"numToAttrib":{"0":["author","4431501448972572"]},"nextNum":1}},"type":"heading5"}},"ClSmfqNUhdGhw7cT9g3FlKvfRdJ":{"id":"ClSmfqNUhdGhw7cT9g3FlKvfRdJ","snapshot":{"align":"","author":"4431501448972572","children":[],"comments":[],"hidden":false,"locked":false,"parent_id":"M7mEfIigedRb4jcyylTctcsoncc","revisions":[],"seq":"1","text":{"initialAttributedTexts":{"text":{"0":"用010]
|
免责声明:
资源盒论坛发布的一切资源、模型和注册信息及软件的源码教程仅限用于学习和研究目的;
不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
本站资源来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。
如果您喜欢该程序/源文件,请支持正版软件,购买/注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。
若本站侵犯了您的权益请联系站长进行删除处理E-mail:190183740@qq.com;
|