Распаковка программы упакованной ASProtect 1.22 - 1.23 Beta 21

Перейти на главную страницу, индексную страницу.


Автор: SouL[NHG team] <art_a@bk.ru>


  Программа: ZVolume Pro 3.44
     Защита: ASProtect 1.22 - 1.23 Beta 21
       Цель: распаковка
Инструменты: SoftIce 4.0.5,
 	     QView Ver. 2.80.02,
	     LordPE by yoda,
	     PE Tools v.1.4 by NEOx,
	     ImpREC v1.4.2+,
	     PEiD v0.9.
Все это можно найти на Reversing.kulichki.ru

Вступление: все часто на форумах(по реверсингу) встречаешь очегь много вопрос, проблем с распаковкой ASProtect 1.23(далее аспр). Оно и понятно, щас каждая третья программа запакована аспром. Новичков бросает в ужас при виде ASProtect 1.23 RC4(про 1.3 молчу), одни сразу забрасывают эту программу, другие пытаются распаковать но уних не чего не получается...Хе-Хе... я тоже пытался и забрасывал за неимением знаний. Но почитавши довольно много информации про распаковку аспра у меня получилось распаковать программу Zvolume запакованую ASProtect 1.22 - 1.23 Beta 21, а потом и ASProtect 1.22 beta 23, и ASProtect 1.23 RC4. Чего там только нет в новых версиях аспра, это: и SEH конструкции, и SEH трюки, и краденые байты, и улучшенный детектинг SoftIce, и отсутствие таблицы адресов импортируемых функций(IAT), вообщем всего по немножку. Учтите, что в этой статье я не буду вам расказывать про SEH инструкции (читайте все про SEH у Hex'a на xtin.org) здесь мы их просто будем обходить по bpm esp-4. Этой статьей я открываю серию статей про распаковку ASProtect. Данная статья предназначена, как пособие для начинающих.

1. ZVolume Pro 3.44.

1.1.Исследование.
Первое что надо всегда делать при исследовании - это проверить запакована программа или нет. Для этих целей я использую PEiD, в данном случае он нам показал:

ZVolume Pro

Отсюда видно что наша программа запакована ASProtect 1.22 - 1.23 Beta 21. Есть и другой способ узнать запакована программа или нет. Для этого можно воспользоватьcя LordPE(или PE Tools), смотрим на точку входа(EntryPoint) и характеристики секций:

ZVolume Pro

ASProtect здесь на лицо, тоесть точка входа 0x1000, характеристики секций C0000040, и если посмотреть программу в любом редакторе ресурсов, то мы там увидим "Corrupt resource." Теперь переходим непосредственно к распаковке.

1.2 Распаковка.

Ход наших действий: узнать Original Entry Point(далее OEP), зациклить программу на OEP и сдампить, исправить OEP в дампе и вставить оригинальную таблицу импорта. Я уже говорил, что мы будем базировать на распаковке с помощью брейкпоинта bpm esp-4. Почему? Не так геморойно, а вообще вот цитата из статьи Мозга:"Для нахождения OEP используем тот факт, что при старте программы в Windows, указатель на верхушку стека (esp) практически всегда один и тот же. Это не обязательно, но это стандарт. Например, в Windows 2K/XP, esp при старте программы ПОЧТИ ВСЕГДА равен 12FFC4h. Хотя, конечно, если изменить esp вручную, ради интереса, находясь на EP, то ничего страшного не произойдет. Однако, повторюсь, такой стандарт сохраняется, и мы его используем для нахождения OEP. При запуске программы, упакованной ASProtect'ом, esp равен этому стандартному значению. Так как ASProtect во время своей работы следит за стеком (т.е. сколько поместил в стек, столько потом и достал из стека), то, перед переходом на OEP, esp должен быть опять равен этому "стандартному значению". Например в ранних версиях ASProtect'a, когда ASProtect восстанавливал стек перед переходом на OEP, считывалось значение в стеке по адресу esp-4 (имеется ввиду что esp = "стандартному значению") следующий элемент стека уже был по адресу esp, и ASProtect его трогать не должен, т.к. не он ложил этот элемент в стек. Т.е. используя тот факт, что последним будет считываться значение по адресу esp-4, можно поставить брейкпоинт на тот момент, когда это будет происходить (bpm esp-4), и, когда этот брейкпоинт сработает последний раз перед непосредственным запуском программы, мы окажемся перед переходом на OEP". PE Tools есть такая замечательная кнопочка "Break & Enter"(чтобы попасть на начало программы), кликаем на эту кнопку, выбираем нашу программу, PE Tools нам сообщает чтобы мы установили bpint 3 и после прерывания дали команду eb eip 0xE9, что мы и зделаем. Нажимаем Ctr+D, чтобы вызвать айс, в появившемся окне набираем bpint 3, нажимаем Enter, чтобы установить брейкпоинт, нажимаем F5, чтобы выйти из айса, потом "Break & Enter"(выбираем нашу программу, Enter) и айс выскачит вот в таком месте:

ZVolume Pro

Не забываем про PeTools, пишим команду eb eip 0xE9, Enter, bc *(очищает все утановленные брейкпоинты) и ставим брейкпоинт: bpm esp-4, Enter. Должно получится такое

ZVolume Pro

Два раза F5 и окажемся здесь

ZVolume Pro

Смотрим значение регистра EAX=41199d. Это и есть наш OEP. Запишим его. Проходим popad по F10, остановимся на команде jmp eax. Далее пишим в командной строке a eip, Enter, jmp eip. Что мы зделали этой командой? Мы зациклили программу, тоесть программа будет находится в безконечном цикле и некогда не запустится.
a <--- Начать ввод опкодов (ассемблерных команд)
jmp eip <--- Прыгать на eip, т.е. на текущий адрес (получается цикл)
"enter" <--- Завершить ввод 
Запускаем PETools и в списке процессов выбираем наш зацикленный процесс. Нажимаем правую кнопку мыши и выбираем "Dump Full",

ZVolume Pro

сохраняем наш dump, как dumped.exe.

1.3 Удалений секций аспра.

Здесь я Вам покажу, как можно избавится от секций аспра. А зачем, спросите? Отвечу: во-первых, секции оставшиеся от протектора занимают много места. Во-вторых, после удаления секций можно будет запаковать файл UPX'ом(разница будет ощутимая). Ну и в-третьих, для общего развития. Обычно протекторы записывают секцию ресурсов после своих секций, удалив секции, мы можем вместе с ними удалить и часть директории ресурсов, поэтому тупое отрезание секций протектора ни к чему хорошему не приведет. Начнем... Для ампутации аспра воспользуемся программой resource rebuilder by Dr. Golova(скопируем dumped.exe в директорию где лежит resource rebuilder), в командной строке пишим(можно воспользоваться far'ом или Windows Commander'ом):
resrebld dumped.exe .rsrc

Видим вот такое:

Resource Rebuilder v1.0 by Dr.Golova
mailto: dr_golova@mail.ru

Mapping pbdiag.exe ... Ok
Reading resource tree ... Ok
Rebuilding resource tree ... Ok
Saving new resource table ... Ok
All done

Output info:
Data written to .rsrc
Written 0x00036000 bytes of data
New resource table RVA : 0x0001E000
Получили файл .rsrc размером 221 184 кб. Открываем программу в Hex Workshop и удаляем все начиная со смещения 1E000(жмем CTRL+G, вводим 1E000, ставим галочку на против HEX и удаляем все до конца файла). Сохраняем и закрываем Hex Workshop, после откроем этот файл в PeTools, идем на вкладку секций и удаляем последние три секции: .rsrc, .data и .adata

ZVolume Pro

Дальше добавляем одну секцию и дописываем нашу новую .rsrc в конец. В PE Editor есть функция load section from disk, которая сразу же сама правит PE. Сохраням все изминения и идем на вкладку directory, тут меняем Resource RVA = 1E000, size = 36000

ZVolume Pro

На этом с ампутацией аспра закончено.

1.4 Восстановление импорта.

Запускаем программу(ZVolume.exe) и Import REConstructor v1.4.2+(далее imprec). В данном случае я воспользовался Imprec 1.4, так как Imprec 1.6 при восстановлении импорта закрывал(убивал) наш процесс. В Imprec, на вкладке процесов, выбираем наш процесс. Вводим OEP(41199d), жмем IAT AutoSearch. Imprec сообщит, мол "что все в порядке - импорт я нашел",

ZVolume Pro

потом Get Imports. У Вас дожно получится так:

ZVolume Pro

На рисунке видно что несколько функций не определились. Далее Show Invalid, Auto Trace. Найдутся все функции кроме одной. Нажимаем на ней правой кнопкой мыши и выбираем Plugin Trace

ZVolume Pro

Так же Вам встретится такое:

ZVolume Pro

Тут видно, что фукция FindResource из библиотеки kernel32.dll, ну ни как не вписывается здесь. Так что выбираем эту функцию, кликаем правой кнопкой мыши и выбираем Cut Thunk(s). Все, теперь ипорт полностью готов! Нажимаем кнопку Fix Dump, выбираем наш дамп(dumped.exe) и ОК. Все теперь можно запускать дамп. Запускаем и видим, что программа падает(программа выполнила недопустимую ошибку и будет закрыта). Всеж вродебы сделали правильно! Откроем дамп в LordPe и проверим OEP, SizeofHeaders(если у вас равно нулю, тогда нажмите на "?" c права). Нет - все правильно! Значит будем копать в другом месте. Пока не закрыли LordPe идем на вкладку sections, выбираем певую секцию, правой кнопкой выбираем Edit Section Header и меняем С0000040 на E0000020. Сохраняем и закрываем LordPe. Воспользуемся услугами Loader32.exe(поставляется в комплекте с айсом), открываем в нем нашу программу(dumped.exe). В появившемся сообщении нажимаем OK, сразу всплывет айс

ZVolume Pro

Проходим по F10 вот до этого места

ZVolume Pro

Если мы пройдем Call 0040E930, то программа запустится, но в данном случае она упадет. Так что будем заходить в Call(F8). Проходим по F10 и опаньки программа падает по адрессу 0040E987. Вот мы и нашли это место. Проделываем все вышеописаное, только теперь остановимся по адрессу 0040E987. Меняем условный переход на безусловный. Пишим в айсе a 0040E980 Enter, jmp 0040E994 два раза Enter

ZVolume Pro

F5, "Ура, товарищи!", программа запускается. Закрываем loader32.exe. Теперь мы знаем где наша программа падает. Откроем ее в Qview(ALT+6 - выбираем dumped.exe), F5, пишим E980 Enter, для редактирования ALT+F3. Меняем условный переход на безусловный.
Было
JZ 0040E994
Стало
JMP 0040E495
Сохраняем, запускаем и радуемся жизни. Теперь вы умеете распаковывать ASProtect 1.22-1.23 beta 21. Теперь можно дамп запаковать UPX'ом. До UPX'а размер был 348 160, после 82 432 байт. Чуть не забыл, при заходе на вкладку About, программа падает. Попробуйте сами разобраться, это будет ваше домашнее задание. На сегодня все. Все вопросы и пожелания на мыло. Если вы посчитаете мои труды напрасными идите в null.
Приветы: Nemesis, All, Kerghan, -= ALEX =-, FEUERRADER, Bad_guy и всем кого знаю...

Автор: SouL[NHG team] 29.01.2004


Материалы находятся на сайте http://cracklab.narod.ru/doc/






Hosted by uCoz