因为写pwcode项目的时候,遇到了需要获取预设文件数据的需求,加上网上没有预设编辑器,因此产生了逆向分析预设文件的想法,借助写的工具来提取需要的数据。
注意:本人基本没有逆向经验,本贴只是作为探索来记录的,不能保证是否正确与否,另外单词带有星号*特指个人推测,如果有错误遗漏之处欢迎讨论。
补充:FFX文件是AEP工程文件的子集,也就是说一旦解析FFX成功,不打开AE读取AEP工程信息也指日可待了。
FFX Binary
这边借助 HxD 软件来分析二进制,文件结构(一部分)如图所示:
目前只分析了一点点,下面放出个人总结的结构示意图(AE绘制):
Chunk
FFX由不同的Chunk(块)组成,每个Chunk由 ID + Size + Data 三个部分组成,其中第一个块必须是 "RIFX",其他块都是RIFX的SubChunk(子块),存放在"RIFX" Chunk Data里面。
[sc name="quote-black" ]注意:仅限RIFX和LIST这两个FormType(表单类型)才能包含SubChunk[/sc]
SubChunk
SubChunk可能是LIST容器,也可能是由ListType(列表类型)组成,注意ListType是无法包含SubChunk(子块)的,顶多几个ListType块并列。
ID
Chunk type identifier,中文叫块类型标识符,有FormType(表单类型)和ListType(列表类型)两种类型*。
标识符存在两种情况:
全部大写的标识符,FormType(表单类型),例如 RIFX LIST 等等
小写标识符,ListType(列表类型),例如 tdmn 等等
Size
32-bit unsigned value identifying (32位无符号值标识),暂时不清楚结构,占4个字节。
Data
二进制数据,最小占4字节,有20字节和40字节不等,如果值没有用完剩余空间,那么用 \0 也就是16进制的零零00 来填充右边剩余空间。
如果值是中文内容,使用UTF-8编码,那么一个汉字相当于占3个字节,具体以字符内容为准。
RIFX
RIFX 是RIFF的变种,使用大端字节序,而RIFF使用小端字节序,RIFF全称Resource Interchange File Format(资源交换文件格式)。
[sc name="quote-black" ]大端字节序:将数据的低位字节存放在内存的高位地址,也就是从左往右阅读字节内容,符合人眼阅读习惯。[/sc]
在FFX文件里,"RIFX" Chunk Data由Header(标头)和"LIST"块并列组成,这个"LIST"块可能只有一个父LIST或者由多个LIST并列(推测)。
LIST
LIST是一个容器,用来容纳各种SubChunk,理论上可以无限套娃。
Header
Header的ID值是"FaFXhead",全称"favorite effects header",标头代表这个文件是预设文件。
由于不清楚Size和Data的具体情况,暂时把Sise划入Data。ID占8个字节,Size和Data共占用20字节。
FormType
表单类型,目前只知道RIFX和LIST。
ListType
列表类型,这也是本贴的重点目标,预设文件按照块来储存数据,只要我们搞懂了每个子块的标识符以及块数据,我们就征服了预设!
Chunk type identifier
块类型标识符,预设文件的这些ID基本都是缩写,只能根据后面跟随的数据来分析用途。标识符相当于Key,二进制数据相当于Vaule,我们要获得需要的数据就需要指路的“索引”。
tdmn
全称猜测:Table Data MatchName 匹配名数据表
我们可以观察到,这个tdmn的Size二进制值都是 \0\0\0( 十六进制是 00 00 00 28,目前还不清楚含义先记下来。
tdmn后面跟随的Data是一个MatchName匹配名,匹配名包括:内置效果(插件)、所有图层属性、第三方插件等等,每个属性都有一个固定的匹配名,匹配名可以使用 / 来分类,具体可以去看脚本文档。
Data占用40字节,如果匹配名没用完40字节,那么右边剩余字节空间用\0填充,经过测试可以超过40字节。
tdsn
全称猜测:Table Data Source Name 源名称数据表
给匹配名自定义一个显示的源名称,如果我们要制作中文的伪效果面板,可以在后面添加的一个Utf8子块,就可以支持显示中文啦。
Size目前还不知道内容;Data的话,显示在效果控件的属性名,一般占用20字节,如果显示中文需要添加Utf8标识符和对应的Size,需要占用8个字节,那么给Utf8的Data数据块就只有20-8=12个字节,一个汉字占3字节,最多4个汉字。不过经过测试可以超过12个字节!
如果没有给Data指定数据,那么最小占用4个字节。
Utf8
Size目前还不知道内容;如果没有给Data指定数据,那么最小占用4个字节。其他看tdsn提到的解释部分。
我就研究了这一点点,最近琐事太多,逆向暂时搁置,帖子也只能写这点内容了,抱歉。
👍