R0 CREW

Борьба с Asprotect - начало. (Часть 1)

Напутственное слово

Данная статья является введением в «цикл статей» по исследованию и распаковке популярного протектора исполняемых файлов – ASProtect. В данном «цикле статей» будут рассмотрены как методы распаковки самой по себе, так и исследования работы протектора. Цель исследования заключается в максимально полном анализе навесной защиты, а так же поиске быстрых и результативных алгоритмов по снятию последней. В данной же статье я буду опираться на ранее выложенные материалы, которые без труда можно будет найти в сети (я буду давать ссылки по ходу дела), но основная часть – результат моих собственных исследований и размышлений. Цикл рассчитан на полных новичков, но надеюсь, что каждый, прочитавший его, не пожалеет о содеянном. И, конечно, все материалы здесь публикуются только в ознакомительных целях – за их неправомерное использование автор ответственности не несёт.

Философия распаковки

Про распаковку уже написано столько, что все авторы рискуют своими статьями затереть тему до дыр, но кто не рискует… (закончите предложение как вам хочется).

Что же такое распаковка? Что понимают под этим термином?

За свою недолгую жизнь я успел убедиться, что под этим термином каждый понимает что-то своё. Но господствующей идеей является определение, по сути сводящее весь процесс к поиску некоего ОЕР, получению какого-то загадочного «работоспособного» дампа, и главное (это присутствует почти в каждом «писе оф пэйпер», повествующем о распаковке) – восстановлению какой-то там таблицы импорта.

Для новичка мир распаковки полон загадок – если взлом программы все как-то себе представляли, хотя бы отдалённо, то про распаковку простые обыватели могут даже не догадываться, потому что просто ничего не знают про упаковку. Поэтому чтоб суть распаковки дошла до вас быстрее, чем до меня, а так же чтоб избавить вас от необходимости пользоваться так полюбившимся всем бубном, начнём повествование с упаковки.

Что вы делаете, когда хотите спрятать какой-то ценный для вас предмет? Не важно, что это за предмет. Пусть, например, фамильные драгоценности. Тогда кто-то сунет их под матрац и будет изображать из себя принцессу на горошине, боясь лишний раз перевернуться на другой бок. Кто-то зароет во дворе. Другие положат в сейф, а кто-то отнесёт в банк. Все методы, кроме последнего, имеют одну общую черту – человек все делает самостоятельно. Последний же метод демонстрирует перекладывание своих забот на чужие плечи, разумеется, за определённую сумму.

Приблизительную аналогию можно наблюдать и в мире ПО. Бывают ведь программы, которые не защищены навесной защитой, а имеют лишь защиту, построенную автором программы на стадии её написания, или, как принято говорить – на уровне исходных кодов. Но некоторые предпочитают не париться, а напрячь чужой мозг, и хоть в сети вы часто можете прочитать, что, типа, протекторы не защитят ваше приложение – на самом деле, это только бравада крэкеров. Проты были созданы именно для того, чтоб защищать программы, и оспаривать их эффективность глупо. Они эффективны, с этим нужно смириться, но… их нужно научиться снимать.

Давайте осмыслим, как происходит упаковка. А что это вообще такое?

Все вы знаете, что такое архивация (я надеюсь, нет, я искренне верю в это). Но все также знают, что архивы нельзя запускать на исполнение (self-extractors – не в счёт), документ нельзя читать, не разорхивировав и т.д. То, что там внутри, непригодно для использования, пока не будет извлечено из архива. Так и в упаковке – мы может сделать с исполняемым файлом всё, что угодно, даже не подозревая о его структуре, но такой файл попросту перестанет работать. Значит, перед использованием, файл, обработанный упаковщиком, должен быть приведен в состояние, годное для использования в среде данной ОС. Для обеспечения мобильности (работоспособности программ на разных хотя бы сервис паках, не говоря уже об ОС) программа должна привести себя в это годное состояние сама. Или… быть в этом состоянии изначально.

Отсюда вывод – упаковщики отличаются от архиваторов тем, что не преобразовывают информацию в произвольные массивы байт на выходе. Структура файла сохраняется, да, возможно, искажается, но сохраняется. Эта структура вполне сносно документирована Microsoft’ом, и называется всё это дело форматом исполняемых файлов. О самом формате – чуть позже.

Так вот, если сам формат сохраняется, что же тогда упаковывается? Здесь некоторую аналогию можно провести с конвертом и письмом внутри него. Если вы хотите воспользоваться услугами почты и отправить некое послание своей подруге, родственникам, коллегам по работе и т.д., то вы должны поместить его в конверт определённого размера, наклеить на него какую-то определённую марку, добиться того, чтоб его вес не превышал какого-то (да, опять-таки определённого) значения и только потом (ну, может, и не только потом – я, знаете ли, на почте человек новый) любезные люди согласятся переслать его в нужном для вас направлении. Точно так же и с PE (Portable executable) форматом. Значит искажается что-то за пределами формата (или в самом письме), и в большинстве случаев, хотя и не во всех, это код программы, данные, некоторые таблицы того же РЕ-формата и … и всё, так как больше-то по нашей классификации в исполняемом файле ничего и нету. Или есть? Оказывается, что есть и четвёртый элемент, который мы до этого не упоминали, но он просто обязан существовать по всем нам известным из курса физики законам природы. Это – код расшифровщика, который расшифрует (простите за повторы) те самые данные, код и таблицы пока ещё неизведанного нами РЕ-формата.

Тогда становиться очевидным, что задачей любого упаковщика – не только ASProtect’a (далее ласкового именуемого как «аспрушка»), но и любого нам до сих пор неизвестного, и даже ещё не написанного злобными дядьками-программистами, становиться:

  1. Зашифровывание всего, что может быть зашифровано без потери функциональности.
  2. Размещение в зашифрованном файле кода расшифровщика, который берёт на себя ответственность всё это… нет, не расшифровать, а именно запустить (благо зачастую «запустить» не делается без «расшифровать», но вы должны понимать, что такое возможно).

Идём дальше. Теперь несложно сказать, что же такое распаковка. Распаковка – это получение работоспособного исполняемого файла путём расшифровки всех его зашифрованных участков и удаление из файла ненужного более кода расшифровщика. (Простите за корявость, эстеты). Другими словами, вам может показаться, что это приведение запакованного файла к первоначальному виду. В идеале – это так, но в общем случае это сделать невозможно. Поэтому скажем, что целью распаковки является приведение исполняемого файла к виду, максимально близкому к первоначальному.

У некоторых читателей может возникнуть вопрос: «Как же так – почему невозможно полное восстановление?». На этот вопрос мы ответим по ходу распаковки Аспра – сейчас же просто ВЕРИМ МНЕ.

Сейчас после прочтения вышеизложенного материала может показаться, что вся распаковка сводится к тому, чтобы дождаться, пока расшифровщик расшифрует всё, что должно быть расшифровано, потом перед самым началом программы вклиниться, забрать результаты его работы – и вуаля, мы распаковали все упаковщики разом. Такой алгоритм действий, конечно, имеет место быть, но лишь для самых простых пакеров. А для Асприка (даже для самых первых его версий) это не так, потому что некоторые важные для работы программы элементы расшифровываются не сразу, а по ходу работы всё той же программы. (Кстати, это – одна из причин, почему анализируется именно Аспр, а не какой-то UPX).

Сейчас, когда вы гипотетически представили, что же такое упаковка и распаковка, ваше философское мировоззрение уже почти готово к практическому знакомству с семейством пакеров и его конкретными представителями. Но…остаётся ещё один важный вопрос, который никак нельзя обойти стороной – зачем нужна распаковка? И правда – ну, упаковал его (т.е. файл экзешный, например) программер, ну и что, ведь прога работать не перестала. Работать-то она не перестала, но вот если мы захотим узнать, как именно она не перестала работать, то нас ожидают определённые трудности – в дизассемблере (надеюсь, что для вас «дизассемблер» - нечто большее, чем набор согласных и несогласных) нифига не понятно – крошечный код какого-то то ли мусора, то ли декриптора, да и для отладчика приготовлены некоторые сюрпризы. В добавок к этому всему появляются проблемы с пропатчиванием таких программ. Короче (Склифософский), если хотите подискутировать на тему «распаковывать или нет», то найдите любой форум по исследованию защит ПО, и вам по полочкам всё пояснят (правда, если до этого не забанят за такие ламерские вопросы), что в мире ведь и вирусы бывают, и тут распаковка чрезвычайно важна, ведь нужно доподлинно узнать все намерения такого творения, а также способы воплощения этих намерений в жизнь – тут-то и пригодится умение.

Минимальные требования (не системные)

Философия – это, конечно, хорошо, но на ней (как и на «жигулях») далеко не уедешь. Давайте рассмотрим тот минимальный багаж знаний, которым должен обладать каждый желающий распаковать хоть что-то, кроме подарков на Новый год.

  1. Так как цикл статей будет непосредственно ориентирован на отладчик Olly Debug, то неплохо было бы, чтобы для начала вы умели отличать его от айса. В этом вам поможет цикл статей «Введение в реверсинг с использованием Olly Debug». Кстати, читать все совсем не нужно – достаточно прочитать буквально первые пять выпусков – дальше мне кажется, что автора понесло не в реверсинг, а в танцы (угадайте с чем) – чего только стоит совет искать Magic Jump при восстановлении переходников импорта. Знаете, почему эта техника не работает с Аспром? Потому что в аспре нет этого самого магического прыжка (но это так, к слову).
  2. Конечно, про распаковку тут буду рассказывать я, но было бы несправедливо умолчать о существовании статей «Об упаковщиках в последний раз», где есть немало полезных советов и ссылок.
    http://www.uinc.ru/articles/41/index.shtml
    http://www.wasm.ru/article.php?article=packers2
  3. Ре-формат. Настоятельно рекомендую и убедительно прошу скачать себе это маленькое справочное пособие – заучивать его, как отрывок «наизусть» не надо (да, табуретку тоже можно отложить, и слезть с неё), но поверьте мне – он нам ещё пригодиться.
    http://www.microsoft.com/whdc/system/pl … ECOFF.mspx
  4. Т.к. очень многие проблемы мы будем решать с помощью скриптов (которые сами скоро начнём писать), то советую не только обзавестись плагином ODBGScript, но и справкой по нему.
    http://odbgscript.sourceforge.net/

В общих чертах, вроде бы, всё. Жду вас во второй части…

ARCHANGEL © AHTeam, r0 Crew

Важно заметить, что архивация - процесс архивирования данных, т.е. помещения их в архив для удобства хранения с возможностью восстановления. Под “архивом” понимается всё что угодно из того, во что можно архивировать: архивные внешне накопители, папки на серверах архивации, файлы-архивы… В силу с незнакомством со всем разнообразием архивов у пользователей “архив” ассоциируется с файлом-архивом
Архивы обычно создают как средство восстановления (бэкап), т.е. обращаться к ним планируют редко. Именно по этому стало актуально сжимать (компрессировать) архив. Когда мощности компьютеров возросли, архивы стал использовать чаще для иных целей - компактной передачи данных по сетям, даже для компактного хранения более часто используемых ресурсов. Всвязи с этим архивы стало актуально шифровать (криптовать).
Так как каждый первый современный архиватор (даже tar) имеет встроенную функцию компрессии, пользователи ассоциируют архиватор с компрессором. Однако надо понимать, что это разные вещи, просто архиватор может иметь встроенный модуль компрессии (однако я предпочитаю организовывать поточную поэтапную обработку, так как и учит старая школа философии Linux, во имя большей гибкости и производительности) http://lists.freebsd.org/pipermail/freebsd-hackers/2006-October/018272.html

Тут идёт речь не о архивах и архивации.

Да, акцент на темах архивации и архиваторов не стоит. Но понятия “компрессия” и “архивация” так часто путают, что я решил добавить своё веское слово
Если по вашему мой комментарий не имеет здесь места - напишите мне в личку - я перенесу свой комментарий в отдельную статью для каталога “Ликбез”

Зачем сразу в крайности. Вы прокомментировали, я прокомментировал. Никто никого не обидел. Пусть будет, мне он не мешает.

Прости за мою серьёзность =)
Я просто призван вести тут порядок. Если что-то мешает - обращайтесь