Как разобрать PE файл, не используйте API - PullRequest
1 голос
/ 17 января 2020

Я научился анализировать PE-файлы в соответствии с этой статьей

В этой статье они используют существующие API и структуры

Теперь я хочу переписать программу с помощью Я сам, без вызова API и доступных структур. Читайте некоторую информацию о PE-файле, как показано на рисунке ниже

enter image description here

Я хочу спросить, алгоритм или как разработчик создал их. Можете дать мне несколько советов или ссылку? Мне нужно использовать fread () и fseek (), чтобы прочитать один пока один, верно ??

Спасибо

edit: о, это я из любопытства и хочу узнать больше

1 Ответ

1 голос
/ 17 января 2020

В целом существует два подхода:

  • Если вы уверены, что двоичный формат всегда будет использоваться с одними и теми же двоичными файлами в одной и той же архитектуре, вы можете считывать данные в память и обрабатывать их как «указатель на структуру». Это очень вероятно, как оригинальные авторы реализовали это. Недостатком является то, что этот код не переносится между архитектурами и даже флагами компилятора (заполнение в структурах, выравнивание, ...).
  • Другой, более переносимый подход, заключается в чтении ввода данных с помощью запись. Это приводит к значительному объему кода, который очень похож на структуру, но он переносим и универсален. Эти типы форматов двоичных файлов часто развиваются вместе с кодом, который их использует, и вы можете тривиально вставлять версии и операторы, чтобы изменить способ их чтения.

    Например, используя stream API из известного проекта с открытым исходным кодом, вы бы прочитали первые несколько записей следующим образом:

Common::SeekableReadStream * s = ...;
PIMAGE_DOS_HEADER d = new IMAGE_DOS_HEADER;
d->e_magic = s->readUint16LE();
d->e_cblp = s->readUint16LE();
d->e_cp = s->readUint16LE();
...

Как посредник между двумя подходами, я пришел к выводу, что Kaitai struct , где вы пишете спецификацию формата в декларативном стиле и позволяете его компилятору сгенерировать определение структуры для вас вместе с кодом для чтения (и записи!) Этих форматов файлов.

Взгляните на соответствующие выдержки из их галереи :

  mz_header:
    seq:
      - id: magic
        size: 2
      - id: last_page_extra_bytes
        type: u2
      - id: num_pages
        type: u2
      - id: num_relocations
        type: u2
...