Распаковка
Процесс создания из запакованного или запротекченого файла обычный, не запакованный PE файл, который в дальнейшем можно свободно изучать в дизассемблере.
Существует автоматическая и ручная распаковка. Крэкер должен владеть приемами ручной распаковки.
Запакованный файл изготавливается обычно автором программы при использование протекторов и упаковщиков.
Зачем вообще нужна распаковка
Это делается для того, чтобы после распаковки получить возможность дизассемблировать и патчить программу. Иногда без распаковки файл становится затруднительно вообще как-либо исследовать, даже с помощью отладчиков, например, в случае, когда файл упакован Private Exe Protector'ом. Еще многие протекторы типа ASProtect, Armadillo и др. предоставляют для защиты программ специальные функции, с помощью которых осуществляется и проверяется регистрация программы. Если автор программы при использовании этих протекторов использовал только эти функции, а не писал свои, то после распаковки и убирания зависимости программы от протектора (это для примера, на самом деле еще кое-что надо будет подправить) она будет считать себя зарегистрированной.
Автоматическая распаковка
Производится при помощи специально написанных программ или (что в последнее время более популярно) скриптов для плагина ODBGScript отладчика OllyDbg, которые позволяют неквалифицированному пользователю получить из запакованного или запротекченого файла - работоспособный распакованный.
см. Автораспаковщики
Ручная распаковка
Область умений крэкера. Набор действий, включающих: поиск OEP, дамп программы на диск (опции Dump fix), восстановление импорта,восстановление релоков, Rebuild PE, ребилд ресурсов.
Также, в случае если файл не просто был запакован изначально, а обработан протектором могут потребоваться такие действия, как: сделать деморфинг, удалить мусорные инструкции, обойти антиотладочные приемы, разобрать как работает виртуальная машина, найти где происходит проверка целостности кода CRC и др.
Пишут, что при распаковке в конце надо изменить Entry Point. Как это сделать?
--- 1) Если используем ProcDump, то нажимаем кнопку PE Editor -> Выбираем файл -> Меняем значение Entry Point (пишем RVA Entry Point) -> OK
2) Если используем LordPE, то нажимаем кнопку PE Editor -> Выбираем файл -> Меняем значение Entry Point (тоже RVA) -> Save -> OK
3) Если используем PE Tools, то в меню Tools -> PE Editor -> Выбираем файл -> Optional Header -> Меняем значение Entry Point (тоже RVA) -> OK -> OK
Программа запакована протектором. Я хочу лишь посмотреть/вытащить ресурсы ее. Нужно ли мне распаковывать программу?
Не обязательно. При запуске программы все равно идет инициализация ресурсов, и они находятся распакованными в памяти. Достаточно сделать дамп работающей программы! Естественно дамп будет нерабочий, но ресурсы (справедливо не для всех протекторов и не всегда!) будут восстановлены.
Как распаковать DLL?
Распаковка DLL практически не отличается от распаковки EXE файла. У DLL как и у EXE есть EntryPoint, и если dll упакована то распаковка начинается как раз с этого EntryPoint. Таким образом нужно остановиться на DLL EntryPoint и оттуда идти к OEP нашей DLL. Дальше когда узнали OEP нужно ж дампить. Если влом это делать из Softice (icedump) то это можно сделать в ProcDump/PEditor/LordPe и т.д. Для этого нужно выбрать процесс потом в списке модулей найти нужную DLL и сделать ей Full Dump. После этого получится дамп с правильными ресурсами(ну разве что перенастроите свой ProcDump/PEditor/LordPe) но без OEP и без импорта (хотя может и попадется какой-нить тупой протектор который импорт не трогает).
Для получения импорта можно взять Imprec. В Imprec выбираем процесс который, юзает нашу DLL потом делаем Pick Dll и дальше восстановливаем импорт как обычно и дописываем в дамп. Если Imprec вдруг матерится то отрубите/включите use PE header from disk в его опциях.
Метод поиска OEP естественно зависит от протектора которым оно запаковано.
Источник: http://web.archive.org/web/20041106013904/www.xtin.km.ru/view.shtml?id=72
Почему распакованные файлы иногда запускаются медленнее, чем упакованные
При больших размерах файла возникает такой парадокс: к примеру размер сжатого файла 1 Мб, а расжатого - 3.5 Мб. Так вот получается, что на быстрых компьютерах скорость распаковки в памяти намного выше, чем скорость загрузки с винчестера. Поэтому быстрее загрузить 1 Мб, а потом разжать его в памяти, чем грузить 3.5 Мб с винчестера.
Почему нигде не пишут, что надо удалять секции простых упаковщиков (UPX, ASPack..)?
В принципе, возможно удалить секции, но они, как правило, малы. Поэтому это не имеет смысла.
Для удаления секций Aspack и UPX следует применять абсолютно различные приёмы, т.к. алгоритмы их работы различны - если в ASPack нужно отрезать две полседние секции, то UPX при упаковке склеивает секции упакованной программы со своим кодом и данными, поэтому тупо отрезать секции тут уже не получится.