Как сигнатура узнает какие байты РЕ файла соответствуют ее частям? - 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;
}

Объяснение кода листинга программы

  1. В первой строке объявляется макрос MakePtr, который позволяет легко складывать значения вместе, не беспокоясь о вычислениях указателей.
  2. Затем определяется, является ли входной файл исполняемым файлом PE, путем проверки его заголовка.
  3. Если входной файл не является исполняемым файлом PE, функция возвращает false.
  4. Заголовок PE содержит поля, которые указывают на размер файла и смещение к его заголовку.
  5. Проверяется, является ли поле e_lfanew действительным указателем и имеет ли оно правильный размер.
  6. Если поле e_lfanew недействительно или имеет неправильный размер, функция возвращает false.
  7. Проверяется, соответствует ли поле Signature заголовка PE ожидаемому значению.
  8. Если поле Signature не соответствует ожидаемому значению, функция возвращает false.
  9. Проверяется, соответствует ли тип машины входного файла одной из поддерживаемых машин.
  10. Если тип машины не соответствует ни одной из поддерживаемых машин, функция возвращает false.
  11. Проверяется, соответствует ли поле Magic заголовка PE ожидаемому значению.
  12. Если поле Magic не соответствует ожидаемому значению, функция возвращает false.
  13. Если все проверки пройдены успешно, устанавливается флаг _bValid, указывающий на действительность файла.
  14. Функция возвращает true, указывая на то, что файл является действительным исполняемым файлом PE.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы