01.12.2010Armadillo - общее описание защиты и способы ее обхода.
Недавно имел возможность по вечерам вскрывать защиту для конвертора Sothink Encoder for Adobe v3.1, который позволяет перекодировать видеоконтент в формат .flv необходимый для большинства проигрывателей .swf и хотел бы здесь поделиться со всеми своими впечатлениями...
Защита интересна хотя бы по тому, что содержит в себе несколько самых эффективных антиотладочных приемов:
Замечательные анитотладочные приемы, которые обнаруживают отладчик и либо пускают программу по ложному следу либо завершают работу программы.
Самомодифицирующийся код с использованием упаковщика.
Загрузка в память библиотеки защиты прямо из того же исполняемого кода, через которую выполняются вся работа по проверке ключей (т.е. файла этой библиотеки Вы на диске не найдете).
Многопоточная система контроля выполнения кода, которая в некоторых случаях позволяет либо обмануть отладчик, либо определять что он присутствует в системе.
Ну и замечательный прием, завязанный на понижение производительности программного кода при наличие отладчика. Это происходит после того как мы добавляем видео файл. Его обработка происходит бесконечно долго при трассировке...
Инструментарий необходимый для вскрытия этой защиты:
Распаковщик Armageddon который снимает значительное количество защит автоматически и к тому же позволяет без особых проблем делать патчи в файле напрямую. Это несколько увеличивает размер файла, но зато значительно упрощает работу.
Отладчик OllyDbg 1.1 (желательно с плагинами, позволяющими обходить некоторые антиотладочные приемы). Иногда более корректно, особенно прикрепляться к работе приложения помогает вторая версия OllyDbg 2.01.
Первым делом нам необходимо найти все библиотеки защиты ArmAccess.DLL, как например вот этот:
004BAC2B |> 68 6C736600 PUSH flvenc2_.0066736C ; /FileName = "ArmAccess.DLL"
Таких мест в программе может быть два или три. После чего необходимо отследить вызовы этих процедур и через одну процедуру наверх мы обнаруживаем операции сравнения, которые и необходимо изменить. Для того чтобы поймать событие OnLoadLibrary в модуле kernel32.dll необходимо в OllyDbg задействовать хардверные прерывания взамен обычным Int3, что позволит избежать всяческих падений, а также некоторых антиотладочных приемов.
Сотворили патчи отключающие проверки...
04050D8 1. Active JE flvenc2_.004051C0 NOP
004050E5 и здесь тоже...
Патчи на активацию при старте прогрмммы...
004BAEF7 6. Active JE flvenc2_.004BAFD9 NOP
004BAF16 6. Active JE flvenc2_.004BAFD9 NOP
004BAF2C 6. Active JNZ flvenc2_.004BAFD9 NOP
004BAF3C 6. Active JE flvenc2_.004BAFD9 NOP
Патчи на проверку перед конвертацией файла, т.е. после добавления файла. Для того, чтобы поймать вызов библиотеки защиты из этих мест проще всего присоединиться к приложению с уже добавленным файлом для конвертации или искать все вызовы процедуры в которой создается защитная библиотека.
0040EBFC |. 74 21 JE SHORT flvenc2_.0040EC1F NOP
0040EC05 |. 74 18 JE SHORT flvenc2_.0040EC1F NOP
По правде говоря, мне прежде чем найти такой способ пришлось сначала изрядно понаблюдать на механизмы контроля событий окон между разными потоками, а также механизм общения с сайтом для активации регистрационного номера, но это в основном был конечно полезный опыт :)
Итак, наслаждаемся результатами работы программы без ограничений.