EP

Материал из Russian Underground
Перейти к: навигация, поиск

EP - это сокращение от Entry Point, что переводится как Точка Входа. Под EP подразумевается адрес в программе, по которому находится команда, которая будет выполнена первой при старте программы. Аналогично, OEP - это сокращение от Original Entry Point, что переводится как Оригинальная Точка Входа. Термин OEP применяется когда речь идет об упакованной программе. Иными словами OEP - это адрес, с которого бы начинала выполняться программа, если бы не была упакована. Может возникнуть вопрос, а с какого же тогда адреса будет выполняться упакованная программа? Она будет выполняться с EP, только после упаковки по адресу EP находится первая команда распаковщика/протектора. Упаковщик либо протектор добавляет в программу свой код, который получает управление первым и распаковывает программу в памяти, после чего делает переход на OEP.


Содержание

Универсальный способ поиска OEP и распаковки

1) Перед выходом на OEP большинство пакеров восстанавливают стек, поэтому чтоб остановиться неподалеку, можно поставить аппаратную точку останова на адрес esp-4. В OllyDbg это делает либо через контекстное меню окна стека, либо в командной строке вбиваем "hr esp-4"

2) Так же большое число пакеров очищают выделенную память, в которую они декодировали образ. А значит поставив бряк на VirtualFree можно в нужный момент одним махом снять рабочий дамп, не требующий восстановления импорта, еще до выхода на OEP. В дополнении к VirtualFree, удобно отслеживать распаковку останавливаясь на VirtualProtect, так как перед копированием упаковщику необходимо выставлять права для секции на запись, а после копирования данных обратно восстанавливать их.

3) Самодельные упаковщики иногда для распакованного образа запускают отдельный процесс, и пишут в него блоками используя WriteProcessMemory/ZwWriteVirtualMemory. Установка на них бряков тоже позволяет снимать дамп до выхода на OEP.

4) Некоторые авторы ленятся и используют для сжатия/разжатия данных парные функции RtlCompressBuffer/RtlDecompressBuffer, они достаточно редко используются, поэтому можно смело поставить на них бряки.

А как прерваться на OEP и EP?

Я обычно это делаю одним из двух способов:

1) Запускаю программу. В отладчике пишу "addr NAME", где name - имя исследуемой программы (процесса), после этого пишу "bpm 12345678 x", где вместо 12345678 подставляем значение EP (вместе с Image Base) и перезапускаем программу. Произойдет остановка на EP.

2) Запускаю PE Tools. В меню Tools выбираю Break & Enter и выбираю нужную программу. После этого появится сообщение о том, что необходимо поставить брейкпоинт "bpint 3" и, после его срабатывания, написать "e eip 0xYY". После срабатывания брейкпоинта в SoftIce надо будет написать не "e eip 0xYY" (YY - это какой-то байт, который был заменен на вызов третьего прерывания). После этого флаг вам руки, делайте дальше что нужно.

Зачем находить ОЕР еще как-то, если можно воспользоваться OEP Module из PEiD?

Реализованная в PEiD функция по нахождению ОЕР не всегда работает. Бывает, что она и вовсе не определяет ОЕР или показывает вообще не правильно. Очень часто можно доверять ей, если ЕХЕ упакован простыми упаковщиками. Бывает, что ОЕР оказывается верен даже у протекторов, но не нужно ему часто доверять.

Зачем нужно зацикливать программу перед переходом на OEP либо прямо на OEP?

Это необходимо для того, чтобы остановить выполнение программы и сделать дамп в тот момент, когда программа находится в своем исходном состоянии. Если сдампить программу, просто запустив ее, то, возможно, секции данных и кода будут уже изменены и отличаться от исходных. Это может повлиять на работоспособность дампа (распакованной программы).

А как узнать адрес Entry Point (EP) ?

Тут существует куча способов. Проще всего воспользоваться для этого любой из этих программок: PEiD, PE Tools, ProcDump, LordPE.

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Сцена
Материалы
Разное
Donate
Инструменты