2011-12-28 84 views
4

我正在研究PE解剖器,並且遇到了一些相當不尋常的事情。的名稱和在PE格式的目錄順序似乎不同取決於你往哪裏看:PE目錄的名稱

PEReader (perdr)

#define IMAGE_DIRECTORY_ENTRY_EXPORT   0 // Export Directory 
#define IMAGE_DIRECTORY_ENTRY_IMPORT   1 // Import Directory 
#define IMAGE_DIRECTORY_ENTRY_RESOURCE  2 // Resource Directory 
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION  3 // Exception Directory 
#define IMAGE_DIRECTORY_ENTRY_SECURITY  4 // Security Directory 
#define IMAGE_DIRECTORY_ENTRY_BASERELOC  5 // Base Relocation Table 
#define IMAGE_DIRECTORY_ENTRY_DEBUG   6 // Debug Directory 
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data 
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR  8 // RVA of GP 
#define IMAGE_DIRECTORY_ENTRY_TLS    9 // TLS Directory 
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory 
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers 
#define IMAGE_DIRECTORY_ENTRY_IAT   12 // Import Address Table 
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors 
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor 

PEInfo(校正到0基):

0 Export 
1 Import 
2 Resource 
3 Exception 
4 Security 
5 Base Reloc 
6 Debug 
7 Copyright 
8 Global Ptr 
9 TLS 
10 Load Config 
11 Bound Import 
12 IAT 
13 COM 
14 Delay Import 
15 (reserved) 

CFF Explorer

0 Export 
1 Import 
2 Resource 
3 Exception 
4 Security 
5 Relocation 
6 Debug 
7 Architecture 
8 (reserved) 
9 TLS 
10 Configuration 
11 Bound Import 
12 IAT 
13 Delay Import 
14 .NET MetaData 

WINE's winnt.h

#define IMAGE_DIRECTORY_ENTRY_EXPORT   0 
#define IMAGE_DIRECTORY_ENTRY_IMPORT   1 
#define IMAGE_DIRECTORY_ENTRY_RESOURCE   2 
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION   3 
#define IMAGE_DIRECTORY_ENTRY_SECURITY   4 
#define IMAGE_DIRECTORY_ENTRY_BASERELOC   5 
#define IMAGE_DIRECTORY_ENTRY_DEBUG    6 
#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT   7 
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR   8 /* (MIPS GP) */ 
#define IMAGE_DIRECTORY_ENTRY_TLS    9 
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG  10 
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT  11 
#define IMAGE_DIRECTORY_ENTRY_IAT    12 /* Import Address Table */ 
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT  13 
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 

在這裏,他們是作爲一個表:

+------+-------------------+-------------------+-------------------+-------------------+ 
| Dir# | WINE's winnt.h | PEReader   | PEInfo   | CFF Explorer  | 
+------+-------------------+-------------------+-------------------+-------------------+ 
| 0 | Export   | Export   | Export   | Export   | 
| 1 | Import   | Import   | Import   | Import   | 
| 2 | Resource   | Resource   | Resource   | Resource   | 
| 3 | Exception   | Exception   | Exception   | Exception   | 
| 4 | Security   | Security   | Security   | Security   | 
| 5 | Relocation  | Relocation  | Relocation  | Relocation  | 
| 6 | Debug    | Debug    | Debug    | Debug    | 
| 7 | Copyright   | Architecture  | Copyright   | Architecture  | 
| 8 | Global Ptr  | Global Ptr  | Global Ptr  | (reserved)  | 
| 9 | TLS    | TLS    | TLS    | TLS    | 
| 10 | Load Config  | Load Config  | Load Config  | Load Config  | 
| 11 | Bound Import  | Bound Import  | Bound Import  | Bound Import  | 
| 12 | IAT    | IAT    | IAT    | IAT    | 
| 13 | Delay Import  | Delay Import  | COM    | Delay Import  | 
| 14 | COM Descriptor | COM Descriptor | Delay Import  | .NET MetaData  | 
| 15 | -     | -     | (reserved)  | -     | 
+------+-------------------+-------------------+-------------------+-------------------+ 

編號和這些訂單似乎沒有正確地匹配。在PEReader和winnt.h中,條目14都是COM描述符,但是在CFF Explorer中顯示爲.NET MetaData。 COM和Delay Import條目似乎也被切換了。

似乎有些奇怪的是,其中幾個工具會導致這個錯誤。哪一個是正確的?我錯過了一個更新的定義嗎?

回答

6

您不必使用任何未公開的內容。正確的一個可以在Windows SDK附帶的WinNT.h文件中找到(一旦安裝,在我的機器上,它位於C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Include):

// Directory Entries 

#define IMAGE_DIRECTORY_ENTRY_EXPORT   0 // Export Directory 
#define IMAGE_DIRECTORY_ENTRY_IMPORT   1 // Import Directory 
#define IMAGE_DIRECTORY_ENTRY_RESOURCE  2 // Resource Directory 
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION  3 // Exception Directory 
#define IMAGE_DIRECTORY_ENTRY_SECURITY  4 // Security Directory 
#define IMAGE_DIRECTORY_ENTRY_BASERELOC  5 // Base Relocation Table 
#define IMAGE_DIRECTORY_ENTRY_DEBUG   6 // Debug Directory 
//  IMAGE_DIRECTORY_ENTRY_COPYRIGHT  7 // (X86 usage) 
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data 
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR  8 // RVA of GP 
#define IMAGE_DIRECTORY_ENTRY_TLS    9 // TLS Directory 
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory 
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers 
#define IMAGE_DIRECTORY_ENTRY_IAT   12 // Import Address Table 
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors 
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor 

WINE & PEReader的定義只是(正確地我相信)借用這個.h文件。

還有一個在這裏提到:ImageDirectoryEntryToDataEx function

3

的PE規格由MS記錄,最好的辦法是他們pecoff.doc提供信息:

http://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx

中的最後一項被描述爲CLR運行頭,如果我沒有記錯它使用有不同的含義(這就是爲什麼有人稱之爲COM描述符),但現在用於指向CLR元數據。

最後三位的順序是IAT,DelayImport,CLR。其他任何事情都是錯的,目錄顯然不會奇蹟般地轉向。

+2

在2001年之前,.NET最初被稱爲'COM + Runtime'(或者也是COM2或NGWS ...),因此可以在各種.H文件中看到COR前綴,以及名稱'COM運行時描述符「。 – 2011-12-28 16:33:28

0

由於事實上,原有的次序是固定的,在WINNT.H中定義。 即使COM,延遲導入和.NET元數據在目錄表中都有固定的位置!有些工具會以自己的名字和順序顯示目錄。表示的方式與PE規範無關。