软件使用说明 · v1.1.0 · 单文件 exe

Amber Manifest 可视化工具

把《魔法禁书目录 幻想收束》的 AssetBundle manifest 拆开看清楚: 五段二进制布局、目录占比、每条记录的存储路径与依赖关系,全在一个窗口里。 本说明只讲 exe 怎么用,不涉及任何编译或源码。

●双击即用,无需安装 ●只读,不改游戏文件 ●5 个视图 + 过滤 + 反查 ●一键导出 copyfiles.txt
01

快速上手:三步看到数据

01

双击启动

运行 AmberManifestTool.exe。单文件版启动时会自解压,耐心等 5~8 秒,窗口才出现。

02

载入 manifest

把文件 拖进窗口,或按 Ctrl+O 选择。manifest 常没有扩展名,对话框里选「所有文件」即可。

03

看状态栏自校验

右下角出现 自校验 N/N 通过 说明结构还原无误,再切到「记录」页开始查。

载入 69053 后的概览页
载入 69053 后的第一屏:文件信息、段布局、段明细——15,135 条记录,自校验 10/10 通过。
提示载入过一次后不用再打开同一文件——换了游戏或改了扰动流时,点 「重新解析」(Ctrl+R)即可原地刷新。
02

界面地图:六个区域各管什么

界面区域标注 1 2 3 4 5 6
窗口结构固定:工具栏 → 标签页 → 内容区 → 状态栏。
1工具栏:打开 / 重新解析 / 游戏选择 / 自定义游戏 / 关于 2五个标签页:概览 · 资源视图 · 记录 · 键表 · 名字前缀池 3文件信息:路径、版本、字节数、记录条数 4段布局:五段按字节比例画条,宽度足够时显示完整信息 5段明细:每段 word / byte 起止、长度、占比 6状态栏:摘要 + 最右侧的自校验结果
03

打开文件与「游戏」选择

三种打开方式

  • 工具栏 「打开 manifest 文件…」(Ctrl+O)
  • 把文件直接 拖进窗口
  • 启动时把路径写在命令行里,双击快捷方式也能带上

为什么必须选对「游戏」

存储路径 storage_path = getFrontPath(bundle 名) + assetBundleHash, 而 getFrontPath 依赖一张 256 字节扰动表——这张表是 分游戏 的。

选错游戏,前缀整段错,但 bundle 名、size、依赖都不受影响。

下拉显示--stream 名说明
幻想收束if默认,内置表
Engage Killek内置表
自定义项你自己填的名字保存在本机设置,重启后仍在

切换后工具会 自动重新解析当前文件,只重算 storage_path,其它字段不变。 遇到同一框架的其它游戏,点「自定义游戏…」把 256 字节表加进去即可。

自定义扰动流对话框
「自定义游戏…」对话框:粘贴 hex(56 91 BC DF … / 0x56,0x91,… / 5691bc… 三种写法都认),或从 .bin 原始表 / 含 hex 的 .txt、.json 导入。图中 Ramusu 是本机已保存的自定义项。
04

概览:先确认文件「读对了」

概览页从上到下七块,它的作用是 让你在 10 秒内确认这份 manifest 结构完整,再放心去看内容。

自校验十项(实测 69053,全部通过)

校验项结果实测值
1. formatVersion == 1通过1
2. 键表非递减通过15,135 键
3. 记录区恰好终止于 stringIndex通过word 0x485e3
4. 偏移表是记录区的完整排列通过15,135 个不同偏移 / 15,135 条记录
5. namePointer 命中前缀池条目通过347 / 347 条被引用
6. key_order 是 0..N-1 的双射通过15,135 个不同下标
7. 段长对账 = datas 总字节通过1,197,356 B
8. dataHash = 整表 128 位哈希低 32 位通过0x00f5b091
9. fileHash 未超 size 决定的上界通过0 例超界
10. nameHash 键逐条命中 XOR16(长名)通过15,135 / 15,135 命中
读法自校验有任意一项红底,就说明这份文件不是本工具预期的 Amber 布局(选错文件、或版本变了),后面的数字都不必再信。
05

资源视图:谁最占体积

资源视图根层饼图与目录树
整份 manifest 的根层:xor 占 90.3%、off 占 9.7%;右侧树按文件名首段分组。

饼图的三条铁律

  • 永远按整份文件的比例:下钻到子目录时,其余大小用灰色「其他目录(本层之外)」补齐,不会重新归一化成 100%。
  • 一层最多画 12 个最大子项,其余聚合成一片斜纹「本层其余 N 项」,角度仍按真实大小累加。
  • 标签放得下才画:屏幕弧长 ≥ 40 px 才出现,一次最多 16 个;放不下用 … 收尾,悬停看全名。

操作一览

  • 点扇区:下钻到该目录
  • 点灰色扇区:回到上一层(根层不响应)
  • 滚轮 / 放大 / 缩小:1.0x ~ 8.0x,文字大小恒定
  • 双击饼图:恢复 1.0x
  • 树里选中节点:饼图同步切到该层

树有四列:段名 / 文件数 / 总大小 / 占整份。顶行 (整份 manifest) 是虚拟根, 它才代表全量——没有这一行,你就无法回到根层看全貌。

06

记录页:查询的主战场

记录页表格与字段详情
记录页:13 列表格按 构建顺序 排列,下半部分是选中记录的字段详情。

13 列都是什么

列含义怎么用
#记录下标(构建顺序,即磁盘顺序)跨页引用时用它
键序该记录在键表(nameHash 升序)里的位置与 # 不同,别混
key(hex)键表原值 = GetNameHash(bundle 名)弱哈希,会重复
bundle 名前缀池模板 + 记录内文件名过滤时最常用
前缀 / 文件名拆开的两截,前缀来自共享池看目录归属
size / 依赖数文件字节数 / dependencyCount排体积、查依赖
word / byte本记录起始的绝对偏移对照二进制
存储路径xx/ + 24 位 hex + 32 位 hash,共 59 字符CDN / 落盘路径
assetBundleHash4 个 u32 拼成 32 字符(CDN 文件名)反查、导出的主键
fileHash下载后完整性校验用弱校验和不是密码学哈希
小技巧支持 Ctrl / Shift 多选;按 Ctrl+C 复制选中行,格式为 bundle 名<TAB>storage_path,可直接粘进脚本。

过滤语法:空白分隔多个条件,全部满足才显示

输入停 150 ms 自动生效,回车立即生效,右侧「清空」一键复位。计数标签会写「显示 X / Y 条 · 条件:…」。

写法含义
name:xxxbundle 名(完整名 + 文件名)子串,不区分大小写
path:00/存储路径 storage_path 子串
prefix:xor/dir前缀模板子串
hash:xxx / filehash:xxxassetBundleHash / fileHash 子串
key:0x1a2b键按十六进制 前缀 匹配(0x 可省略)
size:>1000 · size:100-200 · size:<=50数值比较:N、>N、>=N、<N、<=N、N-M
dep:>0按依赖数过滤
dup:key只看同键组大于 1 条的记录(弱哈希碰撞)
enc:off / enc:xor按前缀池第 1 位标志位过滤(明文 / 加密)
granularity:one / dir / all按前缀池第 2 位标志位过滤(打包粒度)
index:123 · word:0x1f · byte:0x7c · pool:0x2a0精确值,接受十进制或 0x 十六进制
裸词,例如 69053当作 name: 子串
过滤 dep:>2 后的记录页与依赖树
过滤 dep:>2:显示 3,113 / 15,135 条;下方「依赖」页展开了一条 35 个依赖的记录。

反查:手里只有路径 / 链接 / hash 也能找到 bundle

过滤条下面那行就是反查条。粘进去按回车,或点「反查」:

接受的输入

  • 完整 storage_path(59 字符)
  • CDN 链接,自动剥 scheme / host / ?query / #fragment
  • 本地绝对路径(反斜杠自动转 /)
  • 裸的 32 位 assetBundleHash(CDN 真实文件名)
  • 本工具导出的整行(只取第一列)

三级匹配

  • full:整条路径精确命中 → 直接跳到记录
  • hash:取最后一段 hex 的 末 32 位 命中 → 跳到记录
  • sub:都没中则按子串扫,把表格过滤成命中行
反查命中的记录页
反查条显示「精确命中(1 条)→ bundle 名:off/one/chara_anim_adv/adv_anim_ctrl(记录 #0)」,表格同时定位过去。

详情三页:字段 / 依赖 / 原始 word

页内容适合什么时候看
字段19 项字段、key 重算校验、同键组、前缀池原始字节、hash 的 4 个 u32 分量核对某个字段到底存了什么
依赖上部「本记录依赖谁」懒加载树(↺ 标循环、(不是任何记录的起始 word) 标断点,双击跳转);下部「谁依赖本记录」追资源链、排查缺文件
原始 word本记录占用的 word 逐行 dump,每行 4 word = 16 B,右侧标注字段归属对照二进制偏移
注意依赖树「全部展开传递依赖」有 5000 节点上限;菱形依赖会让节点爆炸,超限会提示,改用逐层展开更稳。
07

导出 copyfiles.txt:把清单喂给下载 / 拷贝脚本

导出按钮位置
入口在过滤条最右侧的 「导出 ▼」,菜单里两种口径,都会自动并入全部传递依赖。
01

选口径

导出当前过滤结果:表格现在显示的所有行(排序不影响集合)。
导出选中记录:高亮选中的行,未选中时取当前行。

02

选保存位置

弹窗默认文件名 copyfiles.txt、默认目录是 manifest 所在目录,可另选。

03

看汇总

完成后弹窗汇报:来源、文件数量(去重后含全部依赖)、总大小(字节 + MB)、保存路径。

导出的每一行都是两列,用 TAB 分隔,路径里的 / 统一换成 \:

# copyfiles.txt(UTF-8,按构建顺序,已去重) a6\44e571addad60e1fd5438dcf748217859b4e2a22dad684e644946b33 off\one\chara_anim_adv\adv_anim_ctrl f7\8ef362aac5f35bb770a0e0a7504e13f8cf274130c5f36c78103829c8 off\one\chara_anim_adv\adv_anim_ctrl_all e8\b222f5e1dccb67b7aeaf41e27f233f7c8440ec25dccb6bb4a0ffc390 off\one\chara_anim_adv\face_adv_chr_001_001_01
# 每行的真实结构: <存储路径,反斜杠> <TAB> <bundle 名,反斜杠>
为什么行数变多导出的集合 = 你选的行 ∪ 它们的全部传递依赖(按记录下标去重、递归求闭包、循环依赖自动收敛)。所以 导出行数通常会多于过滤结果,这是刻意设计,保证清单能一次下全。
08

键表与名字前缀池

键表页
键表按 nameHash 升序(键序),不是记录顺序;双击一行跳到对应记录。
名字前缀池页
前缀池:记录只存文件名片段,完整名 = 池内前缀 + 文件名;前两位是打包标志位。

标志位怎么读

  • 第 1 位:X = xor(加密)、O = off(明文)
  • 第 2 位:O = one、D = dir、A = all(打包粒度)
  • 「引用记录数」为 0 → 该池条目没被任何记录用到

能做什么

  • 双击一行 → 切到记录页并按 prefix:该前缀 过滤
  • 看哪个目录模板被复用最多(实测单个前缀最多被引用 2,828 次)
  • 核对前缀池原始字节与解密后的模板是否一致
09

常见问题

双击 exe 后没反应
单文件版要先自解压,等 5~8 秒;仍然没有窗口,就看 exe 同目录的 AmberManifestTool_crash.log,里面有完整堆栈。
提示「无法解析该文件」
选错文件了。必须是本游戏的 manifest 资产(内部含 Amber.AssetBundleManifestInfo),普通 AssetBundle 或解包后的资源都不行。
storage_path 前缀明显不对
工具栏「游戏」选错了。切回对应游戏会自动重新解析;若这份文件是新游戏,就在「自定义游戏…」里加表。
记录页看不到某条记录
过滤条件还在生效。看计数标签里的「条件:…」,点「清空」复位。
导出的行数比过滤结果多
正常。导出会自动并入全部传递依赖并去重,弹窗里的「文件数量」才是最终条数。
点导出没反应 / 提示没有可导出的记录
当前过滤结果为空,或还没载入 manifest。先清空过滤,或在表里选中若干行。
依赖树「全部展开」中途停了
节点超过 5000 上限(菱形依赖导致膨胀)。逐层点开目标分支即可。
窗口里中文字体偏细 / 模糊
把 Windows 显示缩放设为 100% 或 125% 后重启工具;界面按系统 DPI 自动缩放。