Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Распаковка вручную

Симонов Илья (nazi@gh0sts.org)

Спецвыпуск: Хакер, номер #057, стр. 057-032-1


Снятие упаковщиков приложений

Для человека, вставшего на путь исследования программ и их защит, первым барьером к вкусному сердцу кода станет упаковщик исполняемых файлов. Что это такое и как обойти его, я и расскажу тебе сегодня на ночь.

Разведка боем

Начнем, как обычно, с начала и продолжим до конца :). А сначала опишу принцип работы упаковщиков и его общие особенности. Упаковщик - программа для сжатия исполняемого файла, которая отличается от архиватора лишь тем, что добавляет код распаковщика в тело программы. При запуске управление передается этому коду вплоть до полной распаковки программы в память. Определение грубое, но как, ни крути, общий смысл выразил. Задача крэкера - слить дамп памяти (не пугайся слов – еще успею объяснить их) распакованной программы, а затем, конечно, восстановить импорт, но все по порядку. Итак, поехали.

Как ты, наверное, уже предполагаешь, а может быть, давно знаешь, существует множество различных пакеров. Естественно, способы распаковки у каждого особенные. Сначала нам предстоит разведка, то есть определение упаковщика, которым сжата программа. Хочу сразу отметить, что это не столь важная деталь, как может показаться. Действительно, когда распакуешь вручную парочку пакеров, тебе уже будет безразлично то, как называется пакер, ранее бывший неизвестным для тебя. Принцип их действия, по сути, одинаков: если узнал, как работает один, значит, ты понял, как работают все. Распознавание языка, на котором написана программа, также то, каким упаковщиком она ужата, осуществляется сигнатурным способом, который так полюбился нашим антивирусным конторам. На эту тему существуют замечательные статьи Alex'а на не менее замечательном портале cracklab.ru. Конечно, если ты сейчас с интересом читаешь эту статью, значит, ты еще многого не знаешь, и специально для новичков изобретена отличная в своем роде программа-распознаватель PEiD, которая не только покажет, чем упакован наш файл, но и расскажет еще много интересного о жертве.

Обзор всех инструментах, необходимых реверсеру, также написано в этом номере, поэтому время поговорить о программах еще будет. А сейчас мы окунемся в прошлое и предадимся классике. Внимание! Распаковываем блокнот, упакованный UPX. И что бы там нам ни говорили, что якобы веселее распаковывать FSG, блокнот и UXP - это классика, от которой никуда не деться. И наш урок начнется именно с нахождения Оригинальной точки входа в сжатую программу.

Для общего разъяснения скажу, что после запуска программы с физического носителя операционная система проецирует образ программы в оперативную память (точнее, в определенное адресное пространство памяти). В этом случае сам код располагается в памяти с началом по адресу так называемого значения Image base (то есть Image Base - адрес в памяти, начиная с которого идет код программы). Однако начало проекции совсем не означает начало исполняемого кода. И вот уже в проекции существует Точка входа (EP - Entry Point) в программу - то место, откуда начинается выполнение исходника. Поскольку я уже упоминал, что упаковщик добавляет свой код в тело программы, то на сцене появляется понятие Оригинальная тока входа. Как уже можно было догадаться, это точка входа в изначальную программу, если бы она не была запакована. Естественно, нам необходимо найти это место, снять дамп памяти (dump - снимок/образ памяти) исходной программы и сохранить его на диск. Мне не хочется делать из тебя бездумного робота-шаблонщика, поэтому попытаюсь донести до глубин твоего сознания суть процесса.

Содержание  Вперед на стр. 057-032-2