Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Эффективный патчинг

MC707 (mc707@mail.ru)

Спецвыпуск: Хакер, номер #057, стр. 057-040-1


Кое-что о том, как можно патчить приложения

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

Ищем, что патчить

Если посмотреть на проблему с точки зрения крэкера, можно сразу сориентироваться: код, который мы ищем - это любой код, отвечающий за регистрацию программы и ее нормальное функционирование. Существует несколько несложных приемов, для того чтобы найти его.

Первый, самый простой, распространенный и довольно эффективный - нахождение в коде строк, имеющих какое-либо отношение к регистрации. Благо сообщения об успешной/неуспешной активации программы, о количестве оставшихся до окончания срока функционирования дней, содержимое NAG-окна, записи в About и т.п. - все хранится в программе и, как правило, в виде plain-текста, поэтому их поиск в программе будет не очень сложен. После успешного нахождения строки остается только поймать в программе код, который использует ее. Это можно сделать либо с помощью любого дизассемблера, либо с помощью OllyDbg. Обычно такие строчки встречаются в коде в виде инструкций наподобие "mov eax, prog.004FB613" или "push prog.004FB613", где по адресу 004FB613 как раз и лежит искомая строка. Далее путем статического или динамического метода (визуальный метод или метод трассировки) определяется, является ли найденный код важным для взлома.

Второй прием, кстати, не менее эффективный - останов на API-функциях, вызываемых в критичных для взлома участках. Для его применения нужны довольно глубокие познания в области набора API-функций для конкретной версии Windows, поэтому перед употреблением советую хорошенько изучить MSDN последней версии. Для того чтобы воспользоваться этим приемом, нужно хотя бы примерно представлять себе, что делает программа, пытаясь стрясти с тебя некоторую сумму денег за регистрацию. Как правило, она просит ввести что-нибудь вроде имени/рег. кода/e-mail. В этом случае нужно ловить место регистрации по API-функциям GetDlgItem, GetDlgItemTextA, GetWindowTextA.

Если тебе повезло и ты поймал программу в процессе ввода серийника на одной из этих API, то, выйдя из дебрей системных библиотек и немного потрассировав код, ты, скорее всего, найдешь место проверки или какой-нибудь другой манипуляции введенных тобой данных. Можно также ловить место регистрации функциями ShowWindow, MessageBoxA, MessageBoxExA, MessageBoxIndirectA и недокументированной MessageBoxTimeoutA, отвечающими за выводы различных окошек с сообщениями. Соответственно, если выдаются сообщения вида "Вы ввели неправильный код" или что-то очень похожее, то, когда вылезешь из системных дебрей, посмотри на код, находящийся выше/раньше вызова этого сообщения, чтобы найти код, критичный для взлома.

Содержание  Вперед на стр. 057-040-2