Главная » Статьи » Крэкинг

Cracking для карапузов
o------// Автор: Crack
Сегодня я немного расскажу основы крэкинга, разберём программы используемые для взлома, а также
взломаем тренировочную программу. Это моя первая статья поэтому прошу ногами не бить! Многие знающие
люди могут сказать, что я пишу что-то неправильно или не точно, просто я старался писать понятно дляновичков.

Итак, начнём с того, что давным-давно люди сделали процессор, который работал только с битами,
программы писались в машинных кодах, что-то типа: 0010010010 и т.д. Позже программисты придумали HEX-
коды, что-то промежуточное между тем, что понятно человек и процессору, то есть что-то близкое к
машинным кодам, но более понятное программисту. Позже были придуманы компиляторы. Это программы
которые читали человеческие слова и переводили их в биты(машинные кода). То есть с помощью
компиляторов из исходного кода получался исполняемый файл. Это были первые компиляторы ассемблера.
Позже начали появляться всякие: pascal, C, C++, Delphi и т.д.
Любую программу можно представить в виде ассемблерного кода, этим занимаются программы –
дизассемблеры, про которые мы поговорим в следующей статье. А пока я хотел - бы рассказать основы
ассемблера (основные команды и т.д.), поэтому вы должны хоть чуть-чуть понимать в программирование
иначе материал будет очень трудный для восприятия.
Регистры:
Регистры это места в оперативной памяти, где могут храниться какие-либо данные, можно сказать что
регистры – это некие переменные. Регистры, которые важны для нас это: EAX, EBX, ECX, EDX. Буква “E”
вначале имени регистра означает, что он является 32-разрядным.
Push и Pop:
Команда Push используется для помещения адреса в стэк.
Команда Pop обратная команде Push.
Стэк можно представить себе как некоторую стопку листов, где верхний лист берётся первым. Вообще он
является участками памяти, начало которого на потолке и имеет смещение 0xFFFFFFFF, и всё что мы будем
добавлять будет добавляться снизу:
0xFFFFFFFF Начало стэка.
0xFFFFFFFC Занесли некоторые данные.
0xFFFFFFF8 Занесли некоторые данные.
0xFFFFFFF4 Занесли некоторые данные.
0xFFFFFFF0 Занесли некоторые данные.
… и т.д.
Стэк растёт к меньшему адресу.
Рассмотрим пример:
PUSH EAX - мы положили в стэк верхним значение регистра EAX
POP EAX - мы вытащили со стэка последние положенные данные.
Call:
Команда Call выполняет функцию по нужному адресу.
Пример:
Call: 10284354, будет выполнена функция по адресу 10284354.
RET:
Команда RET используется для возврата из функции.
Например, нам нужно выполнить какую – либо функцию, а потом вернутся на место где она вызывалась и
продолжить выполнение программы.
Mov:
Копирует байт или значение слова из источника в конечную точку.
Пример:
Mov EAX, 00000002 – копирует в регистр EAX, значение: 2
Mov EAX, EBX – копирует в регистр EAX значение регистра EBX.
CMP:
ОЧЕНЬ важная команда для взломщиков, используется в программе для сравнения чего – либо (например,
серийного номера :) ) После сравнения устанавливается флажок (0 или 1). Флажки очень похожи на
PASCAL’евские переменные типа: BOOLEAN, которые принимают значения TRUE и FALSE.
Пример: CMP EAX, 123 – сравнение значение регистра EAX со значением 123, и если они равны флажок
устанавливается в значение: 1(или TRUE, как кому нравится).
JMP:
Команда эквивалентна Pascal’евскому GOTO, переход в заданный адрес.
Пример:
JMP 30385678, переход по адресу: 30385678.
JMP – безусловный переход.
Имеются некоторые разновидности этой программы:
JZ - Переход, если флажок Z установлен.
JNZ - Переход, если флажок Z не установлен.
Так же существуют другие команды перехода: JNE, JE, JG и т.д.
Рассмотрим пример:
CMP EAX, 123456 - сравнить реальный номер, содержащийся в регистре EAX и нами введенный.
JNE EXIT - если они Не Равны, тогда выходим.
NOP:
Команда NOP не выполняет никаких действий.
Также существует множество других команд, но они для нас пока не являются важными. Если нам
понадобится узнать, что выполняет какая – либо другая команда, я расскажу про неё позже.
Теперь пора нам заняться обзором программ для самого взлома.
Дизассемблеры
Дизассемблеры – это программы, с помощью которых любую программу можно представить в виде
ассемблерного кода. Очень популярным дизассемблером считается IDA, хотя я предпочитаю Win32Dasm,
поэтому мы будем пользоваться им. Установка не должна вызвать никаких проблем. Работу в нём мы
рассмотрим по ходу взлома нужных программ.
Отладчики
Отладчики они и в Африке отладчики. Используются для поисков глюков в программах (ведь защита в
программе – это самый большой глюк). Самый популярный отладчик – это SoftIce. Рассмотрим подробно
установку SoftIce 4.0 под Windows 98. Запускайте файл Setup.exe, вводите серийный номер, в конце
установки на вопрос про перезагрузку ответьте – «нет, перезагрузится позже».
Зайдите в каталог, куда вы установили SoftIce, и откройте файл – WinIce.dat блокнотом. Найдите в нем
строку PHYSMB=32 - это значит, что отладчик настроен на работу в системе с 32 Мб оперативной памяти,
измените значение 32 на нужное значение. После этого надо подключить экспорт символьной информации из
наиболее часто используемых системных библиотек. Для этого найдите следующие строки:
; ***** Examples of export symbols that can be included *****
; Change the path to the appropriate drive and directory
;EXP=c:windowssystemvga.drv
;EXP=c:windowssystemvga.3gr
;EXP=c:windowssystemsound.drv
;EXP=c:windowssystemmouse.drv
...
; ***** Examples of export symbols that can be included for Windows 95 *****
; Change the path to the appropriate drive and directory
;EXP=c:windowssystemkernel32.dll
;EXP=c:windowssystemuser32.dll
;EXP=c:windowssystemgdi32.dll
;EXP=c:windowssystemcomdlg32.dll
...
Точка с запятой в первой позиции строки означает, что эта строка является комментарием, и информация
n функциях из указанного файла экспортироваться не будет. Чтобы включить экспорт символьной
информации, нужно просто удалить точку с запятой. Нет необходимости экспортировать функции из всех
этих файлов, обычно бывает достаточно выполнить следующее:
EXP=c:windowssystemkernel32.dll
EXP=c:windowssystemuser32.dll
EXP=c:windowssystemgdi32.dll
EXP=c:windowssystemcomdlg32.dll
EXP=c:windowssystemshell32.dll
EXP=c:windowssystemadvapi32.dll
EXP=c:windowssystemcomctl32.dll
Осталось выбрать подходящий размер шрифта, используемые цвета и размеры окон. Для этого в SoftIce
используется строка инициализации. Если вы работаете в разрешении 800x600, строку
INIT="X;"
замените строкой
INIT="lines 41;width 98;set font 2;wc 20;wd4;wl 4;X;"
Для других разрешений можно либо выбрать более крупный шрифт, либо увеличить число строк (lines) и
символов в строке (width).
Всё! Осталось только перезагрузится. После перезагрузки нажмите Ctrl+D, и если всё сделано правильно
должно появится окно отладчика. Вверху окна отладчика находится список всех регистров, внизу строка
для ввода команд, по центру – основное окно. Нажмите Ctrl+D ещё раз, чтобы выйти из отладчика.
Для работы с SoftIce необходимо знать основные брэйкпоинты.
Общецелевые брэйкпоинты:
bpx hmemcpy
bpx MessageBox
bpx MessageBoxExA
bpx MessageBeep
bpx SendMessage
bpx GetDlgItemText
bpx GetDlgItemInt
bpx GetWindowText
bpx GetWindowWord
bpx GetWindowInt
bpx DialogBoxParamA
bpx CreateWindow
bpx CreateWindowEx
bpx ShowWindow
bpx UpdateWindow
bmsg xxxx wm_move
bmsg xxxx wm_gettext
bmsg xxxx wm_command
bmsg xxxx wm_activate
При Времянных защитах:
bpint 21 if ah==2A (DOS)
bpx GetLocalTime
bpx GetFileTime
bpx GetSystemtime
bpx GetTickCount
bpx FileTimeToSystemTime
При CD-ROM и Дисковых защитах:
bpint 13 if ah==2 (DOS)
bpint 13 if ah==3 (DOS)
bpint 13 if ah==4 (DOS)
bpx GetFileAttributesA
bpx GetFileSize
bpx GetDriveType
bpx GetVolumeInformation
bpx GetLastError
bpx ReadFile
bpio -h (Your CD-ROM Port Address) R
При защитах типа:
Dongle (HASP) bpio -h 278 R
bpio -h 378 R
На ввод с клавиатуры:
bpint 16 if ah==0 (DOS)
bpint 21 if ah==0xA (DOS)
При работе с файловыми защитами:
bpint 21 if ah==3dh (DOS)
bpint 31 if ah==3fh (DOS)
bpint 21 if ah==3dh (DOS)
bpx ReadFile
bpx WriteFile
bpx CreateFile
bpx SetFilePointer
bpx GetSystemDirectory
При работе с INI файлами:
bpx GetPrivateProfileString
bpx GetPrivateProfileInt
bpx WritePrivateProfileString
bpx WritePrivateProfileInt
При работе с Реестром:
bpx RegCreateKey
bpx RegDeleteKey
bpx RegQueryValue
bpx RegQueryValueEx
bpx RegCloseKey
bpx RegOpenKey
При Флагах в регистрах:
bpx cs:eip if EAX==0
При Флагах в памяти:
bpmb cs:eip rw if 0x30:0x45AA==0
При "подслушивающей" технике взлома:
bpx 0x30:0x45AA do "d 0x30:0x44BB"
bpx CS:0x66CC do "? EAX"
При работе с консольными приложениями:
WriteConsole/ReadConsole
SetCursorPos
HEX редакторы.
HEX редакторы используется для внесения в файл каких-либо изменений, после взлома. Я, например,
пользуюсь: HackerView’ом.
RegMon и FileMon.
Программы RegMon и FileMon используются для того чтобы пользователь мог посмотреть куда в реестр и к
каким файлам обращается нужная программа.
Пакеры и Анпакеры
Программы-пакеры программисты используют для того, чтобы их программа имела меньший вес, и для того
чтобы их код нельзя было просмотреть в Дизассемблере. Анпакеры используются для их распаковки.
Хорошим анпакером можно назвать ProcDump, он с легкостью справляется с большинством упакованных
программ.
Для закрепления полученых знаний займёмся взломом тренировочной программы: “CrackME.exe”[1] автор –Я
:). Запускаем программу. Итак, от нас требуется ввода правильного серийного номера. Если номер
неправильный выводится ошибка.
Итак, смысл использования SoftIce в том, что мы можем перехватить любую WinApi - функцию, например,
для вывода ошибок в основном используются функции: MessageBox, MessageBoxA. Для перехвата нужной
функции нужно в SoftIce установить соответствующий брэйкпоинт. Брэйкпоинты устанавливаются командой:
bpx “Название функции”. И так нам просто нужно перехватить функцию, которая используется для вывода
нашей ошибки, после этого найти место, где сверяется правильный номер с тем, который мы ввели.
Способ первый. Простой и быстрый.
Запускаем нашу программу для тренировки. Заходим в SoftIce (Ctrl+D), вводим:
bpx MessageBox, нажимаем Enter, вводим: bpx MessageBoxA, нажимаем Enter, нажимаем: Ctrl+D. Вводим
любой номер, жмём ОК. Мы оказываемся в SoftIce по вызову MessageBoxA, нажимаем F12 для того, чтобы
увидеть, где вызывалась эта функция. Жмём снова: ОК, и снова попадаем в SoftIce. Можем снять все
брэйкпоинты (команда: bc *). Итак, мы находимся на следующей строчке после вызова MessageBoxA.
Немного поднимаемся вверх (Ctrl+Вверх). Итак, пролистав совсем немного, мы видим две рядом стоящие
команды: Call, а потом JNZ. Возможно, в процедуре Call выполняется проверка, а потом совершается или
не совершается прыжок. Посмотрим, по какому адресу расположена команда JNZ , это будет адрес:004502В9
(Мой адрес может не совпадать с вашим). Поставим брэйкпоинт для этого адреса (bpx 4502В9), жмём
Ctrl+D. Вводим номер снова и жмём ОК. Мы остановились по адресу 004502В9. Попробуем снять флажок с
команды JNZ (команда R FL Z). Выполним эту строку (F10), и продолжим выполнение программы (F5). Что
мы видим??? :)
Но это сработало только один раз. Чтобы это работало всегда, нам нужно пропатчить программу
(Пропатчить – изменить необходимые байты в EXE-файле программы). Открою один секрет: программа
упакована UPX’ом. Распаковать её можно без проблем: ProcDump’ом, или самим UPX’ом с ключом – d. После
распаковки нам необходимо найти нужное место для патчинга :))) , для этого: снова запускаем
программу, снова вводим номер, жмём ОК. Снова попадаем в SoftIce, смотрим команды в HEX-коде
(слева). Перепишем немного HEX-код, достаточно: 75 15 6A 00 68 34 03 45 00 . Снимаем все брэйкпоиты:
bc * .
Перед тем как патчить программу, лучше сделать ее копию.
Открываем CrackMe.exe в HackerView, жмём F4 -> Decode, потом F7, и в строке HEX, вводим: 75 15 6A 00
68 34 03 45 00. Находим, жмём F3, и правим 75 на 74. ВСЁ!!! Теперь при любом НЕПРАВИЛЬНОМ номере
будет писаться, что всё ОК, и только при правильном будем писаться ЛАЖА. А чтобы всё время было ОК,
можно поменять 75 15 на 90 90, этим самым мы команду JNZ меняем на два NOP’а. Прыжок не выполняется
вообще.
Способ второй. Более элегантный.
Используя этот способ, нам не нужно будет распаковывать и патчить программу, мы просто узнаем
правильный номер. Перед командой JNZ, стоит команда CALL, скорее всего эта функция выполняет
проверку. Она находится по адресу: 004502D4. Поставим брэйкпоинт на этот адрес: bpx 4502D4, закрываем
SoftIce. Жмём ещё раз ОК в нашей программе, и останавливаемся по нужному адресу, жмём F8 для входа в
функцию. Трассируем нашу программу (F10), пока не дойдём до команды CMP EAX, EDX. Хм.… Посмотрим, что
хранится в EAX(d eax), ага, там хранится номер, который мы ввели, а что в EDX(d edx), правильный
номер.
Итак, правильный номер: 3955815, снимаем все брэйкпоинты(bc *), вводим в непропатченной порге:
3955815, видим, что всё ОК!
Итак…
Мы взломали мою тренировочную программу, немного попрактиковались работать в SoftIce. Есть вопросы,
или что-то не выходит – пишите!!!
-----------------------------------------------------------------------------------------------------
[1] - Программу CrackME.exe можно взять тут: http://rst.void.ru/download/CrackME.exe

Категория: Крэкинг | Добавил: -=Hellsing=- (17.06.2009) | Автор: Ramhak
Просмотров: 2720 | Рейтинг: 1.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]