数据文件结构分析方法
2009 年 06 月
前 言
出于各种各样的目的,软件开发人员经常会面对结构未知的数据文件,这可能是原于受客户委托,
对第三方开发的软件功能进行有限扩展或二次开发;也可能原于学习和提高的目的;但更多的时候
可能纯粹出于好奇。
分析数据文件需要一些相关的知识和技能,包括对数据文件的基本结构和存储方式的理解。
数据文件结构分析方法的任务:数据结构与数据表达内涵的分析。
本书不涉及通常意义上的数据加密、数据解密等相关问题。
基本数据类型。在第一部分中,将给以简单的介绍。
对于分析复杂的数据文件,除了基本的知识和技能外,还需要强大的分析工具。在第二、三、
四部分,介绍了 Fexplorer 软件强大的数据分析功能和方便、灵活的操作。
在面对实际问题时,分析数据文件可能需要更多的知识和背景。在第五部分通过实例演示了一
个完整的数据文件的破解过程。
需要特别说明的是,尽管数据文件分析技术有可能被一些人用于非法目的,但本书的著者强烈
要求读者,在理解和使用本书的过程中,严格遵守国际、国内软件保护、知识产权等相关的法律、
法规,这也是著者编写本书的出发点。
述语与定义
数据
记录——
记录由连续的字节组成,被解释为基本的数据类型,记录包括地址、数据类型、数据长度、含
义。
结构——
结构由一组相邻的记录组成,代表一个对象或数据模型。
格式刷——
格式刷是被选定的结构。
对读者的建议
尽管本书中的数据文件分析不涉及常规意义上的数据加密与解密,但与软件开发中的其它工作
相比较,分析数据结构还是要耗费相对较大的劳动强度和时间。在软件开发领域,尽管不缺乏野心
勃勃的天才,但是如果浪费他人宝贵的时间和精力是万万不可的,为避免本书有可能在策略上误导
读者而使人陷于歧途,在此特别提醒读者,在进行数据文件分析时,首先应该制定一个科学的分析
方案,并在方案的指导下开展分析工作。为此,提出如下建议:
第一,应尽可能收集与数据文件相关的资料,包括开发文档、源程序代码;收集与软件涉及的
行业相关的标准。
第二,与软件的开发者取得联系,争取得到第一手资料或可能的帮助,有可能的话,请高人指
导。
第三,通过查询,收集是否已经有人进行过相似的分析工作及分析结果。
如果从外部无法获得帮助,必须依靠自己完成分析工作的话,在着手分析之前,也应当做好充
分的准备:
第四,对软件的功能和性能更多的了解,理解软件的设计思路。
第五,尽可能收集到两个以上的同类数据文件。
1 基本知识
1.1 数据文件
数据文件是整个软件的一部分,存储软件的输入、输出数据,通常以磁盘文件的形式保存在存
储介质中。
有时软件并不需要数据文件,比如大家常用的 WINDOWS 提供的计算器。但多数,特别是大型应
用软件,都需要有数据文件。如数据库管理软件、文字处理软件、绘图软件、股票分析软件等,都
有自己的数据文件。
软件的文件包括程序文件和数据文件两类,程序文件主要包含软件的可执行代码,负责对用户
输入的数据进行计算、分析,并将计算分析结果以数据文件的形式保存到数据文件中。
1.2 数据文件类型
从功能上,数据文件可分为输入数据文件、输出数据文件和临时数据文件。输入数据文件负责
初始化软件的运行环境,存储被加工的数据原料。输出数据文件存储经过软件分析、计算的结果。
临时数据文件存储软件计算过程中生成的临时数据或中间结果,这类数据在软件运行结束后一般由
软件自动删除。
从存储格式上,数据文件可分为文本数据文件和二进制数据文件。文本数据文件可由文本编辑
器打开。常见的文本数据文件有批处理文件(*.bat)、配置文件(*.ini 或*.CFG)、DXF 文件。
二进制数据文件不能被文本编辑器打开,只能通过 WINDOWS 提供的底层文件操作指令访问。
由于二进制数据文件的存储效率和访问效率较高,几乎所有规模较大的数据文件全为二进制数据文
件。
由于文本数据文可直接用文本编辑器查看,所以数据文件分析中所设计的数据文件类型主要是
二进制数据文件。
1.3 数据类型
数据文件可以看成是一个由各种基本的数据类型构成的数据集合,基本的数据类型有整型数据、
浮点型数据、字符型数据。
1.3.1 整型数据
整型数据有单字节整数(8 位)、双字节整数(16 位)、四字长整数(32 位)。单字节整数只占 1
个 byte,表示数据的范围从 0-255 或-125 到 125。双字节整数占 2 个 byte,表示数据的范围从 0-65535
或-32767 到 32767。四字长整数占 4 个 byte,表示数据的范围从 0-4294967295 或-2147483647 到
2147483647。
1
逻辑型数据也由单字节整数表示,占 1 个 byte(8 位),其中 0 表示“否”,0 表示“是”。随着
计算机计算能力的提高,计算器处理数据的范围不断扩大,整型数据范围也在增加。目前 64 位整数、
128 位整数在部分机器或系统中已经成为基本数据类型。
1.3.2 浮点数据
浮点数有单精度浮点数、双精度浮点数两中基本类型。单精度浮点数占 4 个 byte(32 位),表示
数据的范围从 0-255 或-125 到 125。双精度浮点数占 8 个 byte(64 位),表示数据的范围从 0-255 或
-125 到 125。
1.3.3 字符型数据
字符型数据分两类,字符和字符串。字符型数据占 1 个 byte(8 位),表示“0”-“9”、“A”-
“Z”、“a”-“z”、“!”-“+”、“{”、“}”、“[”、“]”、“|”、“、”、“:”、“;”、“’”、“<”、“>”、“,”、“。”、
“?”、“/”等。
字符串数据由字符组成。根据存储方式的差异,字符串分为静态字符串和动态字符串。静态字
符串存储时包含一个表示字符串长度的字节,称为长度字节,位于存储的第一个字节。因此,静态
字符串最大容纳 255 个字符。
动态字符串没有长度的字节,字符串是以“0#”结尾。所以动态字符串又称为“零结尾字符串”
(Null-terminated String)。动态字符串没有长度限制,但一般机器或系统中,动态字符串长度小于 4GB。
1.3.4 结构数据
结构数据(STRUCTURE),有时又称记录(RECORD),是由若干基本数据类型构成。以下是
两个简单的结构数据,分别表示二维空间点和三维空间点。
T2DPoint=Record
X,Y:Real;
end;
T3DPoint=Record
X,Y,Z:Real;
end;
结构可以变得很复杂,实际上每一个数据文件可以看作一个结构。下面是一个表示文件头信息
的结构数据,不仅包含大量的基本数据类型、也包括预定义的结构数据类型,既嵌套结构数据。简
单的嵌套结构数据只有两层,复杂的嵌套结构数据只有三层甚至更多。
HeaderType=Record
OBjNum:Word;
XYOffset:LongInt;
2
XYSize:Longint;
IndexOffset:LongInt;
IndexSize:LongInt;
AttrOffset:LongInt;
AttrSize:LongInt;
Addr:Longint;
XYAddrIndex:Array of AddrIndexType;
AttrAddrIndex:Array of AddrIndexType;
ISubGrInfo:ISubGrInfoType;
IStrInfo:IStrInfoType;
ILineInfo:ILnInfoType;
Num1,Num2:SmallInt;
XYRange:RangeType;
ScreenType:Record ScrWid,ScrHei:single;end;
AttrIndexOffset,AttrIndexSize:Longint;
RangeOffset,rangeSize:LongInt;
end;
结构是数据文件最常见的数据类型,是构成数据文件的基本框架。分析数据文件所花费的时间
多数用在从大量的数据流中分离出一个个结构数据。
1.4 数据的存放顺序
长度超过 1 个字节的数据,在存储数据时,有存放顺序的问题。对于两字节整数,低位字节在
前,高位字节在后,如整数 5689,十六进制的存储格式为“$3916”。四字节整数,最低位字节在前,
高位字节在后,如整数 20060520,十六进制的存储格式为“$68193201”。
静态字符串数据占 n+1 个字节,n 为字符串的个数(不含结尾的 0#)。第一个字节为长度字节,
数值为 n 以后按顺序为各字符。
动态字符串占 n+1 个字节,n 为字符串的长度,第一个字符占第一位,以后按顺序占据位置,
最后一位为结束标志 0#。
1.5 数据文件结构
数据文件一般包含文件头和数据两部分,部分数据文件可能还包含索引表。因此分析数据文件
的第一步是弄清数据文件的基本框架,然后按照文件头、索引表、数据三部分依次分析、破解。
3
1.5.1 文件头
文件头一般在数据文件的开始。通常包含文件类型标识、所有者、版本信息、创建时间、文件
大小。
文件头中最重要的信息是文件的大小,它可以帮助程序员方便地访问整个数据文件。通常文件
的大小由四字节的一个长整数表示。
在分析数据文件时,由于文件的大小是可知的(通过 WINDOWS 的 GetFileSize 进程取得),因
此可以从分析文件的大小入手。
[例]:文件长度
1.5.2 索引表
索引表存放组成数据文件各部分的偏移地址、大小等相关信息,利用索引表可以方便地对数据
文件的各部分进行。通常文件各部分的偏移地址和大小由四字节长整数表示。
有些情况下,索引表与文件头是一起的。
1.5.3 数据部
数据部是数据文件的主题,通常在文件中占据大部分存储空间。一般情况下,数据部由相对独
立的数据块组成,每一个数据块表示不同的数据内容。分析数据部的第一步是将数据部分为若干数
据块。
数据块的内容和格式由数据块表达的内容决定,简单的数据块直接由最基本的数据类型构成,
这种情况比较少见。通常情况下,数据块比较复杂,不仅有简单的基本数据类型,更多的是由结构
数据类型或嵌套结构数据类型构成。
例如表示空间离散点位置的数据通常是一组实数对,其中表示二维空间的实数对由两个实数 X、
Y 构成、表示三维平面空间的实数对由三个实数 X、Y、Z 构成。这种数据块可以用 Array of T2Dpoint
或 Array of T3Dpoint 表示。
表示一组色彩的数据块,根据颜色生成方式,可以有三种数据形式:RGB 三色、CMKY 四色、
长整数,其中 RGB 三色、CMKY 四色分别由 3 字节和 4 字节组成,分别依次存放 R、G、B 和 C、
M、K、Y 色谱数据,每个色谱数据占 1 个字节。长整数直接代表一个颜色,WINDOWS 系统采用
此类颜色表示方法。这种数据筷仍然属于简单数据块,它可以用类似 Array of RGB 或 Array of CMKY
或 Array of LongInt 表示。
下组结构数据是用来描述矢量图中线图元数据块的,属于三层嵌套结构数据。
LnInfoType=record
ID:String[40];
//ID 编号
LinesNum, LType, AddedType, Color:Integer;
//线段数/线型/辅助线型/颜色
4