How to unpack dll manually. ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Small essay by Dr.Golova ~~~~~~~~~~~~~~~~~~~~~~~~ Типа попробовал я распаковать длл, ничего сложного, но подход несколько другой. Я, значить, запаковал wz32.dll (от WinZip) с помощью ASPack 2.1 Все работает. 1) Открываем эту длл в ProcDump (и не надейтесь им побыстрому все распаковать, он длл не поддерживает и все придется делать ручками). Находим адрес точки входа, и открываем ее в hiew. 2) Запоминаем, какой был там байт (у меня был 60h - popad), и пишем вместо него ССh - int3. Я по инерции еще изменил свойство секции .text на Е0000020. Сохраняем файл и выходим. :) 3) В SoftICE включаем слежение за 3-им прерыванием (i3here on) и запускаем основную программу, т.е. ту, из которой это длл вызывается. Не пройдет и секунды, как мы окажемся в Айсе. 4) Мы на точке входа в длл, там, где вставили CCh. Возвращаемся на 1 шаг назад (r eip eip-1) и восстанавливаем измененную нами инструкцию. Начинаем плавно нажимать на F10 - трассируем. 5) Далее идет до боли знакомый код распаковщика ASPack. В окошко данных выведем адрес таблицы импорта (первым делом надо было на бумажку записать все секции и их свойства). Пока ее нету, после в ней появится какой-то мусор, а вот потом после выполнения 2-х команд repnz movsb (или типа такой), появится правильная таблица импорта (крупные циклы можно перескакивать с помошью бряков). Самое время ее сдампить (pagein d ). А иначе чуть позжее подлый ASPack изгадит таблицу импорта так, что ею сможет пользоваться только винда. Едем дальше... 6) Дошли до конца распаковки (кто не помнит там popad, потом push OEP, потом ret). Запишем OEP! 7) А теперь срежем весь модуль из памяти сразу! Как начальный адрес возмем Image Base (у меня был 10000000h, только помните, что у длл он не фиксированный, но зная точку входа не распаковщик, его не трудно вычислить), а размер - RVA последней секции + ее размер. Дампим - pagein d . Не экономично (захватили много мусора), но практично. 8) Получили почти рабочую длл, даже заголовок на месте (кто-то заявлял, что он не остается в памяти - это не правда, иначе как ASProtect определяет изменение свойства секции не вызывая ни GetModuleFileName(), ни CreateFileA()). 9) Теперь открываем дамп в ProcDump (dll не видно в окошке открытия файла, надо писать правильное имя). Правим точку входа на ОЕР, всем секциям пишим в PSize пишем размер VSize, а Offset такой же, как и RVA. В Directory пишем RVA и Size для Import Table, взятые из свойств секции .idata. 10) Теперь в любом шестнадцатеричном редакторе вставляем сдампленную секцию .idata на место поврежденной. 11) Для нормализации размера длл прогоняем ее через Rebuild PE в ProcDump. Типа все. Dll распакована. ASPack опять побежден. Бурные апплодисменты, зановес. У меня все прекрасно работало. Секцию .aspack и пустую .data лучше не удалять из кода. Надеюсь, все это понятно и легко. У меня заняло все около 20 мин. (еще раз скажу, что ни разу до сегодняшнего дня я длл не распаковывал). Если будет нужда, могу оформить эту галимотью как статью, только тогда хочу кого-нибудь напрячь написать программу-пустышку и dll к ней. Желательно на асме (чтоб была меньше). Могу и сам, но я очень ленивый, да и кодить совсем не умею :) Надеюсь, что помог кому-нибудь, и мне тоже хоть раз скажут "спасиба дарагой, да". (c) by Dr.Golova