当前位置 博文首页 > KOOKNUT的博客:Office复合文件格式(壹)

    KOOKNUT的博客:Office复合文件格式(壹)

    作者:[db:作者] 时间:2021-07-02 18:35

    之前说好的更新,因为私人原因,有点事所以耽搁了,没能去及时的更新,今天先更新一下,下周可能要回趟学校,又无法更新了。
    今天我想说的是Office复合文件格式,之前一直在学习PE方面的知识(有关PE的那些博客,我之后也会抽空更新,今天想说说非PE),所以研究的文件格式主要集中在PE文件方面,最近有幸接触到非PE文件格式,想和大家一起分享学习一下这个格式,之所以进行这个文件的学习,因为其也是病毒的载体文件中的一种,非PE文件格式太多太杂,我们就先从最常见的Office文件类型开始。因为对非PE感兴趣的人可能不是很多,所以国内相关的文档不是很多,所以我也去国外的网站看过一些文章,以及非PE病毒攻击方式。我自己也翻阅了微软有关该文件格式的文档,今天是第一篇,就随便说点,说到哪儿算哪儿。
    我对于概念的理解:Office复合文档结构,说直白一点其内部就相识一个文件系统一样,文件系统中,我们有各层目录,然后最终到达我们存储数据的文件。对于Office文档来说,也是一样的,它会把其中的数据分别存放到很多个数据流中(stream),而这些数据流又保存在不同的storage(翻译过来是仓库,也太挫了,就中英混杂了,装个b)里面。其大致可以用下图来表示:
    在这里插入图片描述
    和PE文件相似,复合文档也有自己的文件头部,今天我说的都是word97-03的文档,其word文档后缀是.doc,而这个文档类型又称为OLE文件。我们先从OLE文件的头部说起。
    在这里插入图片描述
    我们可以从图中的我所打开的文件左侧十六进制编码,开头的\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1这8个字节是固定的,一般也被用来校验OLE文件的第一道防线,这就是OLE文件的标志。
    我自己代码中的结构体和一点简单注释有关这个512字节大的结构头部。

    typedef struct _OLEHeader_
    {
    	BYTE	Signature[8];			//OLE文件标识符 "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1";
    
    	GUID	clsidNULL;				//Unique Id,May be All 0  
    
    	USHORT	VerMinor;				//Minor Version Most used is 003E
    
    	USHORT	VerDll;					//DLL Version Most used is 0003
    
    	USHORT	ByteOrder;				//字节序 小端0xFEFF 大端0xFFFF
    
    	USHORT  SectorShift;			//符合文档中sector的大小,最小是7 也就是2^7 (128字节)最多的是9也就是512字节
    	USHORT	MiniSecShift;			//minisector size Short-stream in the short-stream container stream ,Most used 2^6(64字节) 
    
    	USHORT  Reserved;				//保留值 0
    	ULONG	Reserved2;				//0
    	ULONG	NumDirSects;			//0
    
    	ULONG	NumFatSects;			//主扇区配置表使用总数
    
    	ULONG	DirSect1;				//Section Id of first section of directory stream
    
    	ULONG	TransactSig;			//一般为0
    
    	ULONG	MniStrMax;				//max value of mini stream一般为0x1000
    
    	ULONG	MiniFatSect1;			//Section id of first sector of the Short-sector
    	ULONG	NumMiniFatSects;		//Number of sections used by Short-sector
    
    	ULONG	DifatSect1;				//附加的主扇区配置表
    	ULONG	NumDifatSects;          //大小
    
    	ULONG	DiFat[109];				//主扇区配置表  偏移0x4C
    }OLEHeader, *POLEHeader;
    

    关于这些结构中的各个重要字段,我之后会结合一个doc文档,细细的来说,纸上得来终觉浅,绝知此事要躬行,对于文件结构学习之后,字节也写了一个ole文件解析的代码,后面会结合文档来细细了解这个文件结构。今天就先到这里,下次更新时间,待定…
    按照惯例本来是一句诗句结尾的,今日不吟诗。我好兄弟昨日当兵去了,我人在北京,也没办法去送送他,所以今天在这里为他送上祝福:披上军装的你,必然有着飒爽英姿,必然会所向披靡,愿你为国效力,平安归来。两年后当兵归来,兄弟们定为你接风洗尘!还有就是,我真的特别为你感到自豪,军人最帅!!!To:HDX

    cs