erbi_lucifer吧 关注:406贴子:3,325

【win32 ASM】File format parsing (part 8)

只看楼主收藏回复


一楼不给吞楼的度娘了……


1楼2013-05-02 12:05回复

    (一)文件组成
    一个ZIP文件包括:压缩文件数据区+压缩文件目录区+压缩文件目录结束区 3大结构。
    压缩文件目录区是ZIP中文件的索引,可以根据这个索引快速定位被压缩文件的所在位置,RAR中没有这个(rar中数据储存是连续的),这也是为什么大文件的压缩包中拉出一个文件ZIP要比RAR要快。当部分文件损坏的时候,也可以根据目录表恢复被损坏的文件。


    本楼含有高级字体3楼2013-05-02 12:06
    回复

      1. 压缩文件数据区:
      在数据区中每一个压缩的源文件/目录都是一条记录。
      格式:文件头+文件数据+数据描述符
      (1) 文件头:
      a. 文件头标志(0x0403b50) 4字节
      b. 解压文件所需pkwave版本 2字节
      c. 全局方式定位标识 2字节
      d. 压缩方式 2字节
      e. 最后修改时间 2字节
      f. 最后修改日期 2字节
      g. CRC -32 校检 4字节
      h. 压缩后尺寸 4字节
      i. 未压缩尺寸 4字节
      j. 文件名长度 2字节
      k. 扩展记录长度 2字节
      l. 文件名 由文件名长度决定
      m. 扩展字段 由扩展记录长度决定
      (2) 文件数据
      (3) 数据描述符(只有在“全局方式定位标识==1”的时候才存在)
      n. CRC-32 校检 4字节
      o. 压缩后尺寸 4字节
      p. 未压缩尺寸 4字节


      4楼2013-05-02 12:06
      回复

        2. 压缩文件目录区
        在这个数据区中每一条记录对应在压缩源文件数据区中的一条数据。
        a. 目录中文件文件头标志(0x02014b50) 4字节
        b. 压缩使用的pkware版本 2字节
        c. 解压文件所需pkware版本 2字节
        d. 全局方式定位标识 2字节
        e. 压缩方式 2字节
        f. 最后修改时间 2字节
        g. 最后修改日期 2字节
        h. CRC -32 校检 4字节
        i. 压缩后尺寸 4字节
        j. 未压缩尺寸 4字节
        k. 文件名长度 2字节
        l. 扩展记录长度 2字节
        m. 文件注释长度 2字节
        n. 磁盘开始号 2字节
        o. 内部文件属性 2字节
        p. 外部文件属性 4字节
        q. 局部头部偏移量 4字节
        r. 文件名不定长度 由文件名长度决定
        s. 扩展字段不定长度 由扩展记录长度决定
        t. 文件注释不定长度 由文件注释长度决定


        5楼2013-05-02 12:06
        回复

          3. 压缩文件目录结束标志
          a. 目录结束标记(0x06054b50) 4字节
          b. 当前磁盘编号 2字节
          c. 目录区开始磁盘编号 2字节
          d. 本磁盘上记录总数 2字节
          e. 目录区中记录总数 2字节
          f. 目录区尺寸大小 4字节
          g. 目录区对第一张磁盘的偏移量 4字节
          h. zip文件注释长度 2字节
          i. zip文件注释 由zip文件注释长度决定


          6楼2013-05-02 12:06
          回复

            (二)构建结构体
            根据文件结构我们可以构建下面的结构体,然后读取文件即可获取文件的信息。
            ; 压缩文件数据区:
            ZIP_FILE_HEARDER struct
            Flag BYTE 4 dup(?); 文件头标志
            ExPkwave_edition WORD ?; 解压文件所需pkwave版本
            Fix_flag WORD ?;全局方式定位标识
            Hoop_type WORD ?;压缩方式
            Last_edit_time WORD ?;最后修改时间
            Last_edit_day WORD ?;最后修改日期
            CRC_flag DWORD ?;CRC -32 校检
            Hoop_size DWORD ?;压缩后尺寸
            Source_size DWORD ?;未压缩尺寸
            Filename_length WORD ?;文件名长度
            Extern_length WORD ?;扩展记录长度
            ZIP_FILE_HEARDERends
            ; 数据描述符
            ZIP_DESCRIPTORstruct
            CRC_flag DWORD ?;CRC -32 校检
            Hoop_size DWORD ?;压缩后尺寸
            Source_size DWORD ?;未压缩尺寸
            ZIP_DESCRIPTORends
            ;目录区
            ZIP_INDEX struct
            Flag BYTE4 dup(?);目录中文件文件头标志
            HoopPkwave_edition WORD ?; 压缩文件所需pkwave版本
            ExPkwave_edition WORD ?; 解压文件所需pkwave版本
            Fix_flag WORD ?;全局方式定位标识
            Hoop_type WORD ?;压缩方式
            Last_edit_time WORD ?;最后修改时间
            Last_edit_day WORD ?;最后修改日期
            CRC_flag DWORD ?;CRC -32 校检
            Hoop_size DWORD ?;压缩后尺寸
            Source_size DWORD ?;未压缩尺寸
            Filename_length WORD ?;文件名长度
            Extern_length WORD ?;扩展记录长度
            Comment_length WORD ?;文件注释长度
            Disk_num WORD ?;磁盘开始号
            Bowel_file_att WORD ?;内部文件属性
            External_file_att DWORD ?;外部文件属性
            Hearder_pointer DWORD ?;局部头部偏移量
            ZIP_INDEXends
            ;目录结束标示
            ZIP_INDEX_ENDstruct
            Flag DWORD ?; 目录结束标记
            Disk_current_num WORD ?;当前磁盘编号
            Disk_num WORD ?;目录区开始磁盘编号
            Disk_total_num WORD ?;本磁盘上记录总
            Index_total_num WORD ?;目录区中记录总数
            Index_size DWORD ?;目录区尺寸大小
            Pointer_to_firstdisk DWORD ?;目录区对第一张磁盘的偏移量
            Comment_length WORD ?;zip文件注释长度
            ZIP_INDEX_ENDends


            本楼含有高级字体7楼2013-05-02 12:07
            回复

              (三)读取文件信息

              接下来以图标文件“1.zip”为例子读取它的结构信息。

              (1. 1.zip)


              本楼含有高级字体8楼2013-05-02 12:48
              回复

                (1) 图片“1.zip”的文件头(30字节)结构:
                一段记录包括:文件头结构(每一个文件头结构都以“50 4B 03 04”开始),文件名,扩展字段,被压缩的数据,数据描述符结构。
                压缩文件里面有多少个文件(包括文件夹)就有多少段记录。

                (1.zip的第一段记录中的文件头)
                1. 第1-4字节:数值是“50 4B 03 04”,故标记为“0x04034b50”。
                2. 第5-6字节:数值是“14 00”,故解压文件所需pkwave版本为:20。
                3. 第7-8字节:数值是“00 00”,故全局方式定位标识,没有数据描述符结构。
                4. 第9-10字节:数值是“08 00”,压缩方式为8。
                5. 第11-12字节:数值是“70 B7”,最后修改时间为46960。
                6. 第13-14字节:数值是“6D 41”,最后修改日期为16749。
                7. 第15-18字节:数值是“4A AA 0E 91”,故CRC -32 校检为:910EAA4A H。
                8. 第19-22字节:数值是“96 7B 14 00”,故压缩后尺寸为:1342358。
                9. 第23-26字节:数值是“00 4C 17 00”,故压缩后尺寸为:1526784。
                10. 第27-28字节:数值是“12 00”,文件名长度18字节。
                11. 第29-30字节:数值是“00 00”,扩展记录长度为0。
                故接下来的信息是18字节的文件名,没有扩展记录字段。接下来的就是存放该文件被压缩的数据,再接下来没有数据描述符结构。


                9楼2013-05-02 12:55
                回复


                  (18字节的文件名)
                  故读取结果为:


                  10楼2013-05-02 12:56
                  回复

                    同理,循环读取,直到所有文件头读取完毕(被压缩的数据没有进行读取)。
                    =================== 第1个文件 ===================
                    标志为 :PK
                    ExPkwave_edition :20
                    Fix_flag :0
                    Hoop_type :8
                    Last_edit_time :46960
                    Last_edit_day :16749
                    CRC_flag :910EAA4A
                    Hoop_size :1342358
                    Source_size :1526784
                    Filename_length :18
                    Extern_length :0
                    文件名:入侵锐捷服务器.doc
                    》》》》》》》》【这个位置就是存放压缩的数据】《《《《《《《《
                    =================== 第2个文件 ===================
                    标志为 :PK
                    ExPkwave_edition :20
                    Fix_flag :0
                    Hoop_type :8
                    Last_edit_time :45139
                    Last_edit_day :16972
                    CRC_flag :7A14648D
                    Hoop_size :392341
                    Source_size :399497
                    Filename_length :13
                    Extern_length :0
                    文件名:病毒编写.docx
                    》》》》》》》》【这个位置就是存放压缩的数据】《《《《《《《《
                    =================== 第3个文件 ===================
                    标志为 :PK
                    ExPkwave_edition :20
                    Fix_flag :0
                    Hoop_type :8
                    Last_edit_time :47192
                    Last_edit_day :16749
                    CRC_flag :BC1DF364
                    Hoop_size :17201693
                    Source_size :19110430
                    Filename_length :32
                    Extern_length :0
                    文件名:绿色兵团2010-2011年技术年刊.docx
                    》》》》》》》》【这个位置就是存放压缩的数据】《《《《《《《《
                    =================== 第4个文件 ===================
                    标志为 :PK
                    ExPkwave_edition :20
                    Fix_flag :0
                    Hoop_type :8
                    Last_edit_time :1152
                    Last_edit_day :11809
                    CRC_flag :581301A6
                    Hoop_size :5112
                    Source_size :32768
                    Filename_length :10
                    Extern_length :0
                    文件名:偷偷机.exe
                    》》》》》》》》【这个位置就是存放压缩的数据】《《《《《《《《


                    11楼2013-05-02 12:56
                    回复

                      (1) 目录结构(在文件尾部)
                      46字节的目录结构头:

                      (目录结构中第一条记录中的目录头)
                      1. 第1-4字节:数值是“50 4B 01 02”,故标记为“0x02014b50”。
                      2. 第5-6字节:数值是“3F 00”,故压缩文件所需pkwave版本63。
                      3. 第7-8字节:数值是“14 00”,故解压文件所需pkwave版本20。
                      4. 第9-10字节:数值是“00 00”,故全局方式定位标识为0。
                      5. 第11-12字节:数值是“08 00”,故压缩方式为8。
                      6. 第13-14字节:数值是“70 B7”,故最后修改时间为46960。
                      7. 第15-16字节:数值是“6D 41”,故最后修改日期为16749。
                      8. 第17-20字节:数值是“4A AA 0E 91”,故CRC -32 校检为910EAA4A H。
                      9. 第21-24字节:数值是“96 7B 14 00”,故压缩后尺寸1342358字节。
                      10. 第25-28字节:数值是“00 4C 17 00”,故未压缩尺寸1526784字节。
                      11. 第29-30字节:数值是“12 00”,故文件名长度为18。
                      12. 第31-32字节:数值为“24 00”,故扩展记录长度为36。
                      13. 第33-34字节:数值为“00 00”,故文件注释长度为0。
                      14. 第35-36字节:数值为“00 00”,故磁盘开始号为0。
                      15. 第37-38字节:数值为“00 00”,故内部文件属性为0。
                      16. 第39-42字节:数值为“20 00 00 00”,故外部文件属性为32。
                      17. 第43-46字节:数值为“00 00 00 00”,故局部头部偏移量为0。


                      12楼2013-05-02 12:57
                      回复

                        故接下来有18字节的文件名,36字节的扩展记录。

                        (18字节的文件名)
                        和首条记录的文件头后的文件名字段一样数值都是:
                        0121072fh: C8 EB C7 D6 C8 F1 BD DD B7 FE CEF1 C6 F7 2E 64 ; 入侵锐捷服务器.d
                        0121073fh: 6F 63 ; oc


                        13楼2013-05-02 12:59
                        回复


                          (36字节的扩展记录)
                          扩展记录为:
                          01210741h: 0A 00 20 00 00 00 00 00 01 00 1800 E3 BA 90 7C ; .. .........愫恷
                          01210751h: AF C1 CD 01 7D 48 AE 10 AF C1 CD01 7D 48 AE 10 ; ?}H??}H?
                          01210761h: AF C1 CD 01 ; ?
                          故读取结果为:


                          14楼2013-05-02 12:59
                          回复

                            同理,我们循环读取、直到所有目录读取完毕,可以得到:
                            =================== 压缩文件目录区 ===================
                            标志为 :PK
                            HoopPkwave_edition :63
                            ExPkwave_edition :20
                            Fix_flag :0
                            Hoop_type :8
                            Last_edit_time :45139
                            Last_edit_day :16972
                            CRC_flag :7A14648D
                            Hoop_size :392341
                            Source_size :399497
                            Filename_length :13
                            Extern_length :36
                            Comment_length :0
                            Disk_num :0
                            Bowel_file_att :0
                            External_file_att :32
                            Hearder_pointer :1342406
                            目录区文件名:病毒编写.docx
                            Zip_Extern:
                            0A 00 20 00 00 00 00 00 01 00 18 00 3E B4ED 9C 29 09 CE 01 58 90 EC 9D 8B 09 CE
                            0158 90 EC 9D 8B 09 CE 01
                            =================== 压缩文件目录区 ===================
                            标志为 :PK
                            HoopPkwave_edition :63
                            ExPkwave_edition :20
                            Fix_flag :0
                            Hoop_type :8
                            Last_edit_time :47192
                            Last_edit_day :16749
                            CRC_flag :BC1DF364
                            Hoop_size :17201693
                            Source_size :19110430
                            Filename_length :32
                            Extern_length :36
                            Comment_length :0
                            Disk_num :0
                            Bowel_file_att :0
                            External_file_att :32
                            Hearder_pointer :1734790
                            目录区文件名:绿色兵团2010-2011年技术年刊.docx
                            Zip_Extern:
                            0A 00 20 00 00 00 00 00 01 00 18 00 DE AB8B F1 AF C1 CD 01 E6 5E 88 9B AB C1 CD
                            01E6 5E 88 9B AB C1 CD 01
                            =================== 压缩文件目录区 ===================
                            标志为 :PK
                            HoopPkwave_edition :63
                            ExPkwave_edition :20
                            Fix_flag :0
                            Hoop_type :8
                            Last_edit_time :1152
                            Last_edit_day :11809
                            CRC_flag :581301A6
                            Hoop_size :5112
                            Source_size :32768
                            Filename_length :10
                            Extern_length :36
                            Comment_length :0
                            Disk_num :0
                            Bowel_file_att :0
                            External_file_att :32
                            Hearder_pointer :18936545
                            目录区文件名:偷偷机.exe
                            Zip_Extern:
                            0A 00 20 00 00 00 00 00 01 00 18 00 00 D87D B3 EA B0 C2 01 48 9A 25 A2 1D D2 CD
                            0133 E5 D1 C4 7C 2E CD 01


                            15楼2013-05-02 12:59
                            回复

                              (1) 压缩文件目录结束标志
                              在文件目录区紧接着的就是文件目录结束标志:

                              1. 第1-4字节:数值为“50 4B 05 06”目录结束标记为“0x06054B50”
                              2. 第5-6字节:数值为“00 00”,故当前磁盘编号为0
                              3. 第7-8字节:数值为“00 00”,故目录区开始磁盘编号
                              4. 第9-10字节:数值为“04 00”,故本磁盘上记录总数为4
                              5. 第11-12字节:数值为“04 00”,故目录区中记录总数为4
                              6. 第13-16字节:数值为“91 01 00 00”,故目录区尺寸大小为401
                              7. 第17-20字节:数值为“01 07 21 01”,故目录区对第一张磁盘的偏移量为18941697
                              8. 第21-22字节:数值为“28 01”,故zip文件注释长度为296


                              16楼2013-05-02 13:00
                              回复