2011-12-28 14 views
4

私はPEのディセクタに取り組んでいて、まれに何かに出くわしました。 PE形式のディレクトリの名前と順序は、あなたが見て場所に応じて異なるように見える:PEディレクトリの名前

PEReader (perdr)から:PEInfo

#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 

(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) 

In 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 Descriptorですが、CFF Explorerでは.NET MetaDataとして表示されます。 COMおよび遅延インポートのエントリも切り替わりそうです。

これらのツールのいくつかがこれを間違えてしまうことは奇妙に思えます。どちらが正しいか?新しい定義がないのですか?

答えて

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 

The WINE & PEReaderの定義は、この.hファイルから借りるだけです。ここでの言及もあり

:WINNT.Hで定義されている実際のところImageDirectoryEntryToDataEx function

3

PE仕様がMSによって文書化されている、あなたの最善の策は、彼らがpecoff.docで提供infoです:

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

私はそれを使用し、正しく覚えていれば、最後のエントリは、CLRランタイムヘッダーとして記述されています別の意味を持つようになりましたが(その理由はCOM Descriptorと呼ばれていますが)、今はCLRメタデータを指すために使用されています。

最後の3つの順序は、IAT、DelayImport、CLRです。他のものは単に間違っているだけで、ディレクトリは明らかに魔法のように動かない。

+2

.NETは以前はCOM +ランタイム(あるいはCOM2、NGWS ...)と呼ばれていました。したがって、さまざまな.Hファイルで見ることができるCOR接頭辞と、名前 'COMランタイム記述子 '。 –

0

は、ディレクトリの順序は、固定されています。 COM、遅延インポート、および.NETメタデータでさえ、ディレクトリテーブルの固定位置にあります!いくつかのツールは、独自の名前と順序でディレクトリを表示します。表現される方法は、PE仕様とは関係ありません。

関連する問題