Шаг 26 - IMAGE_OPTIONAL_HEADER32

В позапрошлом шаге мы получили ссылку на структуру PIMAGE_NT_HEADERS, которая включает две структуры. Одна из них IMAGE_FILE_HEADER. С ней мы познакомились. Вторая структура - это IMAGE_OPTIONAL_HEADER32. Вот так ее мы получим:

	......
	if (FileHeader.Machine!=IMAGE_FILE_MACHINE_I386)
	{
		MessageBox(NULL,"Error Not 386 Proccesor","Error",MB_OK);
		return FALSE; 
	}

	IMAGE_OPTIONAL_HEADER32 OptionHeader;
	OptionHeader = (IMAGE_OPTIONAL_HEADER32) pPEHeader->OptionalHeader; 

	return TRUE;
}

Эта структура довольна большая. Вот ее описание:

typedef struct _IMAGE_OPTIONAL_HEADER {
//
// стандартные поля
//

	WORD    Magic;
	BYTE    MajorLinkerVersion;
	BYTE    MinorLinkerVersion;
	DWORD   SizeOfCode;
	DWORD   SizeOfInitializedData;
	DWORD   SizeOfUninitializedData;
	DWORD   AddressOfEntryPoint;
	DWORD   BaseOfCode;
	DWORD   BaseOfData;

//
// NT дополнительные поля.
//

	DWORD   ImageBase;
	DWORD   SectionAlignment;
	DWORD   FileAlignment;
	WORD    MajorOperatingSystemVersion;
	WORD    MinorOperatingSystemVersion;
	WORD    MajorImageVersion;
	WORD    MinorImageVersion;
	WORD    MajorSubsystemVersion;
	WORD    MinorSubsystemVersion;
	DWORD   Win32VersionValue;
	DWORD   SizeOfImage;
	DWORD   SizeOfHeaders;
	DWORD   CheckSum;
	WORD    Subsystem;
	WORD    DllCharacteristics;
	DWORD   SizeOfStackReserve;
	DWORD   SizeOfStackCommit;
	DWORD   SizeOfHeapReserve;
	DWORD   SizeOfHeapCommit;
	DWORD   LoaderFlags;
	DWORD   NumberOfRvaAndSizes;
	IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

Чего здесь только не содержится относительно модуля. Куча всякой информации. Все ее мы рассматривать пока не будем. Я скажу к чему я веду. Я веду к тому, чтобы вычислить адрес конкретной экспортируемой функции из модуля User32.Dll. Зачем ??? Узнаем потом. А пока я хочу добраться до этого адреса через структуру заголовков модулей. Нас интересует IMAGE_DATA_DIRECTORY. Это массив записей о каталогах с информацией.

//
// Directory format.
//

typedef struct _IMAGE_DATA_DIRECTORY {
	DWORD   VirtualAddress;
	DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16

Как видите этих каталогов 16. Вот они:

// Каталоги данных
// Каталог экспортируемых объектов
#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
// Машинный значения (MIPS GP)
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR      8
// Каталог TLS (Thread local storage - локальная память потоков)
#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   
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   
// информация COM объектов
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   

Все импортируемые объекты находятся в каталоге IMAGE_DIRECTORY_ENTRY_IMPORT. Там же находится и функция ExitWindowEx, которая перегружает Ваш компьютер :-)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.