2011-12-28 7 views
4

나는 PE 해부학자에서 일하고 있는데 다소 특이한 것을 발견했다.PE 디렉토리의 이름

PEReader (perdr)에서 : 이름과 PE 형식의 디렉토리의 순서는 당신이 보는 위치에 따라 달라 보인다

#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 Descriptor이지만 CFF Explorer에서는 .NET MetaData로 표시됩니다. COM 및 지연 가져 오기 항목도 전환 된 것 같습니다.

이러한 도구 중 몇 가지가 잘못되었을 수 있습니다. 어느 것이 옳은가요? 더 새로운 정의가 빠졌습니까?

답변

6

문서화되지 않은 것을 사용할 필요는 없습니다. 올바른 컴퓨터는 Windows SDK과 함께 제공되는 WinNT.h 파일에 있습니다 (컴퓨터에 설치되면 C : \ Program Files (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 파일에서 빌려주는 것입니다. 여기에 대한 언급도있다

: WINNT.H에 정의 된 사실 ImageDirectoryEntryToDataEx function

3

체육 사양이 MS에 의해 문서화되어, 당신의 최선의 방법은 pecoff.doc에서 제공하는 정보입니다 :

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

내가 올바르게 사용 기억한다면 마지막 항목은 CLR 런타임 헤더로 설명 다른 의미를 가지기 때문에 (일부는 COM Descriptor라고 부릅니다) 이제는 CLR 메타 데이터를 가리키는 데 사용됩니다.

마지막 세 개의 순서는 IAT, DelayImport, CLR입니다. 다른 것은 간단히 잘못되었습니다. 디렉토리는 분명히 마술처럼 변하지 않습니다.

+2

.NET은 2001 년 이전에 처음에는 'COM + 런타임'(또는 COM2 또는 NGWS ...)이라고 불렀다. 따라서 다양한 .H 파일에서 볼 수있는 COR 접두사와 'COM 런타임 기술자 '. –

0

는 디렉토리 순서는 고정되어 있습니다. COM, 지연 가져 오기 및 .NET 메타 데이터조차도 디렉토리 테이블에서 고정 된 위치에 있습니다! 일부 도구는 자신의 이름과 순서로 디렉토리를 표시합니다. 표현되는 방식은 PE 사양과 아무 관련이 없습니다.