Как сигнатура узнает какие байты РЕ файла соответствуют ее частям? - Assembler
Формулировка задачи:
КАК сигнатура узнает какие байты РЕ файла соотвецтвуют ее частям? К примеру, я хочу начать разбор файла.
Отсчитывать байты равными долями или же как?
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE заголовок USHORT e_magic; // Магическое число 4D 5A USHORT e_cblp; // Количество байт на последней странице файла USHORT e_cp; // Количество страниц в файле USHORT e_crlc; // Relocations USHORT e_cparhdr; // Размер заголовка в параграфах USHORT e_minalloc; // Minimum extra paragraphs needed USHORT e_maxalloc; // Maximum extra paragraphs needed USHORT e_ss; // Начальное (относительное) значение регистра SS USHORT e_sp; // Начальное значение регистра SP USHORT e_csum; // Контрольная сумма USHORT e_ip; // Начальное значение регистра IP USHORT e_cs; // Начальное (относительное) значение регистра CS USHORT e_lfarlc; // Адрес в файле на таблицу переадресации USHORT e_ovno; // Количество оверлеев USHORT e_res[4]; // Зарезервировано USHORT e_oemid; // OEM identifier (for e_oeminfo) USHORT e_oeminfo; // OEM information; e_oemid specific USHORT e_res2[10]; // Зарезервировано LONG e_lfanew; // Адрес в файле нового .exe-заголовка } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
Решение задачи: «Как сигнатура узнает какие байты РЕ файла соответствуют ее частям?»
textual
Листинг программы
// MakePtr is a macro that allows you to easily add to values (including // pointers) together without dealing with C's pointer arithmetic. It // essentially treats the last two parameters as DWORDs. The first // parameter is used to typecast the result to the appropriate pointer type. #define MakePtr(cast,ptr,addValue) (cast)((DWORD)(ptr) + (addValue)) bool PELib::Open(const BYTE* const pMMF) { _bValid = false; if (!pMMF) { return false; } _pMMF = (BYTE*)pMMF; _pDosHeader = (PIMAGE_DOS_HEADER)_pMMF; if (_pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) { return false; } _pNTHeader = MakePtr(PIMAGE_NT_HEADERS,_pDosHeader,_pDosHeader->e_lfanew); // First, verify that the e_lfanew field gave us a reasonable pointer, then verify the PE signature. if (IsBadReadPtr(_pNTHeader,sizeof(IMAGE_NT_HEADERS)) || _pNTHeader->Signature != IMAGE_NT_SIGNATURE) { return false; } // [url]http://msdn.microsoft.com/en-us/library/ms680313%28v=vs.85%29.aspx[/url] if ((_pNTHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_I386) && // 0x014C // x86 (_pNTHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_IA64) && // 0x0200 // Intel Itanium (_pNTHeader->FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64)) // 0x8664 // x64 { return false; } // [url]http://msdn.microsoft.com/en-us/library/ms680339%28v=vs.85%29.aspx[/url] if ((_pNTHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) && // 0x010B // The file is an executable image. (_pNTHeader->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) && // 0x020B // The file is an executable image. (_pNTHeader->OptionalHeader.Magic != IMAGE_ROM_OPTIONAL_HDR_MAGIC)) // 0x0107 // The file is a ROM image. { return false; } _bValid = true; _bPE64 = (_pNTHeader->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC); return true; }
Объяснение кода листинга программы
- В первой строке объявляется макрос MakePtr, который позволяет легко складывать значения вместе, не беспокоясь о вычислениях указателей.
- Затем определяется, является ли входной файл исполняемым файлом PE, путем проверки его заголовка.
- Если входной файл не является исполняемым файлом PE, функция возвращает false.
- Заголовок PE содержит поля, которые указывают на размер файла и смещение к его заголовку.
- Проверяется, является ли поле
e_lfanew
действительным указателем и имеет ли оно правильный размер. - Если поле
e_lfanew
недействительно или имеет неправильный размер, функция возвращает false. - Проверяется, соответствует ли поле
Signature
заголовка PE ожидаемому значению. - Если поле
Signature
не соответствует ожидаемому значению, функция возвращает false. - Проверяется, соответствует ли тип машины входного файла одной из поддерживаемых машин.
- Если тип машины не соответствует ни одной из поддерживаемых машин, функция возвращает false.
- Проверяется, соответствует ли поле
Magic
заголовка PE ожидаемому значению. - Если поле
Magic
не соответствует ожидаемому значению, функция возвращает false. - Если все проверки пройдены успешно, устанавливается флаг _bValid, указывающий на действительность файла.
- Функция возвращает true, указывая на то, что файл является действительным исполняемым файлом PE.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д