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

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

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

    我们从现在开始,就一个ole文件的解析展开来说下里面具体涉及到的知识点,以及恶意代码可能出现的地方。
    解析文件的头部是我们首先要做的工作,上一篇博客给大家说了这个结构体,我们来拿一个sample看看里面的数据:

    d0 cf 11 e0 a1 b1 1a e1 00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00 3e 00 03 00 fe ff 09 00
    06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
    27 00 00 00 00 00 00 00 00 10 00 00 29 00 00 00
    01 00 00 00 fe ff ff ff 00 00 00 00 26 00 00 00
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
    

    以上是全部512个字节头部的数据,首先是OLE文件的标志总共8个字节:

    0x0000-0x0007:d0 cf 11 e0 a1 b1 1a e1
    

    这8个字节是解析文件最关键的地方之一,如果头部标识不是这8个字节,我们在解析过程中应该退出解析程序。

    0x0008-0x0017:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    

    这16个字节的数据是GUID,这是独有的ID,也可能全部为0,此时这个文件刚好此处全部为0。

    0x0018-0x0019:3e 00
    

    这两个字节是文件格式修订版本号,最多被使用的就是0x003E。

    0x001A-0x001B:03 00 fe ff
    

    这两个字节是文件格式的版本号,最多被使用的是0x0003

    0x001C-0x001D:fe ff
    

    对于文件中字节存放顺序是打断还是小端的问题:如果是FEFF,则是小端,如果是FFFE,则是大端。对于我们目前这个文件是小端。

    0x001E-0x001F:09 00
    

    复合文件中的节区数量,真实的节区大小是29字节,这个值的最小值是7,27个字节的大小。当前的文件中该值是9.

    0x0020-0x0021:06 00
    

    文件中short-section的大小,最多被用到的就是当前的数值6,也就是26个字节,当然这个值也是有最大值的,这个值的最大值是上面提到的那个字段(section)的大小。

    0x0022-0x002b:00 00 00 00 00 00 00 00 00 00
    

    保留值,全0

    0x002c-0x002f:01 00 00 00
    

    主扇区配置表中用到的数目,此文件是1,如果这个值大于109(头部最后一个字段数组的大小),则很可能是stream太多,用到了附加扇区配置表。

    0x0030-0x0033:27 00 00 00 
    

    目录流中的第一个section id,之前就说过,整个存放数据的section是一个链,而这是整个链的索引开端,但是需要注意的是,这是directory stream。

    0x0034-0x0037:00 00 00 00
    

    保留值0

    0x0038-0x003b:00 10 00 00
    

    mini stream的值,最多用的就是0x1000,当我们在解析数据时候,如果一个stream中数据的真实大小小于0x1000,那么这些数据存放于short-section中,否则用另一种方法找到数据(之后在结合代码解析过程中会提到)。

    0x003c-0x003f:29 00 00 00
    

    这个字段是short-section的第一个section id,里面存放着小于0x1000的数据流中的数据。

    0x0040-0x0043:01 00 00 00
    

    short-section整个表中,用到的section总数,此处是1。

    0x0044-0x0047:fe ff ff ff
    

    这是附加的主扇区配置表,如果没有附加的配置表,则此值为-2(0xfffffffe)。

    0x0048-0x004b:00 00 00 00 
    

    附加主配置表中的总共section数,因为上一字段为-2,所以此处肯定为0。

    0x004c-0x01ff:数据太多,就不粘贴了
    

    这个是存放在主扇区配置表中一些section Id 后期会利用这些section Id 来定位找到对应数据的索引,进行数据取出。
    over,头部解析结束,下一篇开始进行数据取出。

    “Great works are performed not by strength, but by perseverance.”

    cs
    下一篇:没有了