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

回复:【win32 ASM】File format parsing (part 9)

只看楼主收藏回复


(1) 节表
节表的数量= ntHeader.FileHeader.NumberOfSections
如“1.exe”中有5个节表。

(第一个节表的信息)
1. 第1-8字节:数值为“2E 74 65 78 74 00 00 00”,即节表名称为“.text”。
2. 第9-12字节:数值为“D8 76 00 00”,即节区的尺寸物理地址
Misc: PhysicalAddress:0018ff64。
3. 第13-16字节:数值为“00 10 00 00”,即节区的RVA地址 VirtualAddress:00001000。
4. 第17-20字节:数值为“00 78 00 00”,即在文件中对齐后的尺寸 SizeOfRawData:00007800。
5. 第21-24字节:数值为“00 04 00 00”,即在文件中的偏移 PointerToRawData:00000400。
6. 第25-28字节:数值为“00 00 00 00”,即在OBJ文件中使用PointerToRelocations:00000000。
7. 第29-32字节:数值为“00 00 00 00”,即行号表的位置(供调试用)
PointerToLinenumbers:00000000。
8. 第33-34字节:数值为“00 00”,即在OBJ文件中使用 NumberOfRelocations:0000。
9. 第35-36字节:数值为“00 00”,即行号表中行号的数量 NumberOfLinenumbers:0000。
10. 第37-40字节:数值为“20 00 00 60”,即节的属性 Characteristics:60000020。
读取结果:


16楼2013-05-02 15:32
回复

    同理:剩下的4个节表(. rdata .data .rsrc .reloc)为:
    00000208h: 2E 72 64 61 74 61 00 00 AA 35 0000 00 90 00 00 ; .rdata..?...?.
    00000218h: 00 36 00 00 00 7C 00 00 00 00 0000 00 00 00 00 ; .6...|..........
    00000228h: 00 00 00 00 40 00 00 40 2E 64 6174 61 00 00 00 ; ....@..@.data...
    00000238h: 60 31 00 00 00 D0 00 00 00 10 0000 00 B2 00 00 ; `1...?......?.
    00000248h: 00 00 00 00 00 00 00 00 00 00 0000 40 00 00 C0 ; ............@..?
    00000258h: 2E 72 73 72 63 00 00 00 74 8D 0100 00 10 01 00 ; .rsrc...t?.....
    00000268h: 00 8E 01 00 00 C2 00 00 00 00 0000 00 00 00 00 ; .?..?.........
    00000278h: 00 00 00 00 40 00 00 40 2E 72 656C 6F 63 00 00 ; ....@..@.reloc..
    00000288h: 2E 14 00 00 00 A0 02 00 00 16 0000 00 50 02 00 ; .....?......P..
    00000298h: 00 00 00 00 00 00 00 00 00 00 0000 40 00 00 42 ; ............@..B


    17楼2013-05-02 15:32
    回复

      读取结果为:
      *************************[----节表----]**************************
      8个字节的节区名称 Name1:.rdata
      节区的尺寸物理地址Misc: PhysicalAddress:0018ff64
      节区的尺寸真实长度Misc: VirtualSize:000035aa
      节区的RVA地址 VirtualAddress:00009000
      在文件中对齐后的尺寸 SizeOfRawData:00003600
      在文件中的偏移 PointerToRawData:00007c00
      在OBJ文件中使用 PointerToRelocations:00000000
      行号表的位置(供调试用) PointerToLinenumbers:00000000
      在OBJ文件中使用 NumberOfRelocations:0000
      行号表中行号的数量 NumberOfLinenumbers:0000
      节的属性 Characteristics:40000040
      *************************[----节表----]**************************
      8个字节的节区名称 Name1:.data
      节区的尺寸物理地址Misc: PhysicalAddress:0018ff64
      节区的尺寸真实长度Misc: VirtualSize:00003160
      节区的RVA地址 VirtualAddress:0000d000
      在文件中对齐后的尺寸 SizeOfRawData:00001000
      在文件中的偏移 PointerToRawData:0000b200
      在OBJ文件中使用 PointerToRelocations:00000000
      行号表的位置(供调试用) PointerToLinenumbers:00000000
      在OBJ文件中使用 NumberOfRelocations:0000
      行号表中行号的数量 NumberOfLinenumbers:0000
      节的属性 Characteristics:c0000040
      *************************[----节表----]**************************
      8个字节的节区名称 Name1:.rsrc
      节区的尺寸物理地址Misc: PhysicalAddress:0018ff64
      节区的尺寸真实长度Misc: VirtualSize:00018d74
      节区的RVA地址 VirtualAddress:00011000
      在文件中对齐后的尺寸 SizeOfRawData:00018e00
      在文件中的偏移 PointerToRawData:0000c200
      在OBJ文件中使用 PointerToRelocations:00000000
      行号表的位置(供调试用) PointerToLinenumbers:00000000
      在OBJ文件中使用 NumberOfRelocations:0000
      行号表中行号的数量 NumberOfLinenumbers:0000
      节的属性 Characteristics:40000040
      *************************[----节表----]**************************
      8个字节的节区名称 Name1:.reloc
      节区的尺寸物理地址Misc: PhysicalAddress:0018ff64
      节区的尺寸真实长度Misc: VirtualSize:0000142e
      节区的RVA地址 VirtualAddress:0002a000
      在文件中对齐后的尺寸 SizeOfRawData:00001600
      在文件中的偏移 PointerToRawData:00025000
      在OBJ文件中使用 PointerToRelocations:00000000
      行号表的位置(供调试用) PointerToLinenumbers:00000000
      在OBJ文件中使用 NumberOfRelocations:0000
      行号表中行号的数量 NumberOfLinenumbers:0000
      节的属性 Characteristics:42000040


      18楼2013-05-02 15:32
      回复

        START:
        ;获取参数
        invoke GetCommandLine
        mov CommandLine,eax
        ;提取参数
        invoke PathGetArgs,CommandLine
        mov LpArg,eax mov esi,eax
        lodsb ;[esi]-->al
        cmp al,0
        je noArgs
        cmp al,34 ;双引号
        jne @F
        invoke PathUnquoteSpaces,LpArg ;去双引号
        mov LpArg,eax
        @@:
        invoke CreateFile,LpArg, GENERIC_READ,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
        .if eax!=INVALID_HANDLE_VALUE
        mov hFile, eax
        invoke ReadFile,hFile, addr dosHeader, sizeof dosHeader, addr dwRead, NULL
        .if dwRead == sizeof dosHeader
        .if dosHeader.e_magic == IMAGE_DOS_SIGNATURE ; 是不是有效的DOS头?
        invoke PrintDosHearder,dosHeader
        invoke SetFilePointer,hFile, dosHeader.e_lfanew, NULL, FILE_BEGIN
        .if eax!=-1
        invoke ReadFile,hFile, addr ntHeader, sizeof ntHeader, addr dwRead, NULL
        invoke PrintNTHearder,ntHeader
        .if dwRead == sizeof ntHeader
        .if ntHeader.Signature == IMAGE_NT_SIGNATURE ; 是不是有效的NT头
        .while ntHeader.FileHeader.NumberOfSections > 0
        invoke ReadFile,hFile,addr seHeader,sizeof seHeader,addr dwRead,NULL
        invoke PrintSectionHearder,seHeader
        dec ntHeader.FileHeader.NumberOfSections
        .endw
        .endif
        .endif
        .endif
        .endif
        .endif
        .else
        .endif
        invoke CloseHandle, hFile
        jmp endexit
        noArgs:
        invoke StdOut,addr lpMsg
        jmp endexit
        openerror:
        invoke StdOut,addr lpMsg_fileerr
        jmp endexit
        endexit:
        ;暂停显示,回车键关闭
        invoke StdIn,addr buffer,sizeof buffer
        invoke ExitProcess,0


        20楼2013-05-02 15:35
        回复

          PrintDosHearder proc dosH:IMAGE_DOS_HEADER
          invoke StdOut,addr nextline
          invoke StdOut,addr nextline
          invoke wsprintf,addr info,CTXT("*************************[----DOS块----]*************************",13,10)
          invoke StdOut,addr info
          invoke StdOut,addr nextline
          invoke StdOut,addr nextline
          invoke wsprintf,addr info,CTXT("DOS可执行文件标记,MZ:%04x",13,10),dosH.e_magic
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_cblp:%04x",13,10),dosH.e_cblp
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_cp:%04x",13,10),dosH.e_cp
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_crlp:%04x",13,10),dosH.e_crlc
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_cparhdr:%04x",13,10),dosH.e_cparhdr
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_minalloc:%04x",13,10),dosH.e_minalloc
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_maxalloc:%04x",13,10),dosH.e_maxalloc
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("DOS代码的初始化堆栈段 e_ss:%04x",13,10),dosH.e_ss
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("DOS代码的初始化堆栈指针 e_sp:%04x",13,10),dosH.e_sp
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_csum:%04x",13,10),dosH.e_csum
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("DOS代码的入口IP e_ip:%04x",13,10),dosH.e_ip
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("DOS代码的入口CS e_cs:%04x",13,10),dosH.e_cs
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_lfarlc:%04x",13,10),dosH.e_lfarlc
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_ovno:%04x",13,10),dosH.e_ovno
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_res 4 dup(?):%04x",13,10),dosH.e_res
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_oemid:%04x",13,10),dosH.e_oemid
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_oeminfo:%04x",13,10),dosH.e_oeminfo
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("e_res2 10 dup(?):%04x",13,10),dosH.e_res2
          invoke StdOut,addr info
          invoke wsprintf,addr info,CTXT("指向PE文件头 e_lfanew:%04x",13,10),dosH.e_lfanew
          invoke StdOut,addr info
          ret
          PrintDosHearder endp


          21楼2013-05-02 15:36
          回复

            PrintNTHearder proc ntH:IMAGE_NT_HEADERS32
            local num:DWORD
            invoke StdOut,addr nextline
            invoke StdOut,addr nextline
            invoke wsprintf,addr info,CTXT("*************************[----PE文件头----]*************************",13,10)
            invoke StdOut,addr info
            invoke StdOut,addr nextline
            invoke StdOut,addr nextline
            invoke wsprintf,addr info,CTXT("PE文件标识:%04x",13,10),ntH.Signature
            invoke StdOut,addr info
            invoke StdOut,addr nextline
            invoke StdOut,addr nextline
            invoke wsprintf,addr info,CTXT("*************************IMAGE_FILE_HEADER结构*************************",13,10)
            invoke StdOut,addr info
            invoke StdOut,addr nextline
            invoke StdOut,addr nextline
            invoke wsprintf,addr info,CTXT("运行平台 Machine:%04x",13,10),ntH.FileHeader.Machine
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("文件的节数目 NumberOfSections::%08x",13,10),ntH.FileHeader.NumberOfSections
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("文件创建日期和时间 TimeDateStamp:%08x",13,10),ntH.Signature
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("指向符号表(用于调试) PointerToSymbolTable:%08x",13,10),ntH.FileHeader.PointerToSymbolTable
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("符号表中的符号数量(用于调试) NumberOfSymbols:%08x",13,10),ntH.FileHeader.NumberOfSymbols
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("IMAGE_OPTIONAL_HEADER32结构的长度 SizeOfOptionalHeader:%04x ",13,10),ntH.FileHeader.SizeOfOptionalHeader
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("文件属性 Characteristics:%04x",13,10),ntH.FileHeader
            invoke StdOut,addr info
            invoke StdOut,addr nextline
            invoke StdOut,addr nextline
            invoke wsprintf,addr info,CTXT("**************IMAGE_OPTIONAL_HEADER32结构**************",13,10)
            invoke StdOut,addr info
            invoke StdOut,addr nextline
            invoke StdOut,addr nextline
            invoke wsprintf,addr info,CTXT("ROMImage,exeImage Magic:%04x",13,10),ntH.OptionalHeader.Magic
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("链接器版本号 MajorLinkerVersion:%08x",13,10),ntH. OptionalHeader.MajorLinkerVersion
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("MinorLinkerVersion:%08x ",13,10),ntH. OptionalHeader.MinorLinkerVersion
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("所有含代码的节的总大小 SizeOfCode:%08x",13,10),ntH.OptionalHeader.SizeOfCode
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("所有含已初始化数据的节的总大小 SizeOfInitializedData:%08x ",13,10),ntH.OptionalHeader.SizeOfInitializedData
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("所有含未初始化数据的节的大小 SizeOfUninitializedData:%08x ",13,10),ntH.OptionalHeader.SizeOfUninitializedData
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("程序执行入口RVA AddressOfEntryPoint:%08x",13,10),ntH.OptionalHeader.AddressOfEntryPoint
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("代码的节的起始RVA BaseOfCode:%08x",13,10),ntH.OptionalHeader.BaseOfCode
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("数据的节的起始RVA BaseOfData:%08x",13,10),ntH.OptionalHeader.BaseOfData
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("程序的建议装载地址 ImageBase:%08x",13,10),ntH.OptionalHeader.ImageBase
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("内存中的节的对齐粒度 SectionAlignment:%08x",13,10),ntH.OptionalHeader.SectionAlignment
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("文件中的节的对齐粒度 FileAlignment:%08x",13,10),ntH. OptionalHeader.FileAlignment
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT(" 操作系统主版本号 MajorOperatingSystemVersion:%04x",13,10),ntH.OptionalHeader.MajorOperatingSystemVersion
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("操作系统副版本号 MinorOperatingSystemVersion:%04x",13,10),ntH.OptionalHeader.MinorOperatingSystemVersion
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT(":可运行于操作系统的最小版本号 MajorImageVersion:%04x",13,10),ntH.OptionalHeader.MajorImageVersion
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("MinorImageVersion:%04x",13,10),ntH.OptionalHeader.MinorImageVersion
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("可运行于操作系统的最小子版本号 MajorSubsystemVersion:%04x",13,10),ntH.OptionalHeader.MajorSubsystemVersion
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("MinorSubsystemVersion:%04x",13,10),ntH. OptionalHeader.MinorSubsystemVersion
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("未用 Win32VersionValue:%08x",13,10),ntH.OptionalHeader.Win32VersionValue
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("内存中整个PE映像尺寸 SizeOfImage:%08x",13,10),ntH.OptionalHeader.SizeOfImage
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("所有头+节表的大小 SizeOfHeaders:%08x",13,10),ntH.OptionalHeader.SizeOfHeaders
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("校检码CheckSum:%08x :%04x",13,10),ntH. OptionalHeader.CheckSum
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("文件的子系统 Subsystem:%08x",13,10),ntH.OptionalHeader.Subsystem
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("DllCharacteristics:%04x",13,10),ntH.OptionalHeader.DllCharacteristics
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("初始化时的堆栈大小 SizeOfStackReserve:%08x ",13,10),ntH.OptionalHeader.SizeOfStackReserve
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("初始化时实际提交的堆栈大小 SizeOfStackCommit:%08x",13,10),ntH.OptionalHeader.SizeOfStackCommit
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("初始化时保留的堆大小 SizeOfHeapReserve:%08x",13,10),ntH.OptionalHeader.SizeOfHeapReserve
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("初始化时实际提交的堆大小 SizeOfHeapCommit:%08x",13,10),ntH.OptionalHeader.SizeOfHeapCommit
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("未用 LoaderFlags:%08x ",13,10),ntH. OptionalHeader.LoaderFlags
            invoke StdOut,addr info
            invoke wsprintf,addr info,CTXT("下面的数据目录结构的数量 NumberOfRvaAndSizes:%08x ",13,10),ntH.OptionalHeader.NumberOfRvaAndSizes
            invoke StdOut,addr info
            mov num,0
            .while num< 16
            lea eax, ntH.OptionalHeader.DataDirectory.VirtualAddress
            imul ecx,num,8
            add eax,ecx
            mov ebx,[eax]
            invoke wsprintf,addr info,CTXT("IMAGE_DATA_DIRECTORY [%02d]. DataDirectory.VirtualAddress:%08x ",13,10),num,ebx
            invoke StdOut,addr info
            lea eax, ntH.OptionalHeader.DataDirectory.isize
            imul ecx,num,8
            add eax,ecx
            mov ebx,[eax]
            invoke wsprintf,addr info,CTXT("IMAGE_DATA_DIRECTORY [%02d]. DataDirectory.isize: %08x",13,10),num,ebx
            invoke StdOut,addr info
            inc num
            .endw
            ret
            PrintNTHearder endp


            22楼2013-05-02 15:36
            回复

              PrintSectionHearder proc SecH:IMAGE_SECTION_HEADER
              invoke StdOut,addr nextline
              invoke StdOut,addr nextline
              invoke wsprintf,addr info,CTXT("*************************[----节表----]**************************",13,10)
              invoke StdOut,addr info
              invoke StdOut,addr nextline
              invoke StdOut,addr nextline
              invoke wsprintf,addr info,CTXT("8个字节的节区名称 Name1:%s",13,10),addr SecH.Name1
              invoke StdOut,addr info
              invoke wsprintf,addr info,CTXT("节区的尺寸 物理地址Misc: PhysicalAddress:%08x",13,10),addr SecH.Name1
              invoke StdOut,addr info
              invoke wsprintf,addr info,CTXT("节区的尺寸 真实长度Misc: VirtualSize:%08x",13,10), SecH.Misc.VirtualSize
              invoke StdOut,addr info
              invoke wsprintf,addr info,CTXT("节区的RVA地址 VirtualAddress:%08x",13,10), SecH.VirtualAddress
              invoke StdOut,addr info
              invoke wsprintf,addr info,CTXT("在文件中对齐后的尺寸 SizeOfRawData:%08x",13,10), SecH.SizeOfRawData
              invoke StdOut,addr info
              invoke wsprintf,addr info,CTXT("在文件中的偏移 PointerToRawData:%08x",13,10), SecH.PointerToRawData
              invoke StdOut,addr info
              invoke wsprintf,addr info,CTXT("在OBJ文件中使用 PointerToRelocations:%08x",13,10), SecH.PointerToRelocations
              invoke StdOut,addr info
              invoke wsprintf,addr info,CTXT("行号表的位置(供调试用) PointerToLinenumbers:%08x",13,10), SecH.NumberOfRelocations
              invoke StdOut,addr info ;
              invoke wsprintf,addr info,CTXT("在OBJ文件中使用 NumberOfRelocations:%04x",13,10), SecH.NumberOfRelocations
              invoke StdOut,addr info
              invoke wsprintf,addr info,CTXT("行号表中行号的数量 NumberOfLinenumbers:%04x",13,10), SecH.NumberOfLinenumbers
              invoke StdOut,addr info
              invoke wsprintf,addr info,CTXT("节的属性 Characteristics:%08x",13,10), SecH.Characteristics
              invoke StdOut,addr info
              ret
              PrintSectionHearder endp
              end START


              23楼2013-05-02 15:36
              回复