Начинающему кракеру.
 

Сразу оговорюсь, я не профессиональный кракер, и следовательно не имею никакого морального права учить Вас этому ремеслу. Но ничто не мешает мне ввести желающих в курс дела. Я только постараюсь помочь Вам сделать самые первые шаги.

Зачем ломать?

В самом деле, в Internet навалом серийных номеров, краков и т.п. Но Вам может потребоваться crack к какой-нибудь мало известной и не популярной программе. Весьма вероятно, что эта программа, нужна лишь очень узкому кругу лиц, а профессиональные кракеры ею не заинтересовались. Остается либо купить, либо взломать, решение за Вами.

Опыт кракера может пригодиться и при написании собственных программ. Из-под отладчика можно взглянуть на то, как решают задачи более опытные программисты.

Незаменимым, ремесло кракинга, может также оказаться при создании собственной защиты. Наконец, далеко не всегда программы хорошо защищены.
Пример из жизни: Летом 1999 я выкачал из Internet PCAnywhere v 9.0 и самым честным образом попробовал найти crack к нему, и нашел..., но он не работал. (Прим. Сейчас Вы наверняка найдете работающий crack) Пришлось попробовать "обратить" программу самостоятельно и ... получилось. Дело отнюдь не в моих способностях, а в том, что защита была номинальной. Я был поражен тем обстоятельством, что такая серьезная программа абсолютно не защищена.

И последнее, это весьма занимательный процесс. Куда более захватывающий, чем например компьютерные игры.

Итак, если Вы решили продолжить чтение перейдем к делу.

Прежде всего, необходимо скачать отладчик. Я рекомендую SoftIce, это наиболее популярный дебаггер. К тому же в дальнейшем я буду знакомить Вас с кракингом именно посредством SoftIce. Во вторых, скачайте хороший дизассемблер. Рекомендую IDA. Это, в самом деле, очень качественный дизассемблер, к тому же, написан россиянином. Иногда испытываешь чувство гордости за отечество.

SoftIce, попробуйте скачать отсюда.

Скачали? Если да, то устанавливаем их поскорее.

Примечание: При установке SoftIce, выберите не свой адаптер, а Standart VGA. Аккуратно отнеситесь к выбору Вашего типа мышки.

После установки SoftIce находим файл winice.dat, это конфигурационный файл. Нам надо изменить значение параметра INIT на следующее:

INIT="wl; color f a 4f 1f e;code on; lines 60; wc 40; wd 2; wr; faults off; X;"

Это позволит Вам увидеть окно SoftIce в более презентабельном виде, чем по умолчанию. Не торопитесь закрывать файл, необходимо выполнить еще одно действие. Обратите внимание на самый конец файла. Там перечислены dll-ки "разремируйте" (то есть уберите символ ';' ) только те из них, которые у Вас есть. Если перестараетесь, то получите не фатальное сообщение об ошибке при рестарте Windows. Теперь, когда SoftIce установлен, проверим все ли в порядке. Нажмите Ctrl-D. Если Вы, получили окно консольного вида, значит у Вас все OK. Если нет, внимательно перечитайте статью с начала. Для тех, кто в SoftIce. Выход из отладчика F5.

Установка позади. Версии SoftIce начиная с 4.х содержат pdf-файлы с описанием синтаксиса команд SoftIce. Если Ваша версия ниже, то по всей вероятности у Вас их нет. Придется пошарить в Internet.

Маленькое отступление.

SoftIce работает в нулевом кольце защиты. В то время как пользовательские программы работают в 3-ем кольце. Наименее привилегированном. Подробнее о кольцах защиты можно узнать из литературы посвященной работе процессора в защищенном режиме. Для нас с Вами важен то факт, что SoftIce грузится как бы до Windows. Можно сказать и так: Windows запускается как бы из-под отладчика. Это позволяет Вам устанавливать BreakPoint практически на любую системную функцию. Надеюсь, Вы представляете, что такое Win32 API? Это набор функций. Дословно интерфейс прикладных программ. Программы могут вызывать эти функции. Сами функции располагаются в dll файлах. (Вспомните dll-ки которые Вы "разремировали" в winice.dat). Вы можете поставить breakpoint на API функцию, и когда какая-нибудь программа, или сама Windows, вызовет ее, появится окно SoftIce. А процесс выполнения программы, естественно, прервется. Вообще SoftIce - обычный отладчик, так что смотрите на него проще.

Сейчас нам придется остановиться на очень важном моменте. Чем лучше Вы знакомы с Win32 API, тем успешнее Вы будете "обращать" программы. Знание это, увы, не дается просто так. Необходима практика. Я имею в виду написание собственных программ с использованием Win32 API. Если опыта написания программ под Win32 API у Вас нет, но начать "обращать" программы хочется уже сейчас, то можете скачать исходники одной из моих программ. Они снабжены щедрыми комментариями. Так что при желании можно, по крайней мере, увидеть, как используются API функции в стандартных ситуациях. Например, как получить текст из Edit Control.

Итак, дебаггер установлен, Win32 API для нас не пустой звук. Что можно еще добавить ко всему этому? Естественно assembler. Рекомендую обзавестись справочником по командам ассемблера. Ну а нюансы его использования будем постигать на практике.

Рекомендую также, установить help по Win32 API.

Подходы.

Защиты, естественно, бывают разные. Для нас с Вами, в данный момент, их можно разделить на две большие группы: слабые и сильные. Мы работаем с первой группой. Внутри этих категорий, защиты классифицировать не так легко. Но все же постараемся. Вот далеко не полный перечень.

  • Защиты, ожидающие введения регистрационного кода. С различными вариациями. То есть код может быть взят из реестра, ini файла, etc.
  • Защиты, рассчитывающие найти "ключевой" файл.
  • Ограничение на время использования программы, или на число запусков.
  • Отключение полезных функций программы.
  • Наконец комбинации, вышеперечисленных вариантов.

Так как основной нашей целью, является, в первую очередь, получение первичных навыков, то тренироваться следует на простых программах. Найти их можно на серверах, распространяющих шароварные программы, впрочем, Вы и так это знаете. Итак, заходим на такой сервер и скачиваем парочку программ. Основным критерием поиска является несложность программы. Так как чем проще программа, тем обычно проще защита. Выбирайте также исходя из "веса" программы. Старайтесь, чтобы по началу размер программ не превышал 100 / 200 Kb.

Скачиваем, устанавливаем, пытаемся определить, с какого типа защитой мы имеем дело. Здесь я отойду от общепринятого подхода, демонстрировать взлом конкретных программ. Так как, сыт такой методикой по горло. Кипа страниц, с минимумом информации. В самом деле, обычно демонстрация взлома, весьма скучное мероприятие. Авторы ленятся объяснять методику взлома, поэтому Вам будут объяснять примерно так "сейчас поднимемся на два экрана вверх, здесь поставим breakpoint, теперь пойдем сюда, затем туда, ... ну вот и все" Пользы немного. Мы пойдем другим путем.

Знакомимся с SoftIce.

Нажимаем заветные Ctrl-D. И мы в SoftIce. Осмотримся. Обычный отладчик для того, кто хоть раз имел с ними дело. Если Вы правильно ввели значение параметра INIT, то верхнее окно отображает регистры процессора. Чуть ниже находится содержимое адресов памяти. Еще ниже - инструкции процессора. Ну и наконец, командная строка. В самом низу - подсказка. Посматривайте туда во время набора команд. Начав работать с отладчиком, Вы возможно удивитесь, что командная строка играет здесь важную роль. SoftIce, понимает, значительное число команд. Подробности в pdf - файле. Я познакомлю Вас лишь с основными командами.
Установить breakpoint на API функцию можно так:
bpx FunctionName
For example: bpx MessageBoxA

Обратите внимание на символ 'A' в конце, это не опечатка. Некоторые функции имеют две версии, соответственно в ANSI и в UNICODE кодировках. (Вам редко придется сталкиваться с UNICODE.) Можно воспользоваться простым правилом. Если хотите поставить breakpoint на API, ставьте так:

bpx FunctionName
bpx FunctionNameA

Если функция не имеет ANSI версии, дебаггер выдаст ошибку, и только то.

Установив breakpoint, нажимаем F5. Теперь, если какая-нибудь программа, или сама система, вызовет эту функцию, ее выполнение прервется. И Вы окажетесь в адресном пространстве прерванного процесса. Помните, что Вы в защищенном режиме. И, следовательно, любая программа в Windows, полагает, что она "одна" в системе.

Несколько рекомендаций:

- Перемещение на одну инструкцию F10.
- Вход в функцию F8.
- Выход из функции F11 / F12. Здесь имеется в виду, непрерывное выполнение программы до оператора "ret".

Иногда очень полезно воспользоваться так называемой трассировкой назад. Я имею в виду, выход из функции по F12, установка breakpoint выше той функции, в которой Вы только что находились. И повторный проход программы. Так, в принципе, можно добраться до первых инструкций исследуемой программы.
Список breakpoint's можно просмотреть командой:
bl
Отключить breakpoint:
bdN
Где N, номер breakpoint.

Включить breakpoint:
beN
Где N, номер breakpoint.

Удалить breakpoint:
bcN

Вы можете использовать маску '*' Это позволит применить эти команды одновременно ко всем breakpoint-ам.
BreakPoint можно редактировать:
bpeN.

Просмотреть дамп памяти можно с помощью команды d [Address]. Введите эту команду, и во втором окне сверху, отобразится дамп памяти. Вы можете указать вместо адреса, регистр процессора: d edx.

Команда "?[16-ноеЧисло]" переведет Вам его в 10-ное, а также даст символьный эквивалент. Хотя в принципе это команда калькулятор. Не забывайте пользоваться им.

Команда "a" позволит Вам вводить инструкции на ассемблере. Причем с текущей инструкции. Выход из нее - Enter.

Для наших с Вами целей, пригодится изменение состояния Zero Flag. Обратите внимание на правый верхний угол окна SoftIce. Там располагается регистр флагов. Состояние любого флага можно изменить, выделив его мышкой, и нажав Insert. Это позволит нам изменять ход выполнения программы.

На этом мы с Вами закончим поверхностное рассмотрение команд SoftIce. Но вполне вероятно вернемся к этому позже, на конкретных примерах.

Несколько слов о защитах, основанных на введении кода.

Вариантов взлома может быть великое множество. Мы наметим лишь некоторые (самые простые) из них. Примитивную программу можно раскусить, отследив момент приема кода, и проследив за дальнейшими манипуляциями. Как отследить момент получения программой кода? Попробуйте установить breakpoint на GetWindowText[A],GetDlgItemText[A] Если они не сработают, то можно попробовать функцию "hmemcpy".

Внимание! В момент срабатывания breakpoint на API функцию, Вы попадете прямо в системную dll. Внимательно смотрите на заголовок окна, отображающего инструкции процессора (Возможно, это будут слова "kernel" или "user"). Здесь Вы можете протрассировать API функцию, если есть желание. Если нет - F12, и внимательно смотрим на заголовок. Где мы? В dll или в исследуемой программе. Иногда Вам придется несколько раз нажать F12, прежде чем Вы попадете в объект Ваших интересов.

Итак, мы в исследуемой программе. И совсем недалеко от точки, в которой программа получила S/N. Обратите внимание на содержимое регистров. Более чем часто они содержат адреса переменных. Могут, к примеру, содержать адрес введенного кода или имени. Сейчас я не буду останавливаться на работе со стеком. Те, кто писал на assembler и так прекрасно об этом осведомлены. Те же, кто не знают, пусть не переживают, доберемся и до стека. В любом случае, если Вам удалось найти следы введенного кода, идите вперед, и постарайтесь их не потерять.
Предостережение: Способ работает, увы, только на примитивных защитах. В более серьезном случае Вы просидите над кодом неделю.
Можно попробовать зайти с другого конца. К примеру, программа может выдавать сообщения типа "Не правильный S/N". Если это наш случай, то, ставим breakpoint на MessageBox[A]. (MessageBox легко узнать, по затененному [x] в правом верхнем углу окна). Далее воспользуемся трассировкой назад.

Я согласен, с тем, что без конкретных примеров сложно. Поэтому давайте попробуем "обратить" программу 'WE' Group Spamer v.2.1
Найти ее можно на www.download.ru
Программа предназначена для массовой рассылки всякого рекламного хлама. Только не подумайте, что я spamer, Терпеть их не могу. ( Меня просто попросили найти что-то в этом роде). Скачав ее, я, прежде всего, убедился в том, что это то, что мне нужно.
Зашел на Astalavista, поискал crack, но не нашел. Придется все делать самому.

Сразу предупреждаю, мои методы далеки от оптимальных. Вы наверняка сделаете это красивее.

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

Запускаем. Появляется окно с напоминанием о том, что мы не зарегистрировались. Соглашаемся, и попадаем в программу. Приятный интерфейс. Да и возможности не плохие. Вытаскивает адреса из любого файла, понимает html и т.д. Проверяем ее - работает. Но все, вызывающие интерес функции, заблокированы. Вместо того, чтобы работать, программа выдает сообщение о том, что все сервисные функции будут доступны после регистрации. А это 40$. По моему, дороговато. Входим во вкладку About. Мигает строчка "Unregistered version".

Подведем итоги. Защита блокирует ряд сервисных функций. В принципе, можно "включить" их. Но еще лучше - зарегистрироваться. Правда не всегда удается это сделать красиво. Давайте попробуем разобраться, почему программа считает себя незарегистрированной? Нас нигде не спрашивают о вводе кода. Можно конечно зайти на их сайт, но мне лень. Поэтому захожу в каталог программы, и просматриваю файлы. Открываем файл spamer.ini и внизу видим параметры RegName и RegNum. Теперь мы, по крайней мере, знаем, откуда программа берет имя и код. Что это нам дает? Можно поставить breakpoint на функцию CreateFileA. Так как программе придется открыть этот файл в любом случае. Я попробовал, но далеко не ушел и оставил эту затею. Можете проявить инициативу и попробовать сделать это самостоятельно.

Оставив попытки проследить, что происходит после открытия файла spamer.ini я попробовал еще раз вызвать одну из заблокированных функций. Ею оказалась "Load Message". Появился MessageBox "Unregistered version! :". Отлично! Весьма неосмотрительно с их стороны. Заходим в SoftIce, ставим breakpoint на MessageBoxA. -> F5. Нажимаем кнопку "Load Message". Срабатывает SoftIce. Мы в модуле User32. F12 -> исчезает окно SoftIce, появляется MessageBox с предложением заплатить 40 зеленых. Жмем OK и мы снова в SoftIce. Курсор сразу за строчкой:

call [USER32!MessageBoxA]

Понятно, что где-то выше программа определила, что она не зарегистрирована. Но где именно? Самый простой способ заключается в трассировке назад. Где все подозрительные безусловные переходы подвергаются проверке. Естественно мы ищем тот переход, который позволит нам, повлиять на последовательность действий. То есть обмануть программу. Пусть полагает, что она зарегистрирована и, вызовет сервисную функцию. Здесь конечно требуется интуиция. Я прикинул, что, вряд ли решение о том зарегистрированы мы или нет, принимается в прерванной функции. Скорее всего, выше на пару уровней. Я угадал. Два раза F12. Посмотрите на инструкции чуть выше инструкции call. Видите условный переход?

cmp [eax+2d8],esi
jz Address ; Здесь ставим breakpoint.
push :
push :
push :
call Address

Прогоняем по новой. Прерываемся на инструкции jz. Изменяем состояние флага нуля. Теперь сервисная функция вызывается. Маленькая победа. Но пить пиво еще рано. У нас этих функций, как грязи. Не менять же jz на jnz в 10-ти местах. Я дизассемблировал программу в IDA. Не скажу, что почувствовал сильное облегчение. Затем снова прошелся отладчиком по сервисным функциям. Программа всегда анализировала флаг, располагающийся по адресу (у меня) 6afa4c + 2d8. Поставил breakpoint на обращение к этой ячейке памяти.

bpm segm:6afa4c + 2d8 rw

Он сработал, в диком числе мест. Я совсем расстроился. Видимо мне она еще не по зубам. Потом вспомнил о смещении 2d8, и снова зашел в IDA. Суть в том, что это смещение постоянно фигурировало, в участках кода, где программа определяла, имеем ли мы право использовать сервисную функцию. Сделал поиск по "2d8", и получил очень неплохие результаты. Прежде всего, это смещение было найдено в ограниченном числе мест. Одно место в коде меня особенно заинтересовало.
Что-то вроде:

mov [esi + 2d8h],edi
mov [esi + 2cch],edi
mov [esi + 2d0h],edi
:

Отсюда я заключил, что этот участок кода, ничто иное, как инициализация флага регистрации. (Флаг, показывающий зарегистрированы мы, или нет ) Более того, флаг должен быть равен единице. Мне повезло, рядом оказалась функция LoadIconA, прекрасный маячок. Я поставил на нее breakpoint и нашел этот участок в отладчике. Подставил "1" и убедился, что все работает. Теперь надо решить, как записать 1-цу в этот флаг. Я попробовал проанализировать функцию, которая вызывалась до установки искомого флага. Но потерялся в дебрях кода, и пришел к выводу, что придется мне вписать единицу самостоятельно. Сначала я попробовал заменить инструкцию

mov [esi + 2d8h],edi
на
mov dword ptr[esi + 2d8h],1

Но эта инструкция требует 10 байт, а мы имеем только 6. Пришлось снова взглянуть на код. Чуть выше LoadIconA дважды вызывается одна и та же функция. Ясно, что именно там edi получает свое значение. Если программа зарегистрирована то "1", если нет то "0". В моем случае - "0". Но давайте проверим, будет ли программа работать без этих функций. Оказывается да. Проверить это можно, например, заменив вызов функции инструкциями "nop" [90h]. Два вызова этих функций состовляют ровно 10 байт. Какая удача! Заменяем двойной вызов функции нашей инструкцией:

mov dword ptr[esi + 2d8h],1

Ну а вместо mov [esi + 2d8h],edi ставим 6 "nop".

Вот и все программа "обращена". Если вы к тому же заблаговременно ввели свое имя в spamer.ini, то во вкладке About появится Ваше имя.
Да, и не забудьте подкорректировать exe-файл программы. В противном случае взлом будет распростроняться исключительно на текущую сессию.

На главную страницу