. _ . _ -|-------------------------/-//--|- // / _______________ | __ _____ | \_ _/_ \_____·/ \/ \ | / / / /_ / _ / t e a m | -/-----/\________/ \__\___/--/- 5 3 | /____/\____\ --- | . | wPx _ | _ | \ \\ -|--\\-\-------------------------|- Tutorials . Pack . Number . #13 Кряк и антикряк/ Общие Моменты. Приветствую вас, дорогой читатель. Речь пройдет о крекинге (cracking), который в народе чаще называют "кряк". Мы рассмотрим инструментарий (программы), которыми пользуются взломщики, и, конечно, варианты защиты от взлома. cracking в переводе с английского означает "взламывание, раскалывание". Взламывание разделяется на виды: а) patch - в программе исправляется пара байтов, которые вводят ее в заблуждение и она "думает", что вы зарегистрированы. В основном патч применяется для программ без дополнительной защиты. б) crack - обычно это exe-файл программы, в которой исправлено несколько байтов, и такая программа находится под дополнительной защитой. в) keygen - буквально генератор ключей, то есть нахождение в программе участка кода, где генерируется правильный лицензионный ключ, и создание на его основе собственной программы, которая будет генерировать правильные серийные номера. г) loader - так называемый взлом на лету, когда запускается не exe-файл программы, а собственная программа (она обязательно должна размещаться в папке с ломаемой программой), а та в свою очередь запустит ломаемую программу с нужными исправлениями. д) serial (sn) - нахождение правильного регистрационного номера в оперативной памяти, где программа хранит все нужные данные. В качестве практического занятия сделаем патч, крек и найдем серийник у двух подопытных программ. Набор отмычек Вообще говоря, список инструментов, облегчающих взлом, достаточно большой. Интернет-адреса приводить не буду, все легко находится через www.yandex.ru и www.google.com. Разве что посоветую заглянуть на protools.cjb.net. Хочу сразу оговориться, что упомянутые ниже программы для взлома в большей мере рассчитаны на новичков, опытные крекеры обычно пользуются программами более мощными и функциональными. 1. w32dasm - это дизассемблер, в его задачу входит преобразовать код программы, написанной на любом языке программирования, в исходный вид на языке ассемблер, что позволит взломщику найти определенный участок кода, где выполняется проверка на зарегистрированность. 2. ollydbg - это отладчик, он позволяет взломщику изучить логику работы программы и внести нужные изменения для ее "задуривания". 3. dede - позволяет восстановить исходный код на ассемблере или какую-нибудь другую информацию, которая пригодится для взлома (подходит только для программ, написанных на delphi или c++ builder). Например, восстановит формы и находящиеся на них элементы, а также адреса обработчиков событий. 4. hiew - это hexeditor, или просто редактор двоичных файлов, который поддерживает не только шестнадцатеричную форму редактирования, но и режим дизассемблирования. 5. restorator - редактор ресурсов, позволяет полностью изменять программу за исключением собственно кода. Обычно используется для русификации. 6. pe identifier, или, сокращенно, peid - продвинутый анализатор, который скажет не только на каком языке написана программа, но и под какой защитой она находится. 7. elton's nfo builder - редактор, предназначенный для создания nfo-файлов, в которых указывается различная информация о взломанной программе, о взломщике и т. д. 8. tola's.patching.engine, или, сокращенно, t.p.e. - применяется для автоматического создания патчей и лоадеров. Вообще-то это не все, но основное. Курс молодого крекера Опишу приблизительную схему действий взломщика программы, для простоты представив в этой роли самого себя. 1. Использую peid для определения, на каком языке написана программа. Для этого жму на кнопку с тремя точками и выбираю exe-файл ломаемой программы. Если программа защищена, то peid это покажет (обратите внимание на поле внизу программы). В основном программы защищаются утилитами aspack, asprotect и upx. Это упаковщики исполняемых, а также dll-файлов. Они не только сжимают файл, но и шифруют, тем самым пряча код программы. Если программа упакована, то для взлома ее нужно распаковать. Для aspack есть aspackdie (v 1.41 - последняя на данный момент, и на сайте написано, что проект больше не поддерживается). Сложнее дело обстоит с asprotect. Автоматический распаковщик stripper 2.11 может справиться не со всеми версиями, поэтому большинство крекеров предпочитают делать распаковку вручную. Это достаточно трудоемкий процесс, и описывать его я не буду. В Интернете вы можете найти много статей по ручной и автоматической распаковке. На самом деле упаковщиков очень много, к упомянутым трем можно добавить pecompact, fsg, codecrypt, dbpe, pe diminisher и др. Конечно, можно обойтись и без распаковщика, но для этого нужно программировать хотя бы на двух языках и узнать их в hexeditor. 2. Если файл распакован (или не упакован), то запускаю ломаемую программу и стараюсь заметить все признаки незарегистрированности. Это может быть окно с предложением зарегистрироваться, выводимое при запуске программы, предложение о покупке лицензионной версии, добавление к названию программы надписи "unregister" или "trial" и многое другое. 3. Запускаю w32dasm и, сделав несколько копий ломаемого файла, загружаю его в программу нажатием крайней левой кнопки на панели, после чего жду окончания процесса дизассемблирования. Затем нажимаю на кнопку "string data references". Выводится список строк, существующих в программе, среди которых можно найти те, которые говорят о незарегистрированности. Если пока не очень понятно, далее на практике все станет ясно. Если w32dasm мне ничем не помог, запускаю программу под отладчиком ollydbg и, в зависимости от типа защиты, ставлю прерывание. Прерывание - это остановка программы при совершении определенного события. Дальше действую по обстоятельствам, но об этом - на практике. Если, скажем, я не хочу пользоваться отладчиком или его использование не дало результатов, то можно попробовать dede. 4. Найдя нужный адрес для исправления байтов, загружаю программу в hiew и нажатием два раза "enter" перехожу в режим дизассемблера. Потом нажимаю f5 и пишу нужный адрес. Перейдя на этот адрес, нажимаю f3, затем f2 и исправляю байты, изменяя ассемблеровский код. 5. Если нужно подправить программу, например, добавить надпись "cracked by elig", то запускаю restorator и, стерев надпись о том, что нужно зарегистрироваться, пишу свою. 6. При помощи elton's nfo builder 2000 создаю nfo-файл, в котором делаю красивый рисунок и добавляю к нему различную информацию о себе или своей команде и о программе. 7. Сделав программу зарегистрированной, создаю патч и выкладываю его в Интернете. Почему патч? Он автоматически изменит байты в несломанной программе, а его размер буквально несколько килобайт в отличие от самой программы. Как я уже говорил, взлом происходит путем исследования кода программы. На исходный код это никак не влияет, потому что он переводится в ассемблерный код. Отсюда вывод: чтобы взломать программу, нужно иметь хотя бы общие представления об ассемблере. А для изготовления кейгенов к программам знание ассемблера должно быть не поверхностным. Естественно, введенный регистрационный код скорее всего окажется неправильным, да так и должно быть, я же не знаю метод генерации. Следовательно, сама программа знает метод генерации и именно поэтому выдает сообщение о неверном регистрационном коде. Иначе как она узнает, что введенный код неверен? Да просто мой код она сравнивает с генерируемым. Стало быть, в ней есть есть блок генерации и блок сравнения с двумя выводами, "Да" и "Нет". Если вы знакомы с программированием, то можете предложить: "А почему бы не сменить направление срабатывания?" Да, действительно, сменив "больше" на "меньше", мы добьемся того, что нам будет показано окно со словами благодарности за регистрацию. На ассемблере такой кусок кода в легком случае выглядит так: код ========== call 00436582 - в нашем случае это место, где генерируется код, дальше результат генерации записывается в eax. test eax,eax - здесь правильный код сравнивается с нашим неправильным. je 00438952 - если после сравнения мы получаем 1, то "прыгаем" через код о неверной регистрации и получаем сообщение, что все Ок. Если 0, то спускаемся ниже и получаем сообщение о неверном коде. ========== код je (расшифровывается как jump if equal) - это переход, срабатывающий на единицу. Единица будет, если сравниваемые значения равны. Если je срабатывает на 1, то jne - на 0. Заменив je на jne, мы получим, что при любом коде, кроме, конечно, правильно, нам скажут "спасибо за регистрацию". Эта пара - не единственные операторы сравнения, есть еще: jl/jg, jb/ja, jmp. Интереснее всего заменить je на jmp (это безусловный переход: не важно, что мы получим, 1 или 0, перейдем всегда туда, куда надо). Тest - это сравнение содержимого eax с eax, кроме test может быть использована команда cmp xxx,xxx, где ххх - это регистры, в которых хранятся некие данные и которые могут участвовать в математических операциях. На самом деле "call 00436582" - это не совсем место, где генерируется код. Это вызов функции перед сравнением, а результат, 1 или 0, записывается в eax. Смена сравнения даст единичный результат. Поскольку при следующем запуске программы нам придется снова вводить регистрационный код, чтобы программа стала вновь зарегистрированной, обычно "дурят" функцию, выдающую результат. Для этого проще всего сделать, чтобы функция генерации кода выдавала всегда 1. Просто делаем вызов функции и видим участок кода, который генерирует регистрационный номер. В самое начало функции пишем: код ========== mov eax,1 ret ========== код или код ========== xor eax,eax inc eax ret ========== код Источник: magicpc.spb.ru