Armadillo

eXeL@B DVD

Материал из Справочник исследователя программ

Перейти к: навигация, поиск

Armadillo (также SoftwarePassport) - коммерческий протектор с большой историей развития. Дата первого релиза - 15 января 1999 года. Разработан компанией, тогда ещё, Silicon Realms, основным разрабочтиком кода был Чад Нельсон.

Содержание

История развития

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

Алгоритмы, использованные в защите

Очень многие защиты пишутся по методу copy-paste. Armadillo не является исключением. Здесь использованы известные криптоалгоритмы (ну использоваться-то они могут где угодно, но они были просто скопированы as is - как есть), такие как MD5, TEA, CRC32 (который не соответствует стандартному CRC32 - выходное значение хэша соответствует логическому отрицанию стандартного значения CRC32). Использован также генератор случайных чисел, описанный в книге Роберта Седжвика (за основу там был взят алгоритм Кнута).

Методики защиты

  • Защита импорта (в данном протекторе именуется как Import Table Elimination). Данный протектор защищает таблицу импорта, создавая довольно неприятные переходники (в том числе защита от трейсера - бесконечные циклы). Часть функций полностью или почти полностью эмулируется.
  • Защита кода методом Code Splicing (сплайсинг, в Armadillo носит название Strategic Code Splicing). Разработчик указывает специальные маркеры в исходниках своей программы. Комплятор после компиляции оставляет эти маркеры в неизменном виде, что позволяет протектору найти код, требующий защиты, после чего этот код вырезается из программы до упаковки. Во время распаковки эти вырезанные куски кода обфускируются и записываются в выделенной памяти, а на исходном месте остаются переходники на ни них ("JMP-вермишель").
  • Мощная система регистрационной схемы. Включает в себя ключи, электронные ключи, блэк-листы, периоды действия работы программы и ключей (по кол-ву запусков, дней работы программы, по дате истечения срока действия ключа), и, что самое интересное, возможность использовать регистрацию через интернет (для легальных пользователей защиты). Также включает в себя возможность использовать до 15 групп маркеров шифрования кода (Secured Sections). Это означает, что программа может быть зашифрована одновременно 15-ми разными ключами шифрования и расшифровывать отдельные свои части по наличию соответствующего регистрационного ключа.
  • Защита материнским процессом. В ОС Windows возможно одновременное подключение к отлаживаемому процессу только одного отладчика ring-3. Это было использовано в Armadillo. Защита создаёт дочерний процесс и подключается к нему с отладкой. Запуская защищенную программу в отладчике возможно отлаживание только материнского процесса. Технология называется Debug Blocker.
  • Развитие предыдущей защиты называется CopyMEM II. Данная технология защищает программу от создания дампа. В любой момент времени работы программы распакована лишь часть страниц кода и данных (лишь те страницы памяти, в которых выполняется код и те, в которых находятся данные с которыми этот код работает). Работает это так. Каждая секция программы занимает целое кол-во страниц памяти. Сначала протектор запоминает в какой странице находится точка входа в программу и расшифровывает/распаковывает ее. Передает управление на точку входа в программу. Все остальные страницы помечаются флагом PAGE_NOACCESS. Как только выполнение переходит на эти страницы или же код обращается к страницам с PAGE_NOACCESS, отцовский процесс-отладчик ловит исключение и обрабывает его, расшифровывая нужную страницу памяти и зашифровывая соседей. Ест-но метод предполагает наличие Debug Blocker'а заведомо.
  • Следующий этап развития Debug Blocker'а это наномиты. По маркерам из программы определяются процедуры, которые следует "обработать". Обработка заключается в составлении таблицы условных и безусловных переходов. Перед упаковкой эти переходы заменяются байтом 0xCC (команда ассемблера int3), а остальные байты КОПа перехода - мусором. Препятствие к восстановлению этой таблицы является ее "полнота" - перед упаковкой абсолютно все байты 0xCC также попадают в таблицу и им назначается какой-либо не существующий переход. Во время исполнения код на наномитах постоянно происходят отладочные исключения (int3 это по сути точка останова). Вот только материнский процесс вовсе не восстанавливает оригинальные байты. Он смотрит три таблицы - таблицу флагов, таблицу размеров и таблицу смещений. Анализируя флаги происходит решений о том, куда нужно передать управление - значение размера (перехода нет) или значение размера+значение смещения (переход нужен). Метод является сильнейшим оружием данного протектора - не существует 100% надежного средства борьбы с наномитами.

История хакерских атак

Armadillo ломают с самых первых дней своего появления. Иногда через некоторое время (необходимое для того, чтобы разобраться с новыми заплатками) после релиза. Самой сильной стороной защиты всегда были наномиты. Для них даже в теории нельзя создать надежное решение. Стоит отметить, что наномиты действительно очень красивое решение. Навесить их более безопасно, чем попытаться снять. Когда протектор их ставит, он работает по маркерам и этим обеспечивается высокая безопасность предотвращения попадания наномитов в данные (что их, конечно же, испортит). Пока Armadillo не была достаточно сложна, каждый второй пытался написать свой распаковщик. Популярность протектора - всегда провал. По Armadillo написано огромное число статей на разных языках. Многие крек-группы штампуют релизы пачками. Т.е. взлом защиты поставлен буквально на поток.

Вот несколько наиболее громких взломов этой защиты:

  • небольшая группа исследователей с форума http://reng.ru/ благодаря кардеру заполучила исходный код генератора ключей версии 4.02. Ребята изучили код и нашли серьезную дыру, позволившую сделать кейген для ECDSA-113. Позже был публичный релиз команды TMG, повторившей этот подвиг;
  • dragon написал статью, в которой провел полную распаковку с восстановлением наномитов;
  • команда NGEN обнаружила отсутствие проверки на бесконечно удаленную точку в процедурах проверки серийного номера и сделала релиз с "нулевой подписью"; атаку можно повторить практически для любой программы с версией защиты от 3.xx по 7.xx.

Для Armadillo активно развивается автоматический распаковщик ArmaGeddon. Качество конечно у него не самое лучшее (количество сбоев зашкаливает), но это единственный полноценный распаковщик (который выполняет все этапы распаковки, включая наномиты), доступный в публичном доступе.

Методики взлома

OEP

Обычно OEP легко получить, если определить в какой секции он находится. Точка останова на этой секции приводит к OEP.

IAT и "Magic Jump"

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

00BED4F9    68 00010000                  PUSH 100     ;<---- PUSH100
00BED4FE    8D8D 38C1FFFF                LEA ECX,DWORD PTR SS:[EBP-3EC8]
00BED504    51                           PUSH ECX
00BED505    8B95 38C2FFFF                MOV EDX,DWORD PTR SS:[EBP-3DC8]
00BED50B    8B02                         MOV EAX,DWORD PTR DS:[EDX]
00BED50D    50                           PUSH EAX
00BED50E    E8 4D52FBFF                  CALL 00BA2760
00BED513    83C4 0C                      ADD ESP,0C
00BED516    8D8D 38C1FFFF                LEA ECX,DWORD PTR SS:[EBP-3EC8]
00BED51C    51                           PUSH ECX
00BED51D    8D95 48C2FFFF                LEA EDX,DWORD PTR SS:[EBP-3DB8]
00BED523    52                           PUSH EDX
00BED524    E8 B01F0100                  CALL 00BFF4D9
00BED529    83C4 08                      ADD ESP,8
00BED52C    85C0                         TEST EAX,EAX
00BED52E    75 11                        JNZ SHORT 00BED541
00BED530    8B85 38C2FFFF                MOV EAX,DWORD PTR SS:[EBP-3DC8]
00BED536    8B48 08                      MOV ECX,DWORD PTR DS:[EAX+8]
00BED539    898D 4CCAFFFF                MOV DWORD PTR SS:[EBP-35B4],ECX
00BED53F    EB 02                        JMP SHORT 00BED543
00BED541  ^ EB 9B                        JMP SHORT 00BED4DE
00BED543    8B95 9CD4FFFF                MOV EDX,DWORD PTR SS:[EBP-2B64]
00BED549    83C2 01                      ADD EDX,1
00BED54C    8995 9CD4FFFF                MOV DWORD PTR SS:[EBP-2B64],EDX
00BED552    EB 3E                        JMP SHORT 00BED592
00BED554    68 00010000                  PUSH 100
00BED559    8D8D 54D8FFFF                LEA ECX,DWORD PTR SS:[EBP-27AC]
00BED55F    E8 DC52FBFF                  CALL 00BA2840
00BED564    0FB6C0                       MOVZX EAX,AL
00BED567    99                           CDQ
00BED568    B9 14000000                  MOV ECX,14
00BED56D    F7F9                         IDIV ECX
00BED56F    8B85 4CD8FFFF                MOV EAX,DWORD PTR SS:[EBP-27B4]
00BED575    8B8C95 E8D7FFFF              MOV ECX,DWORD PTR SS:[EBP+EDX*4-2818]
00BED57C    8908                         MOV DWORD PTR DS:[EAX],ECX
00BED57E    8B95 4CD8FFFF                MOV EDX,DWORD PTR SS:[EBP-27B4]
00BED584    83C2 04                      ADD EDX,4
00BED587    8995 4CD8FFFF                MOV DWORD PTR SS:[EBP-27B4],EDX
00BED58D    E9 72010000                  JMP 00BED704
00BED592    83BD 4CCAFFFF 00             CMP DWORD PTR SS:[EBP-35B4],0
00BED599    75 44                        JNZ SHORT 00BED5DF ;<-------Magic JMP  (NOP)
00BED59B    0FB785 44C2FFFF              MOVZX EAX,WORD PTR SS:[EBP-3DBC]
00BED5A2    85C0                         TEST EAX,EAX
00BED5A4    74 0F                        JE SHORT 00BED5B5
00BED5A6    0FB78D 44C2FFFF              MOVZX ECX,WORD PTR SS:[EBP-3DBC]
00BED5AD    898D C4A8FFFF                MOV DWORD PTR SS:[EBP+FFFFA8C4],ECX
00BED5B3    EB 0C                        JMP SHORT 00BED5C1

Другой способ (первый CALL после PUSH 100 в предыдущем примере):

00BA2760    55                           PUSH EBP ;<-RET
00BA2761    8BEC                         MOV EBP,ESP
00BA2763    83EC 2C                      SUB ESP,2C
00BA2766    833D 20E6C100 00             CMP DWORD PTR DS:[C1E620],0
00BA276D    75 59                        JNZ SHORT 00BA27C8
00BA276F    C745 EC 65581329             MOV DWORD PTR SS:[EBP-14],29135865
00BA2776    68 00010000                  PUSH 100 ;<--------- PUSH100
00BA277B    E8 E6820500                  CALL 00BFAA66

Источник примеров: Posted by Vovan666

Debug Blocker/CopyMEM II

Борьба с отладчиком за частую производится двумя популярными методами - перехват OpenMutexA (если материнский процесс не сможет создать мутекс между собой и дочерним процессом, то распаковка будет с выключенным DebugBlocker'ом) и Process Detach - метод, основанный на созданных разными крекерами утилит, позволяющих "разцепить" процесс-отладчик и отлаживаемый процесс, после чего станет возможным отлаживаемый процесс зацепить на отладчик исследователя (обычно OllyDbg). Борьба с CopyMEM II осуществляется также двумя популярными способами. Первый из них заключается в патче отладочного процесса - необходимо заставить его только расшифровывать страницы и не шифровать обратно. Второй способ - внедрение в отлаживаемый процесс библиотеки-дампера. Она обращается ко всем страницам программы и дампит их сразу после того, снова получит управление после обработки исключения. Таким образом она скопирует все нужные страницы жертвы. Статья, рекомендуемая к ознакомлению: статья Hex'а

Strategic Code Splice (анти-дамп)

Анти-дамп обычно убирают скриптами или инжектируемым кодом. Некоторые крекеры практикуют метод переноса анти-дампов в одну из секций программы, как правило, новую прикрепляемую секцию. Это не очень красиво, так как по сути защита не снимается, хотя мы получим рабочий дамп (при условии что исследователь обошел также и все другие защитные механизмы). Чтобы восстановить код исследуемой программы в первозданный вид (в вид до навески защиты) анти-дампы нужно деобфускировать и очищенный от мусора код вернуть на родное место. На данную тему рекомендуется ознакомится с русским переводом статьи Нарвахи, в которой анти-дампы просто лепятся к программе без восстановления кода: Распаковка Армадилло с IAT Elimination (часть 6), R.Narvaja, estet, MARcoDEN

Борьба с наномитами

Существует три основных способа борьбы с наномитами. Первый из них - повторное навешивание отладочного процесса, либо включение VEH с последующим включением в код отладчика таблиц наномитов. По сути отладчик защиты заменяется отладчиком крэкера. Исследовать такую программу - не самое приятное занятие, отсутствие переходов и мусорные байты ломают работу почти всех анализаторов. Второй способ - запуск программы под анпакером или встроенным в распакованную программу отладчиком. Во время работы программы следует постараться воспользоваться как можно большим числом возможностей программы, попробовать разные комбинации возможных настроек. Так постепенно можно собрать информацию о "настоящих" наномитах и восстановить их. Поскольку все наномиты таким способом вряд ли можно восстановить, способ кобминируют с первым. Третий способ самый сложный в реализации - анализатор. Анализатор должен "выполнить" код и пройтись по всем его ветвлениям, а напарываясь на наномиты восстанавливать их по таблице. Сложность здесь возникает в обработке switch-таблиц, табличных вызовов (вызовы методов классов и конструкторов высокоуровневых языков выглядят на низком уровне, например как call ds:[edx+410h]), а также API функций с параметрами-CALLBACK'ами. Рекомендуемая статья: статья dragon'а

Примеры исследований защиты

http://www.reversing.be/article.php?story=20050926225443593

Очень хорошее детальное описание функционирования защитных механизмов протектора http://spin.quequero.org/Reversing_Armadillo_4.20

Примеры ПО с данной защитой

Компании, чьи продукты защищены с помощью данного протектора

  • AusLogics
  • BaZiChart
  • Eltima Software
  • Fortop
  • GreenVantage LCC
  • Lokas Software
  • NeoSoft
  • NeuralBet
  • PC Tools
  • PlayFirst
  • Poker Inspector, Inc
  • Securstar
  • Softinventive Lab
  • Thegrideon Software
  • Ward Systems Group, Inc

Продукты, защищенные протектором

  • BatchPhoto
  • DriveCrypt
  • Elite Keylogger
  • Flash Menu Labs
  • IRCAS Alarm
  • MonkeyWrite
  • Q-ImageUploader Pro
  • QUIDAM
  • VBto Converter
  • VideoCAD

См. также

Протектор

Упаковщик

Распаковка

ACProtect

ASProtect

Code Virtualizer

Enigma

Obsidium

Themida/WinLicense

VMProtect

Источник — «https://exelab.ru/faq/Armadillo»