010 Editor 模板学习笔记
2024-03-17 17:33:41

模板是个好东西,可以直观地展现出文件结构,便于分析文件。
平时用的不多,但要写的时候又总忘记,所以在此记录一下。

模板文件

模板文件扩展名为.bt,是一个文本文件,可以自己创建一个.txt文件修改为.bt,或者通过点击菜单Templates > New Template来创建。
一个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//------------------------------------------------
//--- 010 Editor v12.0.1 Binary Template
//
// File:
// Authors:
// Version:
// Purpose:
// Category: WeChat
// File Mask: *.wxapkg
// ID Bytes: BE, 56 31 4D 4D 57 58
// History:
//------------------------------------------------

int x;

文件最开始若干行用//注释的元信息,用于描述模板文件及如何匹配魔术数,都是可选的,可以不填写,但是强烈建议填写File MaskID Bytes

程序会优先用File Mask匹配文件扩展名,再用ID Bytes匹配魔术数,匹配成功的话就会自动加载模板文件。
当然,如果你不需要自动加载模板文件这个功能的话就可以不写,通过菜单手动加载模板。
如果文件可能有多种扩展名,就用逗号分隔,比如*.txt,*.xml
ID Bytes也是一样,比如ID Bytes: BE, 56 31 4D 4D 57 58

语法

模板是从上到下运行的,我们的主要工作就是定义各种数据结构、控制流程等等。
因为编写模板和开发C语言程序几乎差不多,所以我只讲一些常见的需要注意的地方。

本地变量

默认情况下,所有变量都会显示在模板窗口中。比如我定义了一个int x;

可以通过local关键字定义变量,这样的变量默认不会显示在模板窗口中,不过用户任然可以在窗口中点击右键菜单中的Show Local Variables来显示局部变量。
Local Variables

大小端

默认随系统,比如在 Windows 下是按照小端模式,通过BigEndianLittleEndian来调整读取方式。

1
2
3
BigEndian();    // 转换为大端模式
int x;
LittleEndian(); // 转换为小端模式

更多内置函数查看官方手册:I/O Functions

停止执行脚本

如果在执行过程中发现脚本结构不对时可以提前结束,使用return语句即可

1
2
3
4
5
local string magic = ReadString(0, 5);
if (magic == "Hello") {
Printf("无法解析加密文件");
return;
}

我们把整个脚本文件看作是一个C函数,用return就可以提前退出函数。

结构体构造函数

这样是合法的

1
2
3
typedef struct (uint offset) {
uint x;
} FILE;

使用方法

1
FILE f(123);

结构体中可以有表达式

有时候结构体不是固定长度,而是根据字段的值来决定的

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct {
FILE_NAME fileName;
uint offset;
uint size;

if (size > 0) {
local int64 pos = FTell();
FSeek(offset);
uchar data[size];
FSeek(pos);
}
} FILE_INFO <comment=fileName.fileName>;

相关阅读

Writing Templates
010Editor脚本语法入门
宇宙最强 010 Editor 模板开发教程