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

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

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

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


Нахождение OEP. Теория

Как мы уже знаем, код распаковщика предшествует коду ужатой программы, следовательно, нам необходимо первым шагом найти переход на OEP. Если ты знаком с языком ассемблер (на первое время достаточно азов), то тут будет понятнее. Для перехода на OEP в стандартных пакерах используются, как правило, несколько способов: безусловный переход на OEP, который используется в большинстве простых упаковщиках, предназначенных для простого сжатия программ, но никак не защита от взлома. Например, наш UPX делает именно вот так и никак не иначе.

0101185E > 61 POPAD

0101185F .-E9 BC4BFFFF JMP NOTEPAD.01006420

01011864 00 DB 00

01011865 00 DB 00

01011866 00 DB 00

01011867 00 DB 00

В ASPack'e от нашего соотечественника используется несколько другой метод.

010103AF 61 POPAD

010103B0 75 08 JNZ SHORT NOTEPAD1.010103BA

010103B2 B8 01000000 MOV EAX,1

010103B7 C2 0C00 RETN 0C

010103BA 68 20640001 PUSH NOTEPAD1.01006420

010103BF C3 RETN

Как видишь, адрес ОЕР кладется в стек PUSH NOTEPAD1.01006420, а затем командой RET производится по адресу в стеке. Что и требовалось доказать, друзья.

Теперь поподробнее: как я нашел переходы и почему в большинстве случаев перед вызовом ОЕР находится команда POPAD, что заметили все начинающие реверсеры, хотя мало кто из них придал значение этому факту.

Дело в том, что для корректной работы программы важным и необходимым условием является гармония адресного пространства. После прохождения распаковки и до передачи управления исходной программы код пакера должен вернуть значения регистров, а главное - стека в первоначальное состояние. Именно поэтому в начале кода распаковщика всегда стоит (как правило!) команда PUSHAD, которая указывает процессору поместить значения регистров в стек. Команда POPAD существует для противоположной операции. Это можно наглядно посмотреть в программе, упакованной UPX: после возвращения стека в первозданное состояние происходит прыжок на ОЕР. Если просто смотреть листинг дизассемблера, то после перехода на ОЕР мы увидим непонятные наборы символов (назвать их кодом сложновато) либо лишь пустую область.

Однако этот способ действует только на очень простых пакерах наподобие UPX. В случае с ASPack'ом, как мы видим, такое уже не подойдет. Поэтому лучше перейдем к практике распаковки простейших упаковщиков. Нам понадобится установленный SoftIce. Если у тебя по какой-либо причине нет вышеприведенного отладчика, то можешь пользоваться любым другим - ход действий остается таким же. Мне SoftIce ближе к сердцу, и советую пользоваться именно им или OllyDbg, которым я пользовался, как ты уже понял, только ради скриншотов и наглядности кода.

Назад на стр. 057-032-1  Содержание  Вперед на стр. 057-032-3