Armadillo
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://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