关于PRI格式

PRI格式是微软最近使用的打包资源的格式。全称Package Resources Index。

最近试着研究此格式,然而功力不足,坑挖不动了。

要研究PRI,应该从微软提供的工具makepri.exe下手。这个工具提供了打包、解包PRI的功能。但是解包后想再封装回去,却不能做到。(就好像BAML能反编译为XAML,却不能再直接编译回XAML)微软MSDN关于PRI的页面

目前对于PRI的操作,只有一个成功案例:更换Win10登录背景的工具

好像此工具的开发者中有人对PRI格式较为熟悉,但他并没有透露更多信息。

这是我挖的坑:PriLib。目前还基本上没有实用价值。

这是用PriLib做的一个提取小娜动画的东西:

 

下面记录下PRI格式的已知内容:

——Header——

位置 大小 说明【默认值】
0 8字节(Char[]) PRI文件头【mrm_pri2】
8 2字节(Int16) 版本号(副?)【0】
10 2字节(Int16) 版本号(主?)【1】
12 4字节(Int32) 文件总大小
16 4字节(Int32) 未知【32】(可能是平台x86?)
20 4字节(Int32) Header大小【192】
24 2字节(Int16) Toc数【5】
26 2字节(Int16) Descriptor Index【-1】

接下来按照Toc数,每个Toc的Header信息:

大小 说明【默认值】
16字节(Char[])

Toc名
【[mrm_decn_info]、[mrm_pridescex]、[mrm_hschemaex]、

[mrm_res_map2_]、[mrm_dataitem]】

4字节(UInt32) Flags【0】
4字节(UInt32) SectionFlags【0】
4字节(Int32) Section相对于Header结束位置的偏移量
4字节(Int32) Section大小

——Header结束——【大小通常为192】

 

——TocSection——

对于每个Toc,有一段Section。每个Section的大小和内容是不同的。

每个Section的开头是相同的:

—SectionHeader—

16字节(Chars[]),Section名【与前面Header中的Toc对应】

8字节(Int32,Int32),未知【0】

4字节(Int32),Section长度【与前面Header中的Section大小对应

4字节(Int32),未知【0】

—SectionHeader结束—【大小通常为32】

然后就是每个Section的具体内容了。具体内容难以分析,可以通过makepri工具Dump出来的XML文件略见端倪。

mrm_hschemaex一节中显然有String流,存储了出现的所有字符串。

mrm_dataitem一节中记载了所包含资源Blob的数量、大小和位置等所有信息,然后就是Data部分了。

Data部分位于mrm_dataitem节内,按照前面记载的信息排列的所有资源文件的具体内容,通常无压缩。

资源部分的大小必须是8的倍数。不足在后面补0。

(更多已知信息参见PriLib)

SectionFooter—

4字节,Section结尾标志【0xDEF5FADE

4字节,Section长度【与前面Section长度对应

SectionFooter结束—

——TocSection结束——

 

——Footer——

位置
(相对于末尾)
大小 说明【默认值】
-16 4字节 PRI结尾标志【0xDEFFFADE】
-12 4字节

PRI文件总大小

【与Header中的文件总大小对应】

-8 8字节(Char[]) PRI文件头【mrm_pri2】

——Footer结束——

 
暂时就这些……希望有逆向巨巨继续研究。
不允许评论