2011-12-28 6 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

Вам не нужно использовать что-либо недокументированное. Правильный файл найден в файле WinNT.h, который поставляется с Windows SDK (после установки на моем компьютере он находится в папке C: \ Program Files (x86) \ Microsoft SDK \ 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

Пе функции документированы 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 ...), поэтому префикс COR вы можете видеть в разных файлах .H, а также имя COM Runtime Descriptor '. –

0

В самом деле, порядок каталогов фиксирован, как это определено в winnt.h. Даже COM, Delay Import и .NET Metadata имеют фиксированную позицию в таблице каталогов! Некоторые инструменты показывают каталоги со своими именами и порядком. Способ, который представлен, не имеет ничего общего с спецификацией PE.