本文档详细介绍 R-Studio 中自定义文件类型的高级 XML 语法,包括 Version 1 和 Version 2 的完整属性说明、签名组合规则、逻辑运算(AND/OR)以及多文件类型定义方法。掌握这些高级属性,可以精确控制原始恢复时对特定文件格式的识别行为。
为什么需要高级自定义属性
R-Studio 的标准自定义文件类型功能(Version 1)允许用户通过固定偏移的文件签名来识别文件。然而,某些复杂或变体的文件格式具有以下特点:
- 文件签名可能出现在不同的偏移位置(可变偏移)
- 文件需要多个签名同时匹配才能唯一识别(AND 逻辑)
- 文件可能有多种签名变体,满足任意一种即可识别(OR 逻辑)
- 需要同时检查文件开头和结尾的签名以提高准确性
为了应对这些需求,R-Studio 提供了 Version 2 的高级自定义属性,支持可变偏移范围、AND/OR 逻辑嵌套,以及 Begin/End 块定义。
Version 1 与 Version 2 对比
| 特性 | Version 1 | Version 2 |
|---|---|---|
| 偏移量指定 | 固定 offset | 支持 offset(固定)或 from/to(范围) |
| 签名组合逻辑 | 多个签名之间为 AND 关系 | 支持 AND 和 OR 任意嵌套 |
<Begin> / <End> 块 | 不支持 | 支持 (分别匹配文件开头和结尾) |
| 适用场景 | 简单、固定位置的文件签名 | 复杂、 可变位置的签名 |
版本通过在 <FileTypeList> 标签中设置 version="2.0" 指定。
XML 文件基础结构
文件头与根元素
所有自定义文件类型定义文件以标准 XML 头开始:
<?xml version="1.0" encoding="utf-8"?>
根元素为 <FileTypeList>,需要闭合标签 </FileTypeList>。
属性:
| 属性 | 值 | 必需 | 说明 |
|---|---|---|---|
version | 1.0 或 2.0 | 否 | 文件类型描述版本, 默认为 1.0 |
注释
使用 XML 标准注释格式:
<!-- 这是注释 -->
Version 1 属性详解(基础版)
<FileType> 元素
每个 <FileType> 描述一种文件签名。
属性:
| 属性 | 类型 | 必需 | 说明 |
|---|---|---|---|
id | u32 | 是 | 数字文件类型标识符, 每种文件类型必须唯一 |
group | string | 否 | 出现在“查找文件类型”对话框中的分组。 可使用自定义组名, 或使用预定义组 (见下表) |
description | string | 否 | 简要文件描述, 默认为空 |
features | string | 否 | 文件类型的附加属性。 多个属性用空格分隔。 可选值: NO_SCAN、TXT_ANSI、TXT_UNICODE |
extension | string | 否 | 文件扩展名(如 arj),默认为空 |
预定义文件类型组
group 值 | 显示名称 |
|---|---|
archive | 档案文件 |
graphic | 图片/画面 |
internet | 互联网相关文件 |
multimedia | 多媒体文件 |
audio | 多媒体:音频文件 |
video | 多媒体:视频文件 |
registry | 注册表 |
files | 文件 |
doc_database | 文档:数据库 |
doc_sheet | 文档:电子表格 |
exe | 可执行文件/库/DLL |
unknown | 其他文件类型(默认) |
文件类型属性标志
| 标志 | 说明 |
|---|---|
NO_SCAN | 不扫描该类型。 R-Studio 不会搜索该文件类型, 但在按扩展名排序时会显示 |
TXT_ANSI | 文件可作为 ANSI 文本查看, 预览时直接发送到文本/十六进制编辑器 |
TXT_UNICODE | 文件可作为 UNICODE 文本查看, 预览时直接发送到文本/十六进制编辑器 |
<Signature> 元素(Version 1)
一个 <FileType> 可以包含无限数量的 <Signature> 元素。如果包含多个签名,意味着所有这些签名必须同时存在于文件中。签名应具有不同的 offset 属性,且不应重叠。
属性:
| 属性 | 类型 | 必需 | 说明 |
|---|---|---|---|
offset | u16 | 否 | 签名的十进制偏移量 (从文件开头计算), 默认为 0 |
count | u16 | 否 | 表示相同长度签名的数量。 当同一偏移位置可能存在多个签名时使用。 count * size 应等于元素中的字节数。默认为 1 |
size | u16 | 否 | 签名中的字节数, 默认为元素中写入的字节数 |
签名内容格式:
- 由 ASCII 字符和
\xhh格式的十六进制字节组成(hh是十六进制字节码) - 如果
\x后不是十六进制数,则\x被视为签名字符串的一部分
Version 1 完整示例
<?xml version="1.0" encoding="utf-8"?>
<FileTypeList>
<FileType id="2" group="archive" description="ARJ Archive" extension="arj">
<Signature offset="3" count="1">Abc\x5c\x00\x04</Signature>
<Signature offset="9" count="2">\x23\x01\xf4</Signature>
</FileType>
</FileTypeList>
Version 2 高级属性详解
根元素指定版本
<?xml version="1.0" encoding="utf-8"?>
<FileTypeList version="2.0">
...
</FileTypeList>
<Begin> 与 <End> 块
一个 <FileType> 可以包含 <Begin> 和/或 <End> 块,至少应包含其中一个。<Begin> 定义文件开头的签名条件,<End> 定义文件结尾的签名条件。
属性:
| 属性 | 值 | 必需 | 说明 |
|---|---|---|---|
combine | AND 或 OR | 否 | 指定块内直接子元素之间的逻辑关系, 默认为 AND |
结构示例:
<FileType id="2" group="archive" description="Example" extension="ex">
<Begin combine="AND">
<!-- 签名条件 -->
</Begin>
<End combine="OR">
<!-- 签名条件 -->
</End>
</FileType>
<AND> 与 <OR> 元素
用于嵌套组合复杂逻辑。这些元素可以包含:
- 多个
<Signature>元素 - 一个或多个
<AND>或<OR>子元素
Version 2 的 <Signature> 扩展属性
新增属性(与 offset 互斥):
| 属性 | 类型 | 必需 | 说明 |
|---|---|---|---|
from | u16 | 否 | 指定文件签名的最左可能偏移量。 如果指定了 offset,则忽略此属性 |
to | u16 | 否 | 指定文件签名的最右可能偏移量。 如果指定了 offset,则忽略此属性 |
size | u16 | 否 | 签名中的字节数, 默认为元素中写入的字节数 |
from/to的语义:当使用from和to时,签名可以出现在该偏移范围内的任意位置。R-Studio 会在该范围内搜索匹配的签名。
关于 offset 的说明:
- 在
<Begin>块中,offset从文件开头计算 - 在
<End>块中,offset从文件末尾向前计算。例如,offset="2"表示从文件末尾倒数第 2 个字节开始匹配签名
Version 2 完整示例
<?xml version="1.0" encoding="utf-8"?>
<FileTypeList version="2.0">
<FileType id="5626" group="_Test" description="Test file" extension="tst">
<Begin combine="AND">
<Signature from="0" to="20">ABC</Signature>
<Signature offset="1">CDEFG</Signature>
<AND>
<Signature offset="0">DE</Signature>
<Signature offset="0">RTD</Signature>
<OR>
<Signature offset="12">CP</Signature>
<Signature offset="16">RTD</Signature>
</OR>
</AND>
</Begin>
<End combine="OR">
<Signature from="3" to="20">ABC</Signature>
<Signature offset="5">CDEFG</Signature>
<AND>
<Signature offset="2">DE</Signature>
<Signature offset="3">RTD</Signature>
<OR>
<Signature offset="12">CP</Signature>
<Signature offset="16">RTD</Signature>
</OR>
</AND>
</End>
</FileType>
</FileTypeList>
逻辑组合图解
<Begin combine="AND">
├── Signature A (条件1)
├── Signature B (条件2)
└── <AND> ← 内部 AND
├── Signature C (条件3)
└── <OR> ← 内部 OR
├── Signature D (条件4)
└── Signature E (条件5)
匹配逻辑:条件1 且 条件2 且 (条件3 且 (条件4 或 条件5))
多文件类型定义
可以在同一个 XML 文件中定义多个文件类型,只需依次添加多个 <FileType> 块即可,无需使用特殊分隔符。
示例:
<?xml version="1.0" encoding="utf-8"?>
<FileTypeList>
<FileType id="2" group="archive" description="ARJ Archive" extension="arj">
<Signature offset="3" count="1">Abc\x5c\x00\x04</Signature>
</FileType>
<FileType id="3" group="archive" description="Another Archive" extension="arc">
<Signature offset="0" count="1">AnotherSig</Signature>
</FileType>
<FileType id="4" group="graphic" description="Custom Image" extension="cimg">
<Signature offset="0" count="1">CIMG\x00\x01</Signature>
</FileType>
</FileTypeList>
实际应用示例
示例一:固定偏移单签名(Version 1)
定义一种自定义配置文件,文件头固定为 CFG\x00\x01\x02,偏移 0:
<FileType id="10001" group="files" description="Custom Config" extension="cfg">
<Signature offset="0" count="1">CFG\x00\x01\x02</Signature>
</FileType>
示例二:可变偏移签名(Version 2)
某文件格式的签名可能出现在偏移 0 到 32 之间:
<FileType id="10002" group="graphic" description="Flexible Image" extension="fimg">
<Begin combine="AND">
<Signature from="0" to="32">FIMG\x00</Signature>
</Begin>
</FileType>
示例三:多签名 OR 组合(Version 2)
文件可能有多种不同的文件头变体:
<FileType id="10003" group="archive" description="Multi-Signature Archive" extension="msa">
<Begin combine="OR">
<Signature offset="0">ARC1\x00\x01</Signature>
<Signature offset="0">ARC2\x00\x02</Signature>
<Signature offset="0">ARC3\x00\x03</Signature>
</Begin>
</FileType>
示例四:同时检查文件头和文件尾(Version 2)
提高识别准确率:
<FileType id="10004" group="multimedia" description="Secure Audio" extension="sau">
<Begin combine="AND">
<Signature offset="0">SAUD\x00\x01</Signature>
</Begin>
<End combine="AND">
<Signature offset="8">ENDSAUD</Signature>
</End>
</FileType>
加载与使用
保存 XML 文件
将编写好的 XML 文件保存在 Settings → Main → User paths 指定的目录中。默认文件名通常为 user_file_types.xml。
重新加载配置
在 R-Studio 中,进入 Settings → Known File Types,单击 Reload User's File Types 按钮,无需重启软件即可生效。
在扫描中使用
执行磁盘扫描时,必须勾选 Extra search for known file types(已知文件类型额外搜索),R-Studio 才会应用自定义文件签名。
常见问题解答
- Q1:Version 2 的
from和to与offset有什么区别? - A:
offset指定一个固定的偏移位置;from/to指定一个偏移范围,R-Studio 会在该范围内搜索签名。offset和from/to互斥,不能同时使用。
- Q2:在
<End>块中,offset是如何计算的? - A:在
<End>块中,offset从文件末尾向前计算。例如offset="2"表示从文件最后一个字节往前 2 个字节的位置开始匹配签名。签名长度由size或实际字节数决定。
- Q3:多个
<Signature>元素之间的默认逻辑关系是什么? - A:在 Version 1 中,多个签名之间是 AND 关系(必须全部存在)。在 Version 2 中,可以通过
combine属性和<AND>/<OR>元素自由组合。
- Q4:如何调试自定义文件类型的匹配效果?
- A:可以先在小范围样本文件上测试。将 XML 文件加载后,对包含样本文件的磁盘分区执行扫描(仅勾选已知文件类型扫描),查看是否成功识别出文件。
- Q5:
count属性的使用场景是什么? - A:当同一偏移位置可能存在多个长度相同、起始相同的签名时,使用
count表示签名数量。此时应顺序写入多个签名内容,count * size应等于签名内容的总字节数。
- Q6:自定义文件类型的
id如何避免与内置类型冲突? - A:建议使用 50000 以上的数字。R-Studio 内置类型的 id 通常在 1–2000 范围内。
- Q7:Version 2 的嵌套逻辑最多支持多少层?
- A:没有明确限制,但建议保持结构清晰,避免过深嵌套影响解析性能。
- Q8:自定义文件类型对碎片化文件有效吗?
- A:原始恢复(基于文件签名)只能恢复非碎片化的文件。如果文件在磁盘上被分割成多个不连续的片段,即使签名匹配成功,也无法完整恢复。
- Q9:为什么我定义的文件类型在扫描时没有被使用?
- A:检查:
- 扫描对话框中是否勾选了 Extra search for known file types;
- XML 文件是否已通过 Reload User's File Types 重新加载;
- XML 语法是否正确(可使用 XML 验证工具)。
- Q10:macOS 和 Linux 上使用高级自定义属性有区别吗?
- A:XML 语法和功能完全一致。仅设置入口略有不同:macOS 为 R-Studio → Preferences → Known File Types;Linux 与 Windows 相同为 Tools → Settings → Known File Types。
| 核心要点 | 说明 |
|---|---|
| Version 1 | 固定偏移签名, 多签名默认为 AND 关系, 适用于简单文件格式 |
| Version 2 | 支持可变偏移范围(from/to),支持 AND/OR 任意嵌套逻辑, 支持 Begin/End 块 |
| 关键属性 | id(唯一)、group(分组)、extension(扩展名)、features(标志) |
| 签名定义 | <Signature> 元素,支持 offset(固定)或 from/to(范围) |
| 逻辑组合 | combine="AND/OR" 控制子元素关系,<AND> 和 <OR> 用于嵌套 |
| 文件位置 | <Begin> 匹配文件开头,<End> 匹配文件结尾(offset 从末尾计算) |
| 多类型定义 | 在同一 XML 文件中依次添加多个 <FileType> 块 |
| 加载方式 | 图形界面(推荐)或直接编辑 XML, 通过 Reload 按钮加载 |
掌握 R-Studio 的高级自定义属性,可以精准定义复杂文件格式的识别规则,大幅提升原始恢复的准确性和覆盖率。
