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

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

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

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


Нахождение OEP. Практика

Итак приступим. Для тех, кто работает с OllyDbg, остановиться на EP программы не составит труда - нужно просто открыть файл в отладчике. Но поскольку мы работаем с SoftIce'ом, тут необходимо знать некоторые тонкости. Итак, сейчас мы научимся прерываться на точке входа в SoftIce с помощью великолепной программы PETools, о которой можно прочесть в другой статье этого номера. Этот способ широко известен всем: лично я научился ему после прочтения статьи хорошо известного в своих кругах MozgC (TSRh), за что ему отдельное спасибо. Теперь следим за рукой: запускаем PETools, далее в меню Tools выбираем Break&Enter и указываем нужный нам файл. Затем появляется простое окошко с сообщением, что необходимо запустить SoftIce, ввести команду bpint3, после ее прохождения нажать кнопку ОК в окошке и ввести следующую команду типа e eip 0xХХ. На самом деле все намного проще, чем кажется. При использовании Break&Enter PETools заменяет первый байт точки входа на байт CCh (то есть специальное отладочное прерывание int3, которое генерирует исключение), мы уже ставим в отладчике бряк (breakpoint - точка остановки) на это прерывание (bpint3), то есть, грубо говоря, мы помечаем по-своему точку входа. Когда отладчик останавливает программу на этом месте, команда "eb eip 0xХХ" (где ХХ - определенные байты, которые были на точке входа) записывает оригинальные байты точки входа, тем самым приводя все в первоначальный вариант. Остается только снять все бряки командой "bc *" и работать дальше.

EP (Entry Point) - точка входа в программу, располагающуюся в адресном пространстве.

OEP (Original Entry Point) - точка входа в исходную программу, логично только когда программа упакована. Тогда ЕР - точка входа в код упаковщика.

Image Base - адрес начала размещения программы в памяти. Не путать с точкой входа! Точка входа - это адрес старта программы, а Image Base - адрес начала всего кода.

RVA (Relative Virtual Address) - относительный виртуальный адрес, адрес смещения относительно Image Base.

VA (Virtual Address) - виртуальный адрес, адрес в памяти, который нам показывает отладчик.

А дальше мы должны рассуждать, как найти ОЕР. Если думать трезво и вспомнить уроки учителей, то мы узнаем, что после исполнения своего долга упаковщик, как истинный мужчина, восстанавливает все в первоначальное состояние. При стандартном начале Windows-программ указатель на верхнюю часть стека один и тот же и равен значению регистра esp. Когда пакер передает управление первоначальной программе, указатель восстанавливается, но перед этим, как правило, упаковщик считывает из стека значение esp-4. Поскольку 98% простых упаковщиков одинаковы в своих принципах, мы имеем право утверждать, что перед переходом на ОЕР будет взято значение из стека, равное esp-4. Следовательно, вызываем отладчик и пишем bpm esp-4. После нажатия <F5> в случае с UPX мы сразу же прерываемся на команде POPAD и последующем переходе на ОЕР. Не всегда первая остановка будет верна: тут необходимо смотреть переходы, и если они есть, значит, мы пришли правильно. И вот мы на заветном прыжке на ОЕР. Это означает то, что сейчас в памяти лежит распакованная программа с точкой входа, которую мы только что нашли. Остается только слить дамп на диск и восстановить импорт. Наверное, все уже поняли, что для того чтобы нормально слить дамп, нужно остановить программу на месте прыжка на ОЕР.

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