Без лома и молоткаЛеонид «Cr@wler» Исупов Хакер, номер #101, стр. 090 Обход защиты твикера FreshUIМожет быть, ты пытался взломать программу, которая тревожила тебя надоедливыми нагами. Результатом этого, наверняка, был шок: вместо читабельного листинга отладчик выдавал код, похожий на мусор. Скорее всего, это произошло потому, что ты нарвался на запакованную программу. Сегодня я на простом примере покажу тебе, как бороться с пакерами. IntroСейчас мы займемся программой FreshUI (это неплохой твикер для ОС Windows). Вообще-то, программа для домашнего пользователя бесплатна, но после 11 дней ее использования начинает болеть голова от появления окошка с напоминанием о том, что мы должны заказать ключ у разработчика (окошко, кстати, с каждым днем держится на экране все дольше и дольше). Может, кто-то и хочет засветить свой почтовый ящик и занести его в спам-лист, но только не мы. Мы пойдем другим путем. РаспаковкаВ работе мы воспользуемся замечательным отладчиком OllyDbg - для исследования нашей программы он подойдет лучше, чем монструозный SoftIce от Numega. Итак, устанавливай отладчик, если его все еще у тебя нет, и выбирай пункт меню «File -> Open». В появившемся окне укажи путь к файлу нашей программы (freshui.exe). Отладчик тут же сообщит тебе о том, что программа, возможно, содержит самомодифицирующийся код или упакованное тело. После нажатия «Ok» OllyDbg спросит, надо ли анализировать код. Эта медвежья услуга нам не понадобится, ведь файл, скорее всего, запакован, и никаких понятных листингов мы не получим, так что смело отвечай «No». Вот что мы видим, глядя на начало дизассемблированного кода: 00565000 90 NOP 00565001 60 PUSHAD; Сохранение регистров в стек Опытный крякер, глядя на эти инструкции, обрадуется :), так как почти все упаковщики сохраняют регистры перед переходом на цикл распаковки, и это их выдает, что называется, с потрохами. А это значит, нам нужно, следуя логике, найти команду восстановления всех регистров из стека (POPAD). Само собой, эта команда выполняется после распаковки. При этом нужно также учесть, что после этой инструкции должен следовать безусловный переход вида JMP N, где N - адрес оригинальной точки входа программы (Original Entry Point, или OEP). Я хочу сказать, что после распаковки кода программы и восстановления регистров происходит прыжок на начало кода, который приобрел работоспособность, где мы и должны прерваться (о том, зачем это нужно, речь пойдет ниже). Наша цель - найти соседствующие команды POPAD и JMP N и поставить точку останова на POPAD. Поиск в OllyDbg (<Ctrl+F>) команды POPAD проходит успешно, но вот незадача: она нигде не соседствует с JMP N. Для того чтобы убедиться в том, что мы все делаем верно, воспользуемся утилитой PEid - хорошей помощницей в определении типа пакера (протектора/компилятора)(http://peid.has.it), которую можно скачать на любом крякерском сайте. Запускай утилиту и скармливай ей freshui.exe. Она моментально выдаст нам результат: «ASPack 2.12 -> Alexey Solodovnikov». Значит, мы с тобой сильно ошибались, ведь AsPack действует немного иначе, чем совсем уж тривиальные пакеры. Он использует для перехода на OEP не JMP N, а конструкцию вида: POPAD; восстановление регистров JNZ adress MOV EAX,1 RETN 0C PUSH 0; OEP кладется в стек RETN ; переход на OEP Нас интересуют только первая и две последние инструкции. Комментарии дают ясное представление о работе этого куска кода. Стоит только упомянуть, что команда PUSH 0, после того как мы прервемся на ret, положит в стек совсем не 0, а значение OEP. Итак, ищем POPAD с хвостом в виде вышеуказанного кода. Такой набор располагается по адресу 005653AF: 005653AF POPAD 005653B0 JNZ SHORT freshui.005653BA 005653B2 MOV EAX,1 005653B7 RETN 0C 005653BA PUSH 0 005653BF RETN OEP найдена!По адресу 005653BF ставь точку останова, для этого выдели строку и нажми <F2>. Все готово, запускай программу на исполнение (<F9>). Выполнение ее тут же и прервется, причем на вершине стека будет лежать адрес OEP, равный 00507340 (заметил, как изменилась команда PUSH 0?), его мы запишем. Теперь переходим на начало кода программы, сделав один шаг (<F8>). Мы попадем в место, очень похожее на кучу хлама в виде данных, неправильно интерпретированных в качестве инструкций, но это далеко не так. На самом деле, этот «массив» - ни что иное, как начальный код, стартующий с OEP! Если не веришь, нажми <CTRL+A>. После анализа ты увидишь характерное начало программы. На время сверни OllyDbg. Теперь, как и обещал, я скажу, зачем мы остановили программу на OEP. Для того чтобы получить более или менее работоспособную программу со снятым упаковщиком, нужно сделать дамп, он же моментальный снимок области памяти, где размещена наша программа, причем не когда-нибудь, а именно сразу после распаковки, когда программа прервется на OEP. Для этой цели подойдет инструмент LordPE за авторством Yoda (респект!). Запускай эту утилиту, выбирай в окне процессов нашу программу, висящую под отладчиком, и, нажав по ней правой кнопкой мыши, выбирай в меню «Dump full». Сохрани файл под именем dump.exe. Полученный дамп будет неработоспособен, так как таблица импорта не восстановлена. Привести dump.exe в чувство поможет утилита Import Reconstructor. Запусти ее. Выбери в списке Attach to an active Process процесс freshui.exe и введи OEP в соответствующее поле программы. Причем OEP в этом случае будет равняться 00507340-ImageBase=00507340-00400000=00107340 (ImageBase - это адрес, с которого в памяти идет код программы, его нам указал отладчик). Теперь жми на кнопку «Get Import». При этом не обращай внимания на издержки - мусор в виде нераспознанных функций, который будет отображен среди верно отысканных данных в виде двух последних ветвей: «?FThunk:0010F8E0 NbFunc:3 valid:no» и «?FThunk:0010F8F0 NbFunc:3 valid:no». Ты можешь убедиться в ненужности этих «элементов таблицы импорта», если перейдешь по смещениям 0050F8E0 и 0050F8F0 и взглянешь на содержимое памяти. Первый фантомный Fthunk - строка «kernel32.dll», то есть имя библиотеки, импорт функций из которой распознан, а второй «непрошеный гость» - часть имени функции, которая размещена в Import Table первой (DeleteCriticalSection). Мусор нужно отрезать, выделив его целиком и выбрав в меню правой кнопки мыши «Delete Thunks». Таблица импорта воссоздана, осталось исправить файл дампа. Для этого нажми на кнопку «Fix Dump» и укажи программе файл dump.exe. В директории с программой будет создан файл dump_.exe, который и следует запустить. Он работает, а это значит, что мы распаковали исполняемый файл. Теперь нужно лишь набраться терпения и, отыскав сообщение о необходимости получения регистрационного ключа, удалить его. ВзломПереходим к основной части нашего тривиального взлома. Загрузи dump_.exe под OllyDbg. Теперь в коде можно легко отыскивать нужные места и патчить их как заблагорассудится, ведь AsPack уже снят. Поговорим о выдаваемом сообщении. Запуская наш твикер, мы видим, что кнопка «OK» на диалоговом окне-наге недоступна для нажатия до тех пор, пока не пройдет определенное количество времени. Это означает, что здесь не обошлось без таймера. Последний обычно устанавливается функцией SetTimer. Попробуем установить на нее точку останова. Жми <Alt+F1> (если у тебя стоит плагин CommandBar) и вводи команду bpx SetTimer. Запускай программу на исполнение (<F9>). Мы тут же прервемся по адресу 0043557f, где и находится нужная нам функция. Теперь необходимо проанализировать, что же происходит после того, как «время пошло». После установки таймера программа выдает окошко (ShowWindow), поэтому нужно немного протрассировать программу (<F8>) - до места, где эта процедура вызывается (это происходит по адресу 0048221E). По логике, проверка того, не закончилось ли время, отведенное таймером, является циклом. Поэтому трассируем и дальше, пока не наткнемся на цикл по адресу 00482838 (на то, что это то, что мы искали, указывает и функция SendMessage, расположенная чуть выше). Я расскажу, как деактивировать его. Переходом на начало цикла управляет инструкция: 0048287E JE SHORT dump_.00482838 Нам нужно всего лишь удалить этот переход! Для этого выдели его, нажми пробел и введи в появившемся окне «nop» (это инструкция «холостого хода», она ничего не выполняет), установи флажок «Fill with NOP’s» и дави «OK». Теперь нажимай <F9>. Все получилось! Осталось лишь сохранить сделанные изменения: выдели nop’ы, которыми мы заменили переход, располагавшийся по адресу 0048287E, нажми на правую кнопку мыши и выбери «Copy to executable -> Selection». Далее в появившемся окне в меню выбери «Save File» и сохрани файл под любым именем (к примеру, dump_2.exe). Запускай этот файл и наслаждайся результатом! Все инструменты, упомянутые в статье, можно найти на лучшем крякерском ресурсе www.cracklab.ru. Помимо этого, сайт располагает внушительной коллекцией статей по крякингу и набором различных полезных ссылок. Конечно же, нельзя не упомянуть о форуме. Он является главной достопримечательностью ресурса, и следует признать, что все имеющееся на сайте - это лишь приятное дополнение к наиполезнейшему форуму, где можно повстречать незаурядно талантливых людей, относящихся к элите крякинга. Среди них - [HEX], MozgC, dragon (c) и другие. Я выражаю им почтение. Спасибо, Bad_guy! DVDНа нашем DVD ты найдешь все программы, упомянутые в этой статье. WARNING!Эта статья - плод воображения автора. Все совпадения с реальным взломом - случайность :). Помни: за нарушение тобой закона ни автор, ни редакция ответственности не несут! |