| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

Шаг 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, которая перегружает Ваш компьютер :-).
Предыдущий Шаг | Следующий Шаг | Оглавление

By Artem.
Используются технологии uCoz
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz