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

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

MC707 (mc707@mail.ru)

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


Находим его довольно быстро - нули начинаются с адреса 004198AE. Чтобы было проще запомнить, спустимся еще чуть ниже до адреса, кратного 100h - 00419900, который и сделаем адресом нашей функции. Выделим стоку 00419900 и нажмем пробел для ввода кода по этому адресу. Вобьем в появившемся окошке mov eax, 1 и нажмем <Enter>. В регистре eax, как ты и сам знаешь, обычно содержится значение, возвращаемое функцией. В данном случае этим значением может быть только 1. Так как мы пишем функцию, а не просто кусок кода, мы должны позаботиться о том, чтобы код вернулся на то место, откуда был запущен. Поэтому нужна еще одна инструкция - ret. Вбиваем ее и жмем <Enter>.

Все. Нажмем Cancel для отмены дальнейшего ввода кода. Получена мини-функция из шести байт. Теперь вернемся к месту, где записывался адрес функции radll_HasTheProductBeenPurchased. Для этого выделим в окне регистров EIP, тыкнем по нему правой кнопкой мыши и выберем Origin. Окажемся по адресу 0040631B. В принципе, весь местный код нужно вырезать совсем: нам ни на что не сдался этот GetProcAddress. Поэтому, стоя на адресе 0040631B, нажмем пробел и введем MOV EAX,419900, то есть подставим вместо оригинального адреса функции свой. Остальные команды нам не нужны, поэтому вводим далее инструкции nop до адреса 00406329 включительно.

Нам остается только сохранить все изменения в программе и протестировать ее. Выделяем весь код с 00401000 по 00419FFF, выбираем в контекстном меню Copy to executable->Selection и указываем в появившемся окне файл, куда хотим сохранить пропатченную версию игры. После этого можно закрывать отладчик и пробовать запустить игру. Вуаля! Она прекрасно запустилась и, обращаю на это твое внимание, без всяких приглашений зарегистрироваться. При выходе из игры нас мило благодарят за приобретение.

"Нет, нет, что вы! Вам спасибо". Сделаем некоторые выводы. Мало того, что лентяи программисты из Reflexive не делают дополнительных проверок, так они еще и называют экспортируемые (!) функции из dll как radll_HasTheProductBeenPurchased. Крайне безответственно с их стороны. Ну что ж, их лень - наши сэкономленные деньги.

Кстати, не могу не заметить, что подобным образом ломается любая игра с сайта www.reflexive.net.

Патчинг загрузчиком

Малораспространенный и не самый авторитетный метод, но он реализуется довольно просто. Используется, как правило, для программ, запакованных чем-нибудь хитрым, например протектором. Нет смысла писать загрузчики для программ, не запакованных вообще, а для запакованных пакерами проще сделать прямой патчинг, то есть распаковать, или, на худой конец - inline-патч.

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

Назад на стр. 057-040-3  Содержание  Вперед на стр. 057-040-5