Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Распаковка? Это легко!!!

Обсудить статью на форуме

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: Bit-h@ck <bit-hack@mail.ru>

Здравствуйте, все любители что-нибудь поломать :). Сегодня я Вас буду учить распаковывать программы с помощью Olly Debugger(упор будет сделан именно на этот отладчик).

Сегодня Вы научитесь распаковывать(если будете всё делать как я сказал):
1. UPX (любых версий)
2. AsPack (любых версий)
3. PE Compact 1.84 (а может и другие версии :)
4. PE Diminisher
5. VBOX 4.3 - 4.6.x
6. Exe Stealth 2.73
7. AsProtect 1.2
8. PcGuard 4
9. MEW11 SE v1.1
10. WWPack32 1.x
(эта статья может дополняться, так что следите за update`ами :) Все упаковщики отсортированы по дате добавления.

Инструментарий


Olly Debugger v. 1.10 и плагины к нему
SoftIce (с TRW всё также как для SoftIce) for Windows NT
PeTools by NEOx v. 1.5
Olly Dump
ProcDump v. 1.6.2
Lord_Pe v. 1.4
Import REConstructor v1.6F
ResFixer 1.0
Так много инструментов надо для того, чтобы Вы могли учиться пользоваться инструментом. Умение пользоваться инструментом одна из главных черт крякера.
За инструментом бегите на http://wasm.ru

Теория


Как Вам всем наверное известно, то что мы будем распаковывать – это упаковщики и протекторы. Ими пользуются для уменьшения размера файла и для “защиты”. Принцип работы пакеров прост (если не вдаваться  в тонкости):
1. сначала пакер сжимает код программы (кроме секции ресурсов).
2. затем добавляет код распаковщика в код программы.
Запуск запакованной программы происходит по такому принципу:
1. сначала запускается анпакер и распаковывает код программы.
2. после распаковки (ещё в коде анпакера) идёт переход на код самой программы.
3. программа начинает работу как незапакованная.

Коротко о распаковке


План распаковки:
1.Нахождение оригинальной точки входа
2.Сдирание дампа
3.Восстановление таблицы импорта

Теперь каждый пункт подробнее.

1. Оригинальная точка входа(OEP) – это та точка с которой начиналась бы незапакованная программа. На данный момент есть специальные программы, которые находят эту точку без особых проблем, но бывает, что эти программы глючат и определяют оригинальную точку неправильно. Вывод: не полагайтесь на эти программы, ищите сами (бывают случаи, когда у самого не получается по каким либо причинам, в этом случае пользуйтесь способом нахождения ОЕР в Olly Debugger`е – он практически не ошибается). Без правильной оригинальной точки ничего не получится. Этот пункт самый главный при распаковке. Переход на OEP у каждого пакера выглядит по-разному, именно поэтому я не могу сразу сказать, как он (переход) будет выглядеть. Искать OEP будем с помощью отладчиков Olly Debugger, SoftIce (для TRW всё также, как для SoftIce)

2. Сдирание дампа это не что иное как копирование памяти программы на диск. Если стало страшно, то я могу сказать, что это самое простое в распаковке(не относиться к Armadillo). Для снятия дампа будем использовать PETools, Olly Dump, ProcDump, Lord_PE.

3. Восстановление таблицы импорта нужно для того чтобы Ваше приложение(распакованное) запускалось не только на вашем компьютере, но и на других. Про надобность восстановления импорта и говорить нечего, особенно если Вы собираетесь выкладывать распакованную и взломанную программу в интернете. Я не буду рассказывать почему распакованная программа не будет запускаться на другом компьютере (точнее на другой операционной системе) понять это достаточно трудно для новичка. Восстанавливать таблицу импорта будем программой Import REConstructor.

1. UPX


Примеры будут показаны на стандартном WordPad`е (с UPX и протекторами исключение) входящем в состав WinXp. Паковать и распаковывать WordPad придётся Вам самим. Запакуйте calc.exe Upx`ом создав при это в папке UPX`а bat файл такого содержания:
Upx.exe --Best *.exe
Теперь киньте calc.exe в папку с UPX`ом и запустите bat файл. После паковки займёмся распаковкой :).

1.1.1. Поиск OEP c помощью Olly Debugger.
Откроем запакованный файл под отладчиком нажав F3 и выбрав файл. После подгрузки DLL библиотек отладчик спросит у вас проанализировать файл или нет. Отвечайте No(нет). Всё с этого момента начинается распаковка. Мы стоим на Ep(Entry Point – точка входа в запакованную программу), а это команда pushad(сохранение всех регистров в стеке).

01020C50 > 60               PUSHAD

Теперь придется вернуться к теме работы пакеров. Почти все анпакеры перед своей работой сохраняют все значения регистров в стеке, а после работы восстанавливают их. Теперь Вам скорее всего стало понятно как найти OEP. Если не стало, тогда я вам расскажу, надо пролистать асамблерский листинг вниз и найти команду popad и поставить на ней брейкпоинт. Как ставить брейкпоинт Вы, наверное, знаете, если не знаете, то надо щёлкнуть по строке, на которой надо поставить брейкпоинт и нажать F2. Теперь осталось совсем немного до OEP. Жмём F9 для запуска приложения. Оп-па, отладчик остановился на брейкпоинте.

------------------------------------------
01020D96 EBE1 JMP SHORT calc.01020D79
01020D98 FF9698680200 CALL DWORD PTR DS:[ESI+26898]
01020D9E 61 POPAD - здесь брейкпоинт и здесь же тормознулись
01020D9F E9D116FFFF JMP calc.01012475
01020DA4 0000 ADD BYTE PTR DS:[EAX],AL
01020DA6 0000 ADD BYTE PTR DS:[EAX],AL
------------------------------------------

Теперь обратите внимание на Jmp – переход после POPAD. Это переход на OEP. Теперь записываем OEP и радуемся. Но “самое главное” я Вам не сказал – обратите внимание на то, что после перехода на OEP идут нули. Если листаете ассамблерский листинг достаточно быстро, Вы можете пропустить переход на OEP, но если заметите огромную кучу нулей, тогда смотрите повыше – там и будет переход.  
P.P.S. Есть ещё один универсальный способ нахождения ОЕР. При помощи этого способа можно найти ОЕР в 90% случаях. В общем: загружайте программу под Olly, сделайте активным  окно дампа (внизу), нажмите Ctrl+G и введите esp-4. Перед Вами окажутся данные, находящиеся по адресу esp-4. Выделите первые четыре байта в этом окне, щёлкните по ним правой кнопкой мыши и выберите Breakpoint=>Hardware, on access=>Word. Теперь понажимайте по F9(обычно с первого раза) и Вы окажетесь прямо перед переходом на ОЕР. Установку брейкпоинта можно автоматизировать. Не куда не щёлкайте, не чего не делайте, а наберите hr esp-4. Да-да, в Olly есть замена bpm esp-4. Эта команда делает абсолютно тоже самое! В догонку, иногда hr esp-4 не работает, используйте hr esp-24.

1.1.2 Поиск OEP c помощью SoftIce
С SoftIce распаковка простейших пакеров некоторым кажется полегче. Чтобы остановиться на EP надо зайти в PeTools или Lord_Pe и выбрать опцию Break&Enter, выскочит окно в котором будет примерно такое содержание: “Зайдите в SoftIce и наберите bpint3, выйдите из SoftIce и запомните вот что: eb eip 0xXX после этого нажмите на ОК и вывалитесь в отладчике, после чего наберите eb eip XX и вы будете стоять на Entry Point”. Этот способ был придуман давно (им пользовалась моя бабушка :) Теперь осталось набрать bc* после чего bpm esp-4. Теперь если нажать F5 то Вы скорее всего окажетесь у перехода к OEP (если не окажетесь жмите F5 ещё раз) После нахождения перехода на OEP дотрассируйте программу до самого перехода (не забудьте его записать) и введите(в отладчике) вот такие команды:
a [Enter]
jmp eip [Enter]
[Enter]
Всё, теперь программа зациклена и можно снимать дамп. Если у вас возникнет вопрос для чего надо зацикливать программу, то вы интересуетесь крякерством больше, чем те у кого этот вопрос не возник. Я отвечу на этот вопрос: дамп надо снимать с ещё не работающего приложения, если снять дамп во время работы приложения, тогда содержание файла будет исковерканным (во время работы приложения, данные в памяти меняются) – в общем дамп не заставить работать. Именно по этому мы зацикливаем приложение на переходе к OEP (приложение распаковано, но ещё не работало).

1.2.1 Сдирание дампа с помощью PeTools by NEOx
Сначала надо сказать, что PeTools by NEOx самый мощный дампер из всех с которыми мы будем работать. Теперь о настройках Options => Set Options.



Настройте всё как у меня, нажмите ОК и можете дампить. Дампить надо в главном окне выбрав в верхнем списке процесс который надо дампить, в нижнем списке выберите exe файл приложения, щёлкайте правой кнопкой по процессу в нижнем списке и выбирайте Dump Full. Ну, как сохранить дамп я думаю, вы догадаетесь. На этом дампирование окончено.  

1.2.2 Сдирание дампа с помощью Olly Dump
Olly Dump очень хороший дампер, так как после него не надо даже восстанавливать импорт (импорт восстановит он сам), но данный дампер восстанавливает импорт только у простейших упаковщиков и бессилен против “крутых” упаковщиков и протекторов. Дампить надо, когда стоите на OEP программы. Вызывается он из меню(сверху) Plugins=>OllyDump=>Dump debugger process. Сравним настройки:



Всё, жмём Dump и выбираем, где сохранить дамп. Иногда второй метод восстановления импорта не срабатывает, пробуйте первый. Если не сработает ни один из способов восстановления импорта, тогда восстанавливайте с помощью ImportRecovery.

1.2.3 Сдирание дампа с помощью ProcDump
Дампить ProcDump`Ом практически так же, как и с помощью PeTools. Сравниваем настройки и в бой:



1.2.4 Сдирание дампа с помощью Lord_PE
Сверим настройки:



Настройте всё как у меня и сдерите дамп как с PeTools.

1.3.1 Восстановление импорта с помощью Import REConstructor
Зачем восстанавливать импорт говорилось выше. Теперь приступим непосредственно к восстановлению. Запустим Import REConstructor. Запустим наш ЗАПАКОВАННЫЙ файл. (Зайдём в настройки Import REConstructor(кнопкаOptions) и смотрим, стоит ли галочка рядом с надписью Fix EP to OEP, если стоит тогда продолжайте читайте ниже, но если не стоит то поставьте, надпись Fix EP to OEP в переводе на русский значит – Исправить точку входа в программу с стой которая была на ту которую Вы введёте в поле OEP.) Заходим в Import REConstructor и выбираем нужный процесс (который Вы уже должны были запустить). Теперь будем вычислять RVA OEP = OEP(вы его записали) – Image Base. Примечание: практически всегда равен 400000, но в данном случае Image Base не равняется 400000. Image Base можно посмотреть в Pe Editor`е, который входит в состав Pe Tools. В Pe Editor`е есть кнопка Optional Header, ну а там найти строку c Image Base не проблема. Значит Image Base равна 1000000. Теперь считаем  01012475-1000000=12475. OEP у меня равна 12475. Полученную OEP вписываем в соответствующее поле в Import REConstructor и жмём IAT AutoSearch, а нам окно с надписью “Скорее всего таблица импорта найдена, нажмите Get Imports” и мы конечно по рекомендации жмём Get Imports. В окошке повыше появились импортируемые адреса. Жмём Show Invalid и нам программа должна показать неопознанные функции. Если Вам что-то показал, тогда жмите Auto Trace. Теперь не осталось не одной неопознанной функции. Жмём Fix Dump и выбираем наш дамп. Всё распаковка закончена. Запускайте дамп, он запускается(если не запускается, то Вы сделали что-то неправильно). У—У—Р—Р—А—А.

2. Распаковка AsPack 1.21


Пару слов об упаковщике. Данный упаковщик написан Алексеем Солодниковым (им же написан очень популярный на сегодняшний день протектор AsProtect). AsPack упаковывает программы хуже, чем UPX, да к тому же он платный.

2.1.1 Поиск OEP с помощью Olly Debugger
Поиск ОЕР в AsPack`е такой же, как и в UPX, но переход на OEP выглядит по-другому. Делаем все так же как и с UPX, но переход будет выглядеть так:

------------------------------------------
010043AF   . 61             POPAD - Восстанавливаем регистры
010043B0   . 75 08           JNZ SHORT 010043BA - Этот переход должен сработать
010043B2   . B8 01000000     MOV EAX,1 - Ненужный код
010043B7   . C2 0C00         RETN 0C -  Ненужный код
010043BA   > 68 00000000   PUSH 0 - OEP
010043BF   . C3             RETN - Сюда брейкпоинт
------------------------------------------

Теперь Вы спросите, где же здесь знакомый нам JMP. В AsPack нет JMP, но в нём как и в очень многих других пакерах переход осуществляется заносом в стек OEP и возврат на OEP с помощью Ret. Надо запомнить, что когда вы стоите на самом начале распаковщика, то в стек заносится 0, но если поставить брейкпоинт на RETN и посмотреть, что ложится в стек Вы наверное очень обрадуетесь(в стек будет ложиться OEP. Именно OEP и надо записать на листочек :)). После того, как Вы запишите OEP (желательно, чтобы Вы стояли на Ret) нажмите F8 и убедитесь, что далее будет следовать стандартная программа. Всё останавливайтесь на самом начале распакованной программы и можете дампить.

2.1.2 Поиск OEP с помощью SoftIce
Поиск ОЕР в AsPack`е такой же, как и в UPX, но переход на OEP выглядит по-другому. Делаем все так же как и с UPX, но переход будет выглядеть так:

------------------------------------------
010043AF 61 POPAD - Восстанавливаем регистры
010043B0 75 08 JNZ SHORT 010043BA - Этот переход должен сработать
010043B2 B8 01000000 MOV EAX,1 - Ненужный код
010043B7 C2 0C00 RETN 0C -  Ненужный код
010043BA 6800000000 PUSH 0 - OEP
010043BF C3 RETN - Сюда брейкпоинт
------------------------------------------

Теперь Вы спросите, где же здесь знакомый нам JMP. В AsPack нет JMP, но в нём как и в очень многих других пакерах переход осуществляется заносом в стек OEP и возврат на OEP с помощью Ret. Надо запомнить, что когда вы стоите на самом начале распаковщика, то в стек заносится 0, но если поставить брейкпоинт на RETN и посмотреть, что ложится в стек Вы наверное очень обрадуетесь(в стек будет ложиться OEP. Именно OEP и надо записать на листочек :)). После того, как Вы запишите OEP (желательно, чтобы Вы стояли на Ret) нажмите F8 и убедитесь, что далее будет следовать стандартная программа. Всё останавливайтесь на Retn и пишите (ясен пень, то что в SoftIce`е)
a [Enter]
jmp eip [Enter]
[Enter]
Всё, теперь можно дампить.

2.2.1 Сдирание дампа с помощью PeTools by NEOx
Сдирать дамп надо так же, как с UPX.

2.2.2 Сдирание дампа с помощью Olly Dump
Сдирать дамп надо такомощью Lord_PE
Сдирать дамп надо так же, как с UPX.

2.3.1 Обрезание секций упаковщика.
Секции упаковщика можно обрезать, а можно и нет. Секции упаковщика обрезают для уменьшения размера файла. Эти секции мизерны, но я всё равно параноически их обрезаю. Для перестраивания ресурсов понадобится программа ResFixer. Ресурсы надо перестраивать из-за того, что некоторые упаковщики забирают в себя часть ресурсов программы. Удаляя секцию распаковщика, мы удаляем часть ресурсов, к тому же если секцию распаковщика оставить, тогда невозможен будет просмотр и изменение ресурсов программы программами типа Restorator и т.п. Начнём. Запускайте ResFixer и открывайте под ним нужный вам дамп программы. Перед Вами появится картина подобная этой:



Т.е. все ресурсы распаковщик захапал в свою секцию. Надо поправить. Жмём Rebuild (не забудьте выбрать метод Full reconstruct) и сохраняем в удобном для Вас месте ресурсы (название файла лучше не менять). Закрываем ResFixer. Заходим в PeTools и выбираем в меню Tools => Pe Editor, выбираем наш дамп. Жмём по кнопке Section. Можно удалять последние три секции (удалять секцию ресурсов надо т.к. она не полная). Выбирайте Kill section (from file). Это секции распаковщика. Кол-во секций добавляемых распаковщиком можно узнать, если запаковать свою программу и сравнить кол-во секций до упаковки и после (примечание – обычно последняя секция оригинальной программы - .rsrc). Теперь жмите правой кнопкой по любой секции и выбирайте Load section from disk…. Выбирайте Вашу секцию ресурсов и прицепляйте к файлу. Запомните параметры новой секции – Virtual Offset и Virtual Size. Жмите Close. Жмём Directories. Видим такую картину:



Теперь впишите в характеристики директории ресурсов параметры, которые вы запоминали(Virtual Offset – RVA, Virtual Size – Size). Жмите Save, Close. Все, секции обрезаны. Можно в PeTools сделать Rebuild PE, применительно к своему файлу (оптимизация структуры файла, уменьшение размера и т.д.)

2.4.1 Восстановление импорта с помощью Import REConstructor
Восстанавливать импорт, так же как и с UPX.

3. PE Compact


Если Вам интересно немного узнать о PE Compact, тогда читайте текст ниже. PE Compact написан челами из collakesoftware. PE Compact сжимает некоторые большие проги лучше, чем UPX. Распаковывается он без проблем. В общем неплохой упаковщик файлов.

3.1.1. Поиск OEP c помощью Olly Debugger.
Распаковку, как всегда, надо начинать с загрузки запакованной программы под отладчиком. После загрузки мы стоим тут:

------------------------------------------
01004000 JMP SHORT write.01004008 - Стоим тут
01004002 PUSH 1137 - ОЕР, при том без ImageBase!!!!!!!!!
01004007 RETN
01004008 PUSHFD
01004009 PUSHAD
0100400A CALL write.01004011
0100400F XOR EAX,EAX
01004011 MOV EAX,ESP
01004013 ADD EAX,4
01004016 XCHG EAX,EBX
01004017 MOV ESP,EBX
01004019 MOV EBX,DWORD PTR DS:[EBX-4]
0100401C SUB EBX,40903F
01004022 XCHG EBP,EBX
01004024 MOV EAX,DWORD PTR SS:[EBP+4090E6]
0100402A ADD DWORD PTR SS:[EBP+409033],EAX
01004030 MOV WORD PTR SS:[EBP+409030],9090
01004039 ADD DWORD PTR SS:[EBP+4090DA],EAX
0100403F ADD DWORD PTR SS:[EBP+4090DE],EAX
01004045 ADD DWORD PTR SS:[EBP+4090E2],EAX
0100404B MOV EBX,117B
01004050 ADD EBX,DWORD PTR SS:[EBP+4090EA]
01004056 ADD EBX,DWORD PTR SS:[EBP+4090E6]
0100405C PUSH EBX
0100405D MOV EAX,EBX
0100405F MOV EDI,EBX
01004061 SUB EAX,4090AC
01004066 MOV DWORD PTR SS:[EBP+4090AD],EAX
0100406C LEA ESI,DWORD PTR SS:[EBP+4090AC]
01004072 MOV ECX,440
01004077 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
01004079 MOV EDI,EBX
0100407B RETN
------------------------------------------

Да, ну и диво паковщик. ОЕР написана сразу после ЕР. ОЕР известна, но не пытайтесь выполнять команду типа bp xxxxxxxx. xxxxxxxx – OEP. Вы должны знать, как ставятся  брейкпоинты  в программе – в нужный адрес в программе вставляется команда int 3(третье прерывание). Если поставить брейкпоинт, то он сотрётся при распаковке программы. Надо ставить брейкпоинт на память. Делаем так:
1. Жмём Ctrl+G.
2. Набираем результат такой операции – OEP(Без Image Base)+ImageBase (как найти ImageBase говорилось в разделе про UPX(восстановление импорта)) и жмём ОК.
3. Щёлкаем правой кнопкой по строке, на которую Вы попали после нажатия ОК. Выбираем пункт меню BreakPoint=>Hardware, on execution.
4. Жмём F9 и останавливаемся на ОЕР.
5. Смотрим ОЕР.

------------------------------------------
01001137 6A DB 6A
01001138 70 DB 70
01001139 68 DB 68
0100113A 98 DB 98
0100113B 10 DB 10
0100113C 00 DB 00
------------------------------------------

Первый вопрос, который Вы зададите – Чё это за дерьмо :). Это не дерьмо. Нажмите Ctrl+A, а отладчик в ответ спросит, сжатый код – Отвечайте да(возможно результат Вас не порадует и Вы будете видеть то же самое, тогда снова нажмите Ctrl+A и не дожидаясь того, как полоска дойдёт до конца нажмите пробел, описанный здесь случай бывает очень редко). Код преобразовался к такому:

------------------------------------------
01001137 6A70 PUSH 70 OEP
01001139 6898100001 PUSH 01001098
0100113E E8DD010000 CALL 01001320
01001143 33DB XOR EBX,EBX
01001145 53 PUSH EBX
01001146 8B3D 08100001   MOV EDI,DWORD PTR DS:[1001008]
0100114C FFD7 CALL EDI
------------------------------------------

Ну и всё можно дампить.

3.1.2 Поиск OEP с помощью SoftIce
Начнём с того, что прервемся в SoftIce на EP(как это сделать написано в главе про UPX). Вводим команду bpm esp-4 и нажимаем F5. прерываемся чуть ниже EP, жмём опять F5 и прерываемся тут:

--------------------------------------
01026099 POP EDX
0102609A POP ESI
0102609B POP EDI
0102609C POP ECX
0102609D POP EBX
0102609E POP EBP
0102609F JMP EAX - Прыжок на ОЕР
010260A1 JNZ SHORT 010260C7
--------------------------------------

Отсюда видно, что переход по адресу 0102609F переходит на ОЕР. ОЕР = 1001137. Теперь набираем команды:
a [Enter]
jmp eip [Enter]
[Enter]
Всё, программа зациклена. Можно дампить.

3.2.1 Сдирание дампа с помощью PeTools by NEOx
Сдирать дамп надо так же, как с UPX.

3.2.2 Сдирание дампа с помощью Olly Dump
Сдирать дамп надо так же, как с UPX.

3.2.3 Сдирание дампа с помощью ProcDump
Сдирать дамп надо так же, как с UPX.

3.2.4 Сдирание дампа с помощью Lord_PE
Сдирать дамп надо так же, как с UPX.

3.3.1 Обрезание секций упаковщика.
Новичкам здесь лучше оставить все секции упаковщика на месте.

3.4.1 Восстановление импорта с помощью Import REConstructor
Восстанавливать импорт, так же как и с UPX.

4. PE Diminisher


PE Diminisher – самый слабый упаковщик из всех, которые я видел. В настоящее время не используется. В данной статье он представлен только для примера.

4.1.1. Поиск OEP c помощью Olly Debugger.
Как всегда, загружаем прогу под отладчиком. Останавливаемся на EP, то есть тут:

---------------------------------------------------
0101F000 53 PUSH EBX - Тут остановились
0101F001 51 PUSH ECX
0101F002 52 PUSH EDX
0101F003 56 PUSH ESI
0101F004 57 PUSH EDI
0101F005 55 PUSH EBP
0101F006 E800000000 CALL calc.0101F00B
------------------------------------------

Из этого кода видно, что авторы упаковщика не знакомы с командой pushad(сохранить все регистры в стеке). Ну ладно, что-то отошли от темы. Листаем ассемблерский листинг вниз, до таких команд:

------------------------------------------
0101F08D 5D POP EBP
0101F08E 5F POP EDI
0101F08F 5E POP ESI
0101F090 5A POP EDX
0101F091 59 POP ECX
0101F092 5B POP EBX
0101F093 FFE0 JMP EAX - Прыжок на ОЕР
------------------------------------------

Вот вам и переход на ОЕР. JMP EAX это прыжок на адрес который находится в регистре EAX. Ставим брейкпоинт на адрес 101А093 и жмём F9(запуск программы), прерываемся на адресе 101А093. Смотрим регистр ЕАХ и записываем ОЕР. Всё, можно дампить.

4.1.2 Поиск OEP с помощью SoftIce.
Искать ОЕР с помощью SoftIce`а так же, как и с помощью OllyDebugger`а. Прерывайтесь на ЕР, листайте код вниз и ищите команды типа:

------------------------------------------
0101F08D 5D POP EBP
0101F08E 5F POP EDI
0101F08F 5E POP ESI
0101F090 5A POP EDX
0101F091 59 POP ECX
0101F092 5B POP EBX
0101F093 FFE0 JMP EAX - Прыжок на ОЕР
------------------------------------------

Двойным щелчком мыши по строке с командой JMP EAX ставьте брейкпоинт, или наберите в консоли SoftIce`а команду типа bpx 1001F093. Нажмите F5 для запуска программы и Вы остановитесь на строке с адресом 0101F093. Записывайте на бумажку содержимое регистра eax и набирайте команды:
A [Enter]
Jmp eip [Enter]
[Enter]
Всё, можно дампить.

4.2.1 Сдирание дампа с помощью PeTools by NEOx
Сдирать дамп надо так же, как с UPX.

4.2.2 Сдирание дампа с помощью Olly Dump
Сдирать дамп надо так же, как с UPX.

4.2.3 Сдирание дампа с помощью ProcDump
Сдирать дамп надо так же, как с UPX.

4.2.4 Сдирание дампа с помощью Lord_PE
Сдирать дамп надо так же, как с UPX.

4.3.1 Обрезание секций упаковщика.
Всё делать как с AsPack.

4.4.1 Восстановление импорта с помощью Import REConstructor
Восстанавливать импорт, так же как и с UPX.

5. VBOX 4.3 - 4.6.x


Распаковывать я буду Bryce 5(2001 год) и Ulead Photo Explorer 7.0(2001 год). Для начала мне бы хотелось сказать об этой защите несколько слов. Это не упаковщик, а протектор. Кто-то его называет довольно-таки стойким протектором, а кто-то (вроде меня) UPX`ом :). Данную защиту мы будем снимать только под Olly Debugger`ом, т.к. я его исследовал только под ним и нашёл несколько уловок, которые помогают в распаковке. Несколько слов о том, с чем придётся столкнуться:
1. Обнаружение отладчика.
2. Полиморфный код(мутирует при трассировке).
3. Переадресация таблицы импорта.
4. Попытки спрятать переход на ОЕР.
5. Scrambed-код(мусорные инструкции).
Расскажу по-подробнее, про все пункты:
1. Хотя версия VBox`а ещё за 2001 год, но она обнаруживает даже Olly Debugger. Методы обнаружения:
1.1. При помощи функции IsDebuggerPresent. Если отладчика нет, тогда эта функция вернёт в регистре eax - FFFFFFFFh. Против этого способа нам помогут плагины (которые я посоветовал скачать) – HideDebugger и IsDebugerPresent.
1.2. Этот способ стар, как мир. Сначала указывают обработчик исключительных ситуаций, затем вызывают int 3. Если произойдёт ошибка – всё нормально, переход на обработчик исключительных ситуаций, если ошибка не происходит, значит, кто-то использует третье прерывание, а его использует, конечно, только отладчик.  Команда int 3 спрятана с использованием полиморфного кода. Это выглядит так:

---------------------------------------------------------
011F6C12 97 XCHG EAX, EDI
011F6C13 3BC1 CMP EAX, ECX
011F6C15 7501 JNZ SHORT 011F6C18 - Выполняется всегда
011F6C17 8BCC MOV ECX, ESP
011F6C19 8BC1 MOV EAX, ECX
011F6C1B 5F POP EDI
011F6C1C 5E POP ESI
011F6C1D 5D POP EBP
011F6C1E C3 RETN
---------------------------------------------------------

Команда int 3 – это байт CCh. Теперь подумайте, после выполнения перехода выполнится какая команда. Других способов я не нашёл.

2. Про полиморф я рассказывал чуть выше.

3. Переадресация таблицы импорта была придумана давненько. В данной защите она выполнена не плохо, но её обойти достаточно просто. Если не обойти переадресацию, тогда практически все функции будут переадресованы в dll библиотеку защиты. Такую таблицу импорта Вы будете восстанавливать очень долго.

4. Попытки спрятать переход на ОЕР. Этот механизм нам нисколько не помешает. Я нашёл хороший способ нахождения ОЕР.

5. Scrambed-код(мусорные инструкции). Это выглядит примерно так:
00400000 mov al,1
00400002 jmp 00400010
…………………………….
00400010 cmp al, 0
00400012 jmp 00400030
………………………...….
00400030 call 00400050
00400050 jmp 00400070
То есть Вас пытаются запутать.

5.1.1 Обход шифрования таблицы импорта.
Bryce 5:
Хочется сказать несколько обобщающих слов по поиску места, где шифруется таблица импорта. Если Вы не знаете, из чего состоит таблица импорта, тогда я Вам объясню. Сначала идёт таблица ссылок на имена, потом таблица имен функций, потом таблица адресов функций импорта. Чтобы узнать адрес загрузки нужной библиотеки (в exe файлах это ImageBase), используется функция GetModuleHandleA. После того, как получен адрес загрузки, надо узнать адрес импортируемой функции. Для этого используется функция GetProcAddress. Этой функции первым параметром надо передать название библиотеки(dll), а вторым название функции. Именно с помощью этой функции и ловится создание таблицы импорта. Всё, хватит теории - пора переходить к практике. Загрузите запакованную программу под отладчиком. Вы будете стоять на месте, похожем на это:

---------------------------------------------------------
008931E8 2BC4 SUB EAX, ESP
008931EA 0BC4 OR EAX, ESP
008931EC 7500 JNZ SHORT 008931EE
008931EE 0BC5 OR EAX, EBP
008931F0 86E0 XCHG AL, AH
008931F2 33C0 XOR EAX, EAX
008931F4 33C5 XOR EAX, EBP
008931F6 33C4 XOR EAX, ESP
008931F8 86E0 XCHG AL, AH
008931FA 8BC5 MOV EAX, EBP
008931FC F7D0 NOT EAX
008931FE 8BC5 MOV EAX, EBP
00893200 EB 00 JMP SHORT 00893202
00893202 8BC4 MOV EAX, ESP
00893204 40 INC EAX
00893205 48 DEC EAX
00893206 85C0 TEST EAX, EAX
00893208 86E0 XCHG AL, AH
0089320A EB33 JMP SHORT 0089323F
---------------------------------------------------------

Здесь нет абсолютно ничего интересного. Вдумчивый читатель уже должен был сообразить, что надо начинать обходить шифрование таблицы импорта. Если Вы сейчас запустите программу на выполнение (F9), тогда защита обнаружит отладчик. Следует сделать настройку отладчика:



Теперь жмите F9 и дожидайтесь появления окна VBox`а. Если перед вами появится красивое окно с тремя кнопочками и картинкой, тогда всё в порядке, а если не появится, а появилась надпись, что запущен отладчик, тогда проверьте, установлены ли у Вас плагины, про которые говорилось выше. Теперь самое время поставить брейкпоинт на функцию GetProcAddress (bp GetProcAddress учитывайте регистр). Жмите на кнопку Try (если у Вас уже прошёл срок Trial`а, тогда поищите программы для чистки реестра от записей VBox`а) и Вы сразу тормознётесь на брейкпоинте. Нажмите Ctrl+F9 и Вы окажетесь на месте, похожем на это:

-------------------------------------------------------------
0700B66A E9BF000000 JMP 0700B72E
0700B66F 56 PUSH ESI
0700B670 FF75DC PUSH DWORD PTR SS:[EBP-24]
0700B673 FF15D4710407 CALL DWORD PTR DS:[70471D4]
0700B679 8BF8 MOV EDI, EAX - Окажетесь тут
0700B67B E9AE000000 JMP 0700B72E
0700B680 8B7110 MOV ESI, DWORD PTR DS:[ECX+10]
0700B683 C1E604 SHL ESI, 4
0700B686 03758C ADD ESI, DWORD PTR SS:[EBP-74]
0700B689 F6451C 07 TEST BYTE PTR SS:[EBP+1C], 7
0700B68D 7463 JE SHORT 0700B6F2
0700B68F 395DB0 CMP DWORD PTR SS:[EBP-50], EBX
0700B692 745E JE SHORT 0700B6F2
0700B694 68404B0507 PUSH 07054B40
-------------------------------------------------------------

Теперь перейдите по F8 по переходу JMP 0700B72E и Вы окажетесь на коде, похожем на этот:

----------------------------------------------------------
0700B72E 3BFB CMP EDI, EBX - Окажетесь тут
0700B730 0F84D4010000 JE 0700B90A
0700B736 8B45D8 MOV EAX, DWORD PTR SS:[EBP-28]
0700B739 8B7016 MOV ESI, DWORD PTR DS:[EAX+16]
0700B73C 037508 ADD ESI, DWORD PTR SS:[EBP+8]
0700B73F 395DF0 CMP DWORD PTR SS:[EBP-10], EBX - Идёт интересное сравнение
0700B742 7435 JE SHORT 0700B779 - Интересный переход
0700B744 8D85E0FEFFFF LEA EAX, DWORD PTR SS:[EBP-120]
0700B74A 50 PUSH EAX
0700B74B FF75DC PUSH DWORD PTR SS:[EBP-24]
0700B74E 57 PUSH EDI
----------------------------------------------------------

Сразу скажу, что в буфере по адресу EBP-10 лежит 01 или 00. Если лежит 00, тогда переход выполнится и функция останется непереадресованной. Не буду долго томить длинными разговорами. Я лучше скажу: “Если заменить Je на Jmp, тогда таблица импорта останется не тронутой и создастся без переходников”. Нажмите Alt+B и удалите все брейкпоинты.

Ulead Photo Explorer 7.0:
Здесь я опишу лишь отличия обхода шифрования таблицы импорта. Делаем всё также, но после нажатия Ctrl+F9 Вы окажетесь в таком месте:

------------------------------------------------------------------
0700BB30 E83BA60000 CALL 07016170
0700BB35 50 PUSH EAX
0700BB36 FF75E0 PUSH DWORD PTR SS:[EBP-20]
0700BB39 FF15C8210407 CALL DWORD PTR DS:[70421C8] - Вышли
0700BB3F 8BF8 MOV EDI, EAX
0700BB41 3BFB CMP EDI, EBX
0700BB43 0F849D010000 JE 0700BCE6
0700BB49 8B7616 MOV ESI, DWORD PTR DS:[ESI+16]
0700BB4C 037508 ADD ESI, DWORD PTR SS:[EBP+8]
0700BB4F 395DDC CMP DWORD PTR SS:[EBP-24], EBX
0700BB52 7435 JE SHORT 0700BB89 - Вот этот переход
0700BB54 8D85ECFEFFFF LEA EAX, DWORD PTR SS:[EBP-114]
0700BB5A 50 PUSH EAX
0700BB5B FF75E0 PUSH DWORD PTR SS:[EBP-20]
0700BB5E 57 PUSH EDI
0700BB5F E8FD030000 CALL 0700BF61
0700BB64 83C40C ADD ESP, 0C
0700BB67 85C0 TEST EAX, EAX
0700BB69 741E JE SHORT 0700BB89
0700BB6B FF7528 PUSH DWORD PTR SS:[EBP+28]
0700BB6E 57 PUSH EDI
0700BB6F FF7524 PUSH DWORD PTR SS:[EBP+24]
0700BB72 FF7520 PUSH DWORD PTR SS:[EBP+20]
0700BB75 E884020000 CALL 0700BDFE
0700BB7A 83C410 ADD ESP, 10
0700BB7D 3BC3 CMP EAX, EBX
0700BB7F 0F8451020000 JE 0700BDD6
0700BB85 8906 MOV DWORD PTR DS:[ESI], EAX
0700BB87 EB02 JMP SHORT 0700BB8B
------------------------------------------------------------------

Если заменить переход по адресу 0700BB52, тогда защита не переадресует таблицу импорта. Как Вы уже должны заметить – это более старый VBox. В Bryce для запутывания сделан переход на другой код сразу после возвращения. Если бы я его не заметил, то полгода бы импорт восстанавливал.

5.2.1 Поиск ОЕР.
Bryce 5:
Про ОЕР, я много говорить не буду, но скажу, что она находится проще, чем в UPX. Нажмите Alt+M и поставьте брейкпоинт (на память) на секцию Вашей программы, где находится код программы:



Жмите на F9 и Вы на ОЕР!!!!!!!! Если вы не оказались на ОЕР, а оказались на каких-то странных инструкциях, нажимайте F9 до тех пор, пока не почувствуете, что Вы на ОЕР.

P.S. Восстановить работоспособность практически всех программ после распаковки довольно таки проблематично (программы используют функции защиты, чтобы проверить регистрационный ключ). Вызовов проверок ключей во всей программе обычно очень много. Отключить такие проверки очень проблематично, даже если Вы знаете все адреса где вызываются проверки :(((.

5.3.1 Сдирание дампа с помощью PeTools by NEOx
Сдирать дамп надо так же, как с UPX.

5.3.2 Сдирание дампа с помощью Lord_PE
Сдирать дамп надо так же, как с UPX.

5.4.1 Обрезание секций упаковщика.
Всё делать как с AsPack.

5.5.1 Восстановление импорта с помощью Import REConstructor
Восстанавливать импорт, так же как и с UPX.

6. Exe Stealth


Сразу хочу сказать, что данный упаковщик я буду распаковывать только под Olly Debugger (у меня перестал работать SoftIce :((((. Как всегда пару слов о распаковке. В принципе называть данный упаковщик, упаковщиком неправильно, т.к. данный ПРОТЕКТОР не только упаковывает, но ещё и защищает программу. Его главное окно выглядит так:



Отсюда видно, что в упаковщике присутствуют функции защиты от изменений, переадресация таблицы импорта, защита от дампа процесса, защита от дизасемблирования, обнаружение отладчиков(не только SoftIce`а, но и остальных т.к. используется функция IsDebuggerPresent).

6.1.1. Поиск OEP c помощью Olly Debugger.
Загружаем защищённую программу под отладчиком и видим такую картину:

---------------------------------------------------------------------
00464060 EB 00 JMP SHORT 00464062 - Стоим тут.
00464062 EB 2F JMP SHORT 00464093
00464064 53 68 61 72 65 ASCII "Shareware - ExeS" - LOL
00464074 74 65 61 6C 74 ASCII "tealth",0 - LOL
0046407B EB 16 JMP SHORT 00464093
0046407D 77 77 77 2E 77 ASCII www.webtoolmaste - LOL
0046408D 72 2E 63 6F 6D ASCII "r.com",0 - LOL
00464093 60 PUSHAD
00464094 90 NOP
00464095 E8 00000000     CALL 0046409A
0046409A 5D POP EBP
0046409B 81ED F0274000 SUB EBP, 004027F0
004640A1 B9 15000000 MOV ECX, 15
004640A6 83C1 05 ADD ECX, 5
004640A9 EB 05 JMP SHORT 004640B0
004640AB EB FE JMP SHORT 004640AB
---------------------------------------------------------------------

Хе-хе реклама прямо в распаковщике. Наберите в command bar`е hr esp-4 [Enter]. Теперь понажимайте по F9(обычно с первого раза) и Вы окажетесь прямо перед переходом на ОЕР:

-------------------------------------------
004647E6 50 DB 50
004647E7 33 DB 33
004647E8 C0 DB C0
004647E9 64 DB 64
004647EA FF DB FF
-------------------------------------------

Во, прикол. Жмите Ctrl+A и очень быстро на пробел. Если Вы успели нажать, тогда код станет такого вида:

-------------------------------------------
004647E5 61 POPAD - !!!!!!!!!!! вот тот самый popad!!!!!!!!!!!!!
004647E6 50 PUSH EAX
004647E7 33C0 XOR EAX, EAX
004647E9 64FF30 PUSH DWORD PTR FS:[EAX]
004647EC 648920 MOV DWORD PTR FS:[EAX], ESP
004647EF EB01 JMP SHORT 004647F2
004647F1 8700 XCHG DWORD PTR DS:[EAX], EAX
-------------------------------------------

А вот и popad. Взгляните на команду по адресу 004647EF. Теперь подумайте на что этот переход прыгнет. Конечно на ноли :). Ну и ладно трассируйте через этот переход, когда выполнится команда из нолей Вы попадёте в ядро операционной системы нажмите несколько раз Ctrl+F9, пока не выйдите из ядра. После выхода из ядра Вы окажетесь на таком коде:

----------------------------------------------------
00450A14 55 DB 55
00450A15 8B DB 8B - Окажетесь здесь.
00450A16 EC DB EC
00450A17 83 DB 83
00450A18 C4 DB C4
00450A19 F0 DB F0
00450A1A B8 DB B8
00450A1B 34084500 DD 00450834
00450A1F E8 DB E8
00450A20 A4 MOVS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI]
00450A21 51 PUSH ECX
00450A22 FB STI
----------------------------------------------------

Да уж, такой код довольно-таки трудно понять, но Вы должны были заметить байт 55, это ОЕР. Запишите ОЕР на бумажку(00450A14) и радуйтесь жизни.
P. S. При восстановлении импорта надо вводить не тот адрес, на котором Вы оказались(00450A15), а ОЕР.

6.2.1 Сдирание дампа с помощью PeTools by NEOx
Сдирать дамп надо так же, как с UPX.

6.2.2 Сдирание дампа с помощью Olly Dump
Сдирать дамп надо так же, как с UPX.

6.2.3 Сдирание дампа с помощью ProcDump
Сдирать дамп надо так же, как с UPX.

6.2.4 Сдирание дампа с помощью Lord_PE
Сдирать дамп надо так же, как с UPX.

6.3.1 Обрезание секций упаковщика.
У меня не получилось обрезать секции так, чтобы дамп потом заработал.

6.4.1 Восстановление импорта с помощью Import REConstructor
Восстанавливать импорт, так же как и с UPX, но после нажатия Get Imports нажмите Show Invalid, щёлкнете правой кнопкой по любой функции и выберите Trace Level1 (Dizasm).

7. AsProtect 1.2


Как всегда, несколько слов о защите. Данный протектор написал Алексей Солодников. В данное время, этот протектор пользуется высокой популярностью. Популярность его, как мне кажется, не совсем оправдана. Протектор снимается без особых проблем. AsProtect я буду распаковывать только при помощи Olly Debugger`а, т.к. у меня сдох SoftIce.

7.1.1. Поиск OEP c помощью Olly Debugger.
Грузим запакованную программу под Olly Debugger`ом. И видим такую картину:

-----------------------------------------------------
01001000 6801400001 PUSH 01004001
01001005 C3 RETN
01001006 00 DB 00
01001007 00 DB 00
01001008 4A DB 4A
01001009 47 DB 47
0100100A E4 DB E4
-----------------------------------------------------

Принцип этого кода в том, что в стек кладётся 01004001, а потом при помощи ret`а переходит по этому адресу. Сразу скажу, нам этот код не нужен. Делаем настройку Olly Debugger`а – в настройках, в разделе Security, снимите все галочки, кроме первой. Нажмите F9, и отладчик прервётся на исключении. Теперь внимание!!! Жмите Shift+F9 и считайте кол-во нажатий до запуска программы(обычно 20-30 раз). Перезапускайте программу и делайте всё так же как и делали, но нажимайте Shift+F9 на один раз меньше(чтобы прога не запустилась). Вы должны остановиться на месте, похожем на это:

---------------------------------------------------------------------
007CFC2A 3100 XOR DWORD PTR DS:[EAX], EAX
007CFC2C 648F0500000000 POP DWORD PTR FS:[0]
007CFC33 58 POP EAX
007CFC34 833D34397D0000 CMP DWORD PTR DS:[7D3934], 0
007CFC3B 7414 JE SHORT 007CFC51
007CFC3D 6A0C PUSH 0C
007CFC3F B934397D00 MOV ECX, 7D3934
007CFC44 8D45F8 LEA EAX, DWORD PTR SS:[EBP-8]
007CFC47 BA04000000 MOV EDX, 4
007CFC4C E84BC7FFFF CALL 007CC39C
007CFC51 FF75FC PUSH DWORD PTR SS:[EBP-4]
007CFC54 FF75F8 PUSH DWORD PTR SS:[EBP-8]
007CFC57 8B45F4 MOV EAX, DWORD PTR SS:[EBP-C]
007CFC5A 833800 CMP DWORD PTR DS:[EAX], 0
007CFC5D 7401 JE SHORT 007CFC60
007CFC5F 50 PUSH EAX
007CFC60 FF75F0 PUSH DWORD PTR SS:[EBP-10]
007CFC63 FF65EC JMP DWORD PTR SS:[EBP-14]
007CFC66 5F POP EDI
007CFC67 5E POP ESI
007CFC68 5B POP EBX
007CFC69 8BE5 MOV ESP, EBP
007CFC6B 5D POP EBP
007CFC6C C3 RETN
---------------------------------------------------------------------

Когда Вы станете поопытней, тогда будете не считать нажатие клавиш, а на глаз определять это место. Жмите Ctrl+M и ставьте брейкпоинт на память, на секцию с кодом, у меня это выглядело так:



Теперь жмите Shift+F9(обычно 1-5 раз), пока Вы не окажетесь на ОЕР:

--------------------------------------------------------------------
01001137 6A70 PUSH 70 - OEP WordPad`а
01001139 6898100001 PUSH 01001098
0100113E E8DD010000 CALL 01001320
01001143 33DB XOR EBX, EBX
01001145 53 PUSH EBX
01001146 8B3D08100001 MOV EDI, DWORD PTR DS:[1001008]
0100114C FFD7 CALL EDI
0100114E 6681384D5A CMP WORD PTR DS:[EAX], 5A4D
01001153 751F JNZ SHORT 01001174
01001155 8B483C MOV ECX, DWORD PTR DS:[EAX+3C]
01001158 03C8 ADD ECX, EAX
0100115A 813950450000 CMP DWORD PTR DS:[ECX], 4550
01001160 7512 JNZ SHORT 01001174
01001162 0FB74118 MOVZX EAX, WORD PTR DS:[ECX+18]
01001166 3D0B0100000 CMP EAX, 10B
0100116B 741F JE SHORT 0100118C
--------------------------------------------------------------------

Наконец мы дошли до ОЕР.

7.2.1 Сдирание дампа с помощью PeTools by NEOx
Сдирать дамп надо так же, как с UPX.

7.2.2 Сдирание дампа с помощью Olly Dump
Сдирать дамп надо так же, как с UPX.

7.2.3 Сдирание дампа с помощью ProcDump
Сдирать дамп надо так же, как с UPX.

7.2.4 Сдирание дампа с помощью Lord_PE
Сдирать дамп надо так же, как с UPX.

7.3.1 Обрезание секций упаковщика.
Всё делать как с AsPack.

7.4.1 Восстановление импорта с помощью Import REConstructor
Восстанавливать импорт, так же как и с UPX, но после нажатия Get Imports нажмите Auto Trace.
P.S. В этом случае, распаковка прошла довольно-таки просто, но бывают случаи, когда какие-то участки кода защищённой программы зашифрованы, и без регистрационного ключа их не расшифровать. В целом AsProtect гордость России, т.к. с его помощью можно создать не плохую защиту и он распространён по всему миру. И ещё, распаковали мы его так просто из-за того, что использовали различные ухищрения. Если Вы хотите попробовать его распаковать без уловок и ухищрений, зайдите на сайт http://xtin.org, там найдите статью - Торжественное прохождение к OEP в AsProtect 1.2 - 1.Xxxx. Воот в этой статье написано полное прохождение к ОЕР в AsProtect.


8. PcGuard 4.


Меня этот протектор заинтересовал из-за статьи на cracklab`e. Я подумал, что протектор действительно мощный, т.к. статья по его снятию была даже длиннее, чем статья про AsProtect, как я ошибался. Я скачал этот протектор, защитил WordPad с помощью него с максимальными опциями защиты, начал распаковывать и … Не прошло и двух минут, как я запустил уже распакованную программу.  

8.1.1. Поиск OEP c помощью Olly Debugger.
Загружаем программу по OllyDebugger`ом и видим:

--------------------------------------------------
01003A00 FC CLD
01003A01 55 PUSH EBP
01003A02 50 PUSH EAX
01003A03 E800000000 CALL 01003A08
01003A08 5D POP EBP
01003A09 EB 01 JMP SHORT 01003A0C
01003A0B E3 60 JECXZ SHORT 01003A6D
01003A0D E803000000 CALL 01003A15
01003A12 D2EB SHR BL, CL
--------------------------------------------------

Гы-гы. Будем использовать старый проверенный способ – Hardware брейкпоинт на данные по адресу esp-4, при старте программы. Как поставить такой хитрый брейкпоинт написано в P.P.S., в главе про UPX (hr esp-4). Ну ладно, поставили брейкпоинт и жмём по F9 до х.. раз. Я жал 21 раз. Так что жмите 15-30 раз на F9, пока не очутитесь на ОЕР. Ознакомиться со стандартными видами ОЕР Вы можете Приложении 1. Так, я остановился на ОЕР:

----------------------------------------------
01012475 6A70 PUSH 70
01012477 68E0150001 PUSH 010015E0
0101247C E847030000 CALL 010127C8
01012481 33DB XOR EBX, EBX
01012483 53 PUSH EBX
01012484 8B3D20100001 MOV EDI, DWORD PTR DS:[]
0101248A FFD7 CALL EDI
----------------------------------------------

Это ОЕР программы на Micorsoft Visual C++ v.7.0.

8.2.1 Сдирание дампа с помощью PeTools by NEOx
Сдирать дамп надо так же, как с UPX.

8.2.2 Сдирание дампа с помощью Olly Dump
Сдирать дамп надо так же, как с UPX.

8.2.3 Сдирание дампа с помощью ProcDump
Сдирать дамп надо так же, как с UPX.

8.2.4 Сдирание дампа с помощью Lord_PE
Сдирать дамп надо так же, как с UPX.

8.3.1 Обрезание секций упаковщика.
Всё делать как с AsPack.

8.4.1 Восстановление импорта с помощью Import REConstructor
Восстанавливать импорт, так же как и с UPX. Меня удивило, что это протектор, но он не портит таблицу импорта!

9. MEW11 SE v1.1


Я не чего не знаю про этот упаковщик, только знаю, что он почти не где не используется и то, что я умею его снимать. Искать ОЕР будем при помощи OllyDebugger`a.

9.1.1. Поиск OEP c помощью Olly Debugger.
Грузим прогу под Olly и видим:

--------------------------------------------------------
0102CE89 E9C632FDFF JMP 01000154
0102CE8E 0C000200 DD 0002000C
--------------------------------------------------------

Да, не густо. F8 и видим:

--------------------------------------------------------
01000154  BE1C000201 MOV ESI, 0102001C
01000159  8BDE MOV EBX, ESI
0100015B  AD LODS DWORD PTR DS:[ESI]
0100015C  AD LODS DWORD PTR DS:[ESI]
0100015D  50 PUSH EAX
0100015E  AD LODS DWORD PTR DS:[ESI]
0100015F  97 XCHG EAX, EDI
01000160  B280 MOV DL, 80
--------------------------------------------------------

Вот это уже нормально. Опять используем hr esp-4. Поставили брейкпоинт. F9, не ОЕР, ещё раз. И вот ОЕР:

--------------------------------------------------------
01012475 6A70 PUSH 70
01012477 68E0150001 PUSH 010015E0
0101247C E847030000 CALL 010127C8
01012481 33DB XOR EBX, EBX
01012483 53 PUSH EBX
01012484 8B3D20100001 MOV EDI, DWORD PTR DS:[]
0101248A FFD7 CALL EDI
--------------------------------------------------------

Вот и всё.

9.2.1 Сдирание дампа с помощью PeTools by NEOx
Сдирать дамп надо так же, как с UPX.

9.2.2 Сдирание дампа с помощью Olly Dump
Сдирать дамп надо так же, как с UPX.

9.2.3 Сдирание дампа с помощью ProcDump
Сдирать дамп надо так же, как с UPX.

9.2.4 Сдирание дампа с помощью Lord_PE
Сдирать дамп надо так же, как с UPX.

9.3.1 Обрезание секций упаковщика.
Всё делать как с AsPack.

9.4.1 Восстановление импорта с помощью Import REConstructor
Восстанавливать импорт, так же как и с UPX.

10. WWPack32 1.x


Ну чё сказать на счёт данного пакера. Я его даже не качал. Я распаковывал прогу SamInside. Официальный сайт пакера http://www.webmedia.pl/.

10.1.1. Поиск OEP c помощью Olly Debugger.
Грузим прогу под Olly и видим:

-----------------------------------
004B9000 53 PUSH EBX
004B9001 55 PUSH EBP
004B9002 8BE8 MOV EBP, EAX
004B9004 33DB XOR EBX, EBX
004B9006 EB60 JMP SHORT 004B9068
-----------------------------------

Можно было сказать, что не чего не видим. Проходим по jmp и попадаем сюда:

-----------------------------------
004B9068 E800000000 CALL 004B906D
004B906D 58 POP EAX
004B906E 2D6D000000 SUB EAX, 6D
004B9073 50 PUSH EAX
004B9074 60 PUSHAD
004B9075 33C9 XOR ECX, ECX
004B9077 50 PUSH EAX
-----------------------------------

Вот это уже нормально. Значит теперь есть два способа:
1. Hardware брейкпоинт по адресу esp-4 (hr esp-4)
2. Пролистать вниз код в поисках подобного кода:

------------------------------------------------------
004B9282 61 POPAD
004B9283 58 POP EAX
004B9284 8BE8 MOV EBP, EAX
004B9286 2E038595020000 ADD EAX, DWORD PTR CS:[EBP+295]
004B928D 0599020000 ADD EAX, 299
004B9292 5D POP EBP
004B9293 5B POP EBX
004B9294 E9B58BF4FF JMP 00401E4E Прыжок на ОЕР.
------------------------------------------------------

Ну, вот и всё. Потерянная ОЕР найдена:)

10.2.1 Сдирание дампа с помощью PeTools by NEOx
Сдирать дамп надо так же, как с UPX.

10.2.2 Сдирание дампа с помощью Olly Dump
Сдирать дамп надо так же, как с UPX.

10.2.3 Сдирание дампа с помощью ProcDump
Сдирать дамп надо так же, как с UPX.

10.2.4 Сдирание дампа с помощью Lord_PE
Сдирать дамп надо так же, как с UPX.

10.3.1 Обрезание секций упаковщика.
Всё делать как с AsPack.

10.4.1 Восстановление импорта с помощью Import REConstructor
Восстанавливать импорт, так же как и с UPX.

Приложение 1.


Micorsoft Visual C++ v.7.0:

01012475 6A70 PUSH 70
01012477 68E0150001 PUSH 010015E0
0101247C E847030000 CALL 010127C8
01012481 33DB XOR EBX, EBX
01012483 53 PUSH EBX
01012484 8B3D20100001 MOV EDI, DWORD PTR DS:[]
0101248A FFD7 CALL EDI

Delphi:

00450A15 8BEC MOV EBP, ESP
00450A17 83C4F0 ADD ESP, -10
00450A1A B834084500 MOV EAX, 00450834
00450A1F E8A451FBFF CALL 00405BC8
00450A24 A104204500 MOV EAX, DWORD PTR DS:[452004]
00450A29 8B00 MOV EAX, DWORD PTR DS:[EAX]
00450A2B E88CE5FFFF CALL 0044EFBC
00450A30 8B0DE0204500MOV ECX, DWORD PTR DS:[4520E0]
00450A36 A1 04204500 MOV EAX, DWORD PTR DS:[452004]
00450A3B 8B00 MOV EAX, DWORD PTR DS:[EAX]
00450A3D 8B155C054500 MOV EDX, DWORD PTR DS:[45055C]
00450A43 E88CE5FFFF CALL 0044EFD4
00450A48 A104204500 MOV EAX, DWORD PTR DS:[452004]
00450A4D 8B00 MOV EAX, DWORD PTR DS:[EAX]
00450A4F E800E6FFFF CALL 0044F054
00450A54 E8C732FBFF CALL 00403D20
00450A59 8D40 00 LEA EAX, DWORD PTR DS:[EAX]

Visual Basic:

004020A4 68B8BF4100 PUSH 0041BFB8
004020A9 E8EEFFFFFF CALL
004020AE 0000 ADD BYTE PTR DS:[EAX], AL
004020B0 0000 ADD BYTE PTR DS:[EAX], AL
004020B2 0000 ADD BYTE PTR DS:[EAX], AL
004020B4 3000 XOR BYTE PTR DS:[EAX], AL
004020B6 0000 ADD BYTE PTR DS:[EAX], AL
004020B8 40 INC EAX
004020B9 0000 ADD BYTE PTR DS:[EAX], AL
004020BB 0000 ADD BYTE PTR DS:[EAX], AL
004020BD 0000 ADD BYTE PTR DS:[EAX], AL
004020BF 008D4847B3F7ADD BYTE PTR SS:[EBP+F7B34748], CL
004020C5 12A74F893C38ADC AH, BYTE PTR DS:[EDI+383C894F]
004020CB C2C214 RETN 14C2


Microsoft Visual C++ 6.0:

00599E82 PUSH    EBP        
00599E83 MOV EBP, ESP
00599E85 PUSH 0FFFFFFFFH
00599E87 PUSH OFFSET UNK_5C36D0
00599E8C PUSH OFFSET UNK_59A1EC
00599E91 MOV EAX, LARGE FS:0
00599E97 PUSH EAX
00599E98 MOV LARGE FS:0, ESP

P.S. Это не значит, что именно так будет выглядеть ОЕР, но должно быть похоже.

Обобщение.


Ну что сказать? В принципе не было не одного упаковщика/протектора по сложности сложнее среднего. Как Вы, наверное, уже заметили, что распаковка – это интересно, интересно до тех пор, пока не попадается протектор, который ни как не хочет сниматься, но и в этом случае есть выходы:
1. Исследовать самому.
2. Попросить кого-нибудь уровнем повыше помочь.
3. Поискать подходящую статью.
4. Попросить исследовать меня. Сразу оговорюсь, я не супер анпакер, я обычный крякер, занимающийся взломом год. Если Вы мне дадите что-нибудь интересное, что я смогу распаковать, я обязательно дополню эту статью.
P.S. Не кидайте exe`шники на мыло, сначала напишите письмецо с названием протектора, и link на программу, если линка нет, я оценю, стоит ли браться за распаковку и отвечу Вам.
Как мне кажется, самый трудный протектор был VBOX. Если Вы не смогли распаковать VBOX или Exe Stealth или AsProtect не расстраивайтесь, данные защитные системы были написаны не для того, чтобы новички их распаковывали. Например, я только через три месяца занятий распаковкой смог распаковать сначала VBOX, потом уже AsProtect. Надеюсь, что эта статья Вам поможет в этом нелёгком деле, но, скорее всего в этой статье есть что-то не понятное для новичков. Смело задавайте все вопросы мне по e-mail: bit-hack@avtoritet.ru.
P.S. Кажись я первый придумал способ с hr esp-4. До этого существовали модификации этого способа, но не этот. И ещё, данный способ был придуман во время моей работы над статьёй по OllyDebugger`у.
Приветы.
Приветы всему Cracklab`у, а особенно MozgC и Bad_Guy`ю, Alex`у, Kerghan`y, Mario555, Hex`у и всем, кто прочитал эту статью.

Обращение.


Народ, кто умеет распаковывать Armadillo под Olly, отзовитесь, помогите мне его побороть. Ну, ни как не получается:( Help me please.


Обсуждение статьи: Распаковка? Это легко!!! >>>


Комментарии к статье: Распаковка? Это легко!!!

SLV 27.11.2004 19:53:38
> Delphi:
> 00450A15 8BEC MOV EBP, ESP
?????? чтооо??? а как же push ebp??? (55h)??? ошибка...
---
Sem 30.11.2004 11:14:22
010043B2 . B8 01000000 MOV EAX,1 - Ненужный код
010043B7 . C2 0C00 RETN 0C - Ненужный код

Не ненужный код - а для DLL
---
BiT-h@ck 01.12.2004 09:58:21
Sem, ну я же про exe, да к томуже это мелочи. В каждой статье есть такие глюки.
SLV, это не я:) В оригиналке это есть! Это движок или ещё чё. Я не причём:)
---
don KeyHot 20.12.2004 17:48:16
ResFixer где взять то?
Вроде на WASMe его нет?
---
don KeyHot 20.12.2004 17:50:22
Сорри, нашел там в
колллекции Resource Rebuilders
---
don KeyHot 20.12.2004 18:01:30
Цитата:
Дампить надо, когда стоите на OEP программы

01020D9E 61 POPAD - здесь брейкпоинт и здесь же тормознулись
01020D9F E9D116FFFF JMP calc.01012475

Можно уточнить:
1) когда стоим на строке ДО перехода к OEP
т.е на 01020D9F E9D116FFFF JMP calc.01012475:

2) или же нужно выполнить и строку JMP
01020D9F E9D116FFFF JMP calc.01012475 ?


---
BiT-H@ck 02.01.2005 19:57:25
don KeyHot, хочешь, можешь хоть на ОЕР, хоть на переходе, но если на ОЕР, востанови байты(после дампа) на ОЕР
---
Jack_theRipper 05.01.2005 00:00:41
Ничего у меня не получалось с FSG 2.0 (импортирование функций). Ни одной функции не находил ImpRec. Маялся я до тех пор, пока случайно не откопал правую кнопку мыши в окне импорта -> Advanced Commands -> Get API Calls. И он сам мне все прописал автоматом. :) Нашел все функции, все вызовы и пр...
---
Svippun 11.07.2006 12:12:25
А для Lord_PE в дампере опция какая for pe editor, for break n' enter, или for the rebuilder? А то на рисунке не видно.
---
Svippun 11.07.2006 12:16:00
Все, уже ответ не ужен, поставил for pe editor и пошло. Теперь импорт!
---
DIVER5 25.08.2008 09:05:42
Статья классная! вот только забыл BiT-h@ck написать, что нужно зациклить программу когда найден прыжок на OEP (для UPX). Если этого не сделать, то дамп получается нерабочий
---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS