我的PE瞭解

一、什麼是PE文件。

        PE(Portable Executable)格式,是微軟Win32環境可移植可執行文件(如exe、dll、vxd、sys和vdm等)的標準文件格式。

二、PE文件格式

        2.1RVA、VA和OFFSET轉換和理解

        OFFSET 就是010Editor以[0x00]開始的文件中的位置       OFFSET  = RVA-所屬區段的基址(VirtualAddress) + 所屬區段的節基於文件的偏移量(PointerToRawData)

        VA         就是內存映像中的位置,即地址                           VA          = RVA - ImageBase

        RVA       就是內存映像中的位置與文件映射基址的差      RVA        = VA+ImageBase

        2.2PE文件的關鍵頭

        DOS頭:

        IMAGE_DOS_HEADER[0x40]:

                 [0x00]WORD   e_magic;  所有MS-DOS兼容的可執行文件都將此值設爲0X5A4D(MZ).

                 [0x3c]DWORD e_lfanew;表示PE頭起始的位置.

       PE頭:文件信息都在其中

       struct _IMAGE_NT_HEADERS {
       0x00 DWORD Signature;                                               //PE頭標識
       0x04 _IMAGE_FILE_HEADER FileHeader;             
       0x18 _IMAGE_OPTIONAL_HEADER OptionalHeader;
       };

       IMAGE_NT_HEADERS[0x78]:前面0x78個字段固定

      區段表:保存各個區段的信息,如名稱、大小、VOffset、ROffset等

      IMAGE_SECTION_HEADER:

      區段:文件的信息全部在區段中

三、PE文件的數據資源信息——以user32.dll的輸出表信息爲例

(在文件中保存的位置均爲RVA所以在文件中查找位置需要轉換爲OFFSET)

      輸出表信息

      IMAGE_DIRECTORY_ENTRY_EXPORT
      struct _IMAGE_DATA_DIRECTORY {
      0x00 DWORD VirtualAddress;           //0x00010548——>Offset:0x00000948
      0x04 DWORD Size;                             //0x00005A7E
      };

      IMAGE_EXPORT_DIRECTORY[0x28]:0x00000948

      0x0c DWORD Name;文件名稱0x00012860——>0x00002C60跳過去就能看見user32.dll

      0x10 DWORD Base;函數基序號0x000005DC

      0x14 DWORD NumberOfFunctions;        函數數量      3EB
      0x18 DWORD NumberOfNames;             函數名數量 336
      0x1c DWORD AddressOfFunctions;         函數地址     0x00010570——>0x00000970

      跳過去0x000789CB——>0x00068DCB過去後是函數的OPCODE
      0x20 DWORD AddressOfNames;             函數名地址 0x0001151C——>0x0000191C

      跳過去0x0001286B——>0x00002C6B後面就是一個一個的函數名了
      0x24 DWORD AddressOfNameOrdinals;序號地址     0x000121F4——>0x000025F4跳過去就是函數的序號


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章