|
本帖最后由 liucqa 于 2017-6-15 08:42 编辑
http://msdn.microsoft.com/en-us/library/cc313106(v=office.12).aspx 参考此文档456页
1、查找10 00 11 10 得到压缩数据流起始位置。(正规的方法需要从docInfoList里面找,参见三楼)
2、数据流的格式如下:
10 00 11 10 XX XX XX XX (4字节rh.reclen, 压缩包的大小) XX XX XX XX (Uncompress Size 解压缩之后的大小) 78 9C (或78 01,表示Zlib的头)
... Raw数据流 ...
XX XX XX XX (4字节,采用Adler32算法的CRC checksum)
3、78 9C 后面的数据就是deflate的Raw数据流,长度是rh.reclen-6-4。在上图中,rh.reclen是7C 1E 00 00,也就是0x1E7C=7804个字节(十进制)。
实际的deflate的Raw数据流从Zlib头之后开始,长度为7804-0x10=7794,即1E72。最后是4字节的校验和(48 AF 2A 3A)。
4、在上图中,0x107b8+1E72-1=0x12629,即0x107B8~0x12629就是deflate的Raw数据流。最后的4个字节是Zlib的Adler32的CRC checksum。
5、对0x107B8~0x12629的数据进行解压缩,就得到了PPT文件中的VBA Stream流。计算解压缩的文件CRC checksum,如果与 48 AF 2A 3A相同,说明解压缩正确。
此方法只是个示例,不能照搬用于所有的2003 PPT文件.
因为ppt里面的VBA Zlib流在文件中的存储可能不是连续的,需要提取 PowerPoint Document流之后,再参考上面的方法处理
|
|