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

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


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

Полуавтоматическая распаковка ASPack 2.12 за 29 секунд

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

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Статью написал: Bad_guy
Статья создана: 25.08.03

Пользовался я ASPackDie и однажды он что-то наотрез отказался распаковывать мне один файлец (dll), хотя PEiD настойчиво показывал, что это ASPack 2.12. Я стал выяснять какже вручную его можно распаковать. Взял я этот самый ASPack 2.12 и запаковал им какой-то свой dll файл. Затем сделал Break'n'Enter с помощью LordPE (вошел на точку входа запакованного файла). В софтайсе поставил бряк:

 :bpm d63b9c x
 где d63b9c - адрес точки входа в незапакованном, но моем dll файле.
 
Когда программа прервалась по этому адресу я сказал себе: "А где же LastBranchFromIp ???". А вот он самый в окне команд прописан. Берем число, которому он равен (LastBranchFromIp=00A6A3BF) и пишем софтайсу новую командочку:
 :u A6A3BF
 
 а он нам RET показывает в окне кода. А вот посмотрим мы пораньше и видим:
 
 push 00D63B9C
 ret
 
Значит в стек кладем OEP и переходим на него. Ладно, а что же будет в этом самом месте, когда распаковщик ещё не начал распаковку ? И я перезапустил программу опять же под Break'n'Enter и написал опять ему
 :u A6A3BF
 
 посмотрел, а там:
 
 push 00000000
 ret
 
И знаете, что эта шняга означает, а это означает, что мы щас научимся без шуму и пыли распаковывать ASPack 2.12 вручную за 29 секунд и сэкономим себе время, чтобы в квэки всякие порубиться или в чате поспорить с ламосами о том какие мы крутые кулхацкеры все...

Итак, смотрим на опкоды этих двух команд и они выглядят 68 00 00 00 00 C3, а значит нам пора валить из софтайса в HEX редактор. Открываю я уже чужой dll, который надо распаковать в HEX редакторе и ищу там эти опкоды, а их там и нет... и что я думаю, а я думаю что эти опкоды - фигня и вообще аспак каждый раз по новому все делает, но путем сложных умозаключений прихожу к выводу, что этот dll не аспаком вовсе запакован, а аспротектом ещё одним каким-то, который маскирует свою точку входа под ASPack и пытается нас надурить. Короче, фиг с ним с этим дэлэлэлом, нам надо настоящий аспак распаковать, а не эту муру аспротекченую. А все, что было раньше можно было и не читать - это так себе "преамбула" была...

Такс, беру и нахожу прогу запакованную ASPack 2.12 - надо же нашел я Winplex из supaplex, то есть наоборот supaplex.exe из Winplex, ищу там эти самые опкоды (68 00 00 00 00 C3) и меняю последний байт с C3 на CC (вот тут очень важное место, а именно - суть моего способа. Дело в том, что меняя один байт мы меняем команду ret на int 3, которая позволяет прерваться на этом месте при помощи любого отладчика), а потом все это сохраняю и захожу в софтайс и пишу там:

 :bpint3
 
Выхожу из софтайса и запускаю нашу программку... опа и прервался я на том самом месте, где должен был быть ret - смотрю строчку выше и вижу там уже не push 00000000, а другое число, записываю это число на бумажку, а потом в айсе пишу:
 :a
 jmp eip
 
И выхожу из айса, потом запускаю LordPE и дамплю запущенный наш процесс supaplex.exe, затем опять же лордом завершаю этот процесс и открываю сдампленный файл в PE Editor опять же в LordPE - смотрим ImageBase = 400000, как обычно. Вычитаем из числа записанного на бумажке этот ImageBase и записываем результат в поле Entry Point, сохраняем и все... 29 секунд прошли и наш распакованный файл готов к употреблению. По желанию, также можно обрезать две последние секции, но я обычно с эти не заморачиваюсь (винч у меня большой, а крэки я в инет не публикую). Всё, файл распакован и прекрасно работает... пробуем.... тьфу, опять Мерфи замочили - вот гады.

Наверняка, вам все еще мало того, что вы уже знаете. Тогда вот еще одна интересность, которую можно провернуть с аспаком, да и почти любым другим упакованным файлом:

 Вспомним
 
 push 00D63B9C
 ret
 
но нам ведь вовсе не обязательно сейчас прыгать на Entry Point, нам же надо прогу попатчить, чтобы она была зарегистрирована, а это - самое лучшее место для этого. Ведь гораздо приятнее распространять маленький патч, чем распакованный экзешник, даже запакованный впоследствии нами.

Тогда вместо push 00D63B9C можно написать jmp 12345678, а где же этот адрес (12345678h) - спросите вы. У нас есть много нулей в конце запакованного файла, давайте используем их для своего кода. Но как же нам узнать их виртуальный адрес, который мы подставим вместо 12345678 в команду перехода. А очень просто: открываем наш запакованный исполняемый файл в любом редакторе PE и смотрим на все атрибуты последней секции, как то: ROffset (реальный адрес - адрес в исполняемом файле), RSize (реальный размер секции), VOffset (виртуальный адрес начала секции - адрес секции запущенной программы в памяти), VSize (размер секции, зарезервированный под неё в памяти). Так вот смотрим мы эти атрибуты и видим, что реальный размер последней секции равен 0, значит нам она не подходит. Смотрим предыдущую секцию: складывааем в уме или с помощью калькулятора в шестнадцатиричном виде значения из полей RSize и ROffSet и получаем размер нашего исполняемого файла также в шестнадцатиричном виде, если нет, то надо подправить поле RSize так, чтобы наше условие выполнялось. Затем надо проследить, чтобы VSize был не меньше RSize, а иначе мы свой код в памяти не увидим. Теперь посмотрите в шестнадцатиричном редакторе адрес, куда мы будем вписывать наш код и вычтите из него ROffSet, а потом прибавьте VOffSet, затем прибавьте наш ImageBase исполняемого файла (обычно это число 400000h) и у вас получился виртуальный адрес нашего будущего кода, который и будет вместо 12345678 в команде перехода. Теперь можете писать в выбранный адрес с помощью софтайс или HIEW команды, дабы пропатчить наш распакованный файл в памяти - пишется это обычно так:

 MOV EAX, 401000 /// заносим в EAX адрес памяти, где надо патчить
 MOV WORD PTR [EAX], C033 // пишем в указанный виртуальный адрес комманду XOR EAX,EAX
 ....
 push 00D63B9C - не забываем про переход на OEP
 ret
 
Если атрибуты той секции, где мы пытаемся патчить разрешают нам запись в нее - патч произойдет (но об атрибутах в нашем случае позаботился уже сам ASPack), а если нет - то вылезет ошибка доступа - вам надо подправить атрибуты секции хотя бы на E0000020h ну или уж на C0000040h, как больше нравится.

Все, можете сравнивать оригинальный и пропатченный нами файлы и создавать по этим сведениям маленький патч.

Вы конечно можете мне сказать, что про распаковку аспак и так много статей, что про инлайн патч давно все знают, но поверьте - вы ошибаетесь. Почему ? Да хотя бы потому, что я крэкерствуя уже в течение 2 лет, читая почти все статьи, которые размещаю на CRACKL@B узнал об инлайн патче случайно, на форуме, месяца 2 назад.

Удачи вам в вашей деятельности, чем бы вы ни занимались, Bad_guy.



Обсуждение статьи: Полуавтоматическая распаковка ASPack 2.12 за 29 секунд >>>


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



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


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