Программы
ВХОД
Логин:    

Пароль:  

   Запомнить меня
Вам нужно авторизоваться.
Забыли пароль? / Регистрация
Статьи


   Статьи
   Soft
   Программирование
   Работа компилятора в картинках. Частья пятая

Работа компилятора в картинках. Частья пятая

Добавлено: 22.06.2012

Прочитано: 1591

Как работает компилятор. Частья пятая

Но эта история с форматами учит, что технические описания тоже имеют тенденцию устаревать и исчезать из Сети. Кстати, по поводу 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, которые так просто не увидишь.



обновить программы бесплатно

<<  Работа компилятора в картинках. Часть четвертая Работа компилятора в картинках. Часть шестая  >>


Добавить Комментарий

Скачать программу для проверки на ошибки
Скачать программу автоматического обновления программ
Статьи
Новые Программы
Новые статьи
Популярные Программы
Самые читаемые статьи
Copyright © Дай Прогу 2011 Контакты ¤ Статистика