Как работает компилятор. Частья пятая
Но эта история с форматами учит, что технические описания тоже имеют тенденцию устаревать и исчезать из Сети. Кстати, по поводу PE тоже не все ясно: оказывается, полного описания всех его полей и возможностей вовсе не существует… Но придется пользоваться тем что есть.
Для примера возьмем игру «Сапер», представленную файлом winmine.exe. Ее размер (более 100 Кб) не должен смущать, так как в нее интегрированы звуковые WAV файлы, что видно невооруженным глазом. Для исследования нам по-прежнему хватит утилиты Hiew. Первым делом, нужно посмотреть на начало дампа: первые два байта должны быть MZ. Значит, это программа. Но какая? Переходим к смещению 18h. Если в нем записано число больше или равное 40h, то это программа Windows, а заголовок NE записан по адресу 3Ch (4 байта). Обычно начало заголовка выравнивается по смещению в 8 байт и составляет 400h, но в данном случае это правило не соблюдается, и заголовок программы находится по адресу D8h.
Уже на этом этапе побережем глаза, и все указанные манипуляции по определению точки входа сделаем программно.
uses strings;
var fs: file; d8: byte; d16: word; d32: longint;
begin assign(fs, paramstr(1)); reset(fs, 1); blockread(fs, d16, 2); if d16 = $5a4d then begin {Обнаружен заголовок MZ} seek(fs, $18); blockread(fs, d8, 1); if d8 >= $40 then begin {Это программа Windows} seek(fs, $3c); blockread(fs, d32, 4); writeln('Адрес PE: ', instr(d32,16,4,true),'h'); end; end; close(fs); end.
Ответ программы будет, как мы и ожидали,
Адрес PE: 00D8h
Перед заголовком в дампе можно заметить stub («пенек», «огрызок»), где программа ругается, что должна быть запущена из-под Windows, после чего завершает работу. Интересно, что сюда можно при желании добавить полноценную программу MS-DOS, делающую что-то более полезную. Таким образом, можно даже создать приложение, работающее и под DOS, и под Windows – известная в узких кругах программа Aldus PhotoStyler 2.0 как раз так и организована, других не встречал. Чтобы записать сюда свою программу, нужно немного поколдовать с программой линковки и задать особые параметры программы winstub.exe.
Заголовок PE содержит массу интересных вещей, но большинство из них касаются программных секций и кода. Также много информации по поводу версий, и, что интересно, загрузчик приложения большую часть всего этого не использует. Специалисты рассказывают, что образ приложения грузится в оперативную память практически «один в один», за исключением незагружаемых секций. Также интересно, что формат EXE отличается от DLL установкой всего лишь одного бита. Конечно, внутри файла есть еще куча занимательных вещей, но они интересны, в основном, хакерам. К примеру, в файле на диске есть множество пустых мест, куда можно втиснуть свою программку; путем переименования секций можно обмануть встроенную систему защиты Windows Vista/7. А можно просто написать вирус, внедряемый в состав файла – достаточно точно скорректировать относительные от базы адреса (RVA). Но мы такими вещами заниматься не будем. Разберем заголовок PE.
50 45 00 00 – Магическое число PE00 4C 01 – Тип процессора (i386), почти никогда не меняется 03 00 – Число входов в Таблицу Объектов (3) 75 84 7D 3B – Дата и время компоновки файла линкером 00 00 00 00 – Указатель на отладочную таблицу… 00 00 00 00 – и количество символов в ней E0 00 – Размер PE заголовка (224 байта + 24 от старого формата = 248 от начала файла) 0F 01 – Флаги (нам не надо) 0B 01 – Очередное неиспользуемое магическое слово 07 00 – Версия линкера (7.0) 00 3C 00 00 – Размер кода программы (15360 байтов) 00 94 01 00 – Размер секции инициализированных данных 00 00 00 00 – То же, только неинициализированных данных 21 3E 00 00 – Вход в RVA 00 10 00 00 – Смещение к секции Code 00 50 00 00 – Смещение к секции Data 00 00 00 01 – Image Base
Впереди еще много байтов, среди которых мы так и не добрались до главного – 16-входовой таблицы виртуальных смещений и размеров секций. Но ошибка уже очевидна – без дополнительных программ, автоматизирующих нудный “пересчет байтов”, вручную разобраться здесь сложно. То, что уже здесь показано, можно почитать на досуге в отличной документации по адресу www.wasm.ru/doclist.php?list=2. Так что вы читайте, а в следующей части мы, наконец, доберемся до ресурсов этого приложения. Тем более, что для изменения, к примеру, строк в программе, нам понадобятся программы – строки же записаны в кодировке Unicode, которые так просто не увидишь. |