Крэкинг (вершина айсберга)
Если вы читаете эту статью значит, вам надоело часами искать кряк или серийник для новой проги, или вообще ждать пока он выйдет. В этом (как я надеюсь) цикле статей я постараюсь описать способы "исследования защиты программ", и помочь вам не ждать милости крэкеров, а самим ломать программы. В первой статье я опишу теорию и некоторые термины, а потом уже приступим к практике в следующих статьях. И так приступим!
(Несколько абзацев про асм)
Assembler - (в народе асм) низкоуровневый язык программирования (это значит что он наиболее приближен к машинным кодам т.е. один оператор (команда) асма соответствуют одному машинному коду).Из за этого программы на асме получаются максимально быстрые и маленькие. Очень часть на ассемблере пишутся критические (которые на других языках очень медленно выполняются) области кода, а также драйвера. Так, например в с++ (язык высокого уровня) есть поддержка ассемблерных вставок (т.е. к основному коду на с++ можно ещё вставить код на асме).
Наверно вы спросите, а зачем нам вообще этот асм?
С радостью отвечу. Дело в том, что любую скомпилированную программу (.exe) можно представить в виде языка ассемблера. Именно его вы увидите при разборе программы, а не тот язык, на котором она была написана (конечно, сейчас существуют программы, которые распознаю код, на котором было написано приложение, но в большинстве своём они мало эффективны).
Итак, приступим собственно к асму. Если вы совсем не знакомы с программированием, вам покажется это сложным, но со временем сами будете удивляться насколько всё легко (ну примерно как я сейчас :).
(Долго думал с чего начать решил начать таки с регистров.)
Регистр – ячейка в памяти предназначенная для временного хранения информации. В современных ОС применяются 32-разрядные регистры.
Основных регистров не так уж много, это:
EAX – аккумулятор
EBX – база
EDX – регистр данных
ECX – счетчик
Основными я их назвал (уж пусть простят меня гуру асма), потому что они могут использоваться для любых целей (хранение данных, результаты разных функций… и т.д.)
Ещё четыре регистра (ESI, EBP, EDI, ESP) используются в более узком кругу (напр. без ESI,EDI не обойтись в строковых операциях), но они также не маловажны.
Младшие 16-битные части этих регистров применяются как самостоятельные регистры (во загнул… постараюсь объяснить)…
(Немного истории)
Дело в том что во времена великого DOS’а не существовало 32-разрядных процессоров и уж тем более 64-разрядных, камни были 16-разрядные. Соответственно и регистры все были 16-разрядными, и догадайтесь, как они назывались?
Нет, не хз. Назывались они AX, BX, CX, DX… Соответственно с появлением 32-разрядных процов добавили часть «Е» и они стали 32-разрядными. Но обращение то осталось! И теперь регистры делятся на меньшую 16-битную часть (AX, BX, CX, DX, SI, BP, DI, SP) и большую.
(Понятие про стек)
Стек – это область в памяти в которую помещаются данные и параметры для хранения.
Данные в стек кладутся довольно специфически. Попробую объяснить на пальцах.
Допустим, стек - это стол, у вас возле стола лежит кипа бумаг – это данные. И вам надо переместит бумагу по одному листку в такую же кипу на стол. Соответственно вы будете брать один листок, и класть на стол, далее ещё один листок, но второй листок вы уже должны будете класть поверх первого, третий поверх второго… и так далее. Так же и в стеке данные ложатся как бы друг на друга. И доставать их из стека тоже нужно в обратном порядке.
Примеры работы со стеком я приведу в разделе операторов.
(Операторы)
Оператор – это символическое название команды понятное человеку. С помощью операторов производятся различные операции с памятью.
Перечислю те, что понадобятся знать для крэкинга (после точки запятой буду расставлять комментарии при компиляции (сборки) программы эти комментарии не учитываются):
MOV – (эквивалентный операторам присвоения в языках высокого уровня), этот оператор будет часто вам встречаться. С помощью него и заносятся данные в регистры или переменные. Она заносит данные из источника в приемник, при этом источник не меняется.
MOV EAX, 1 ; теперь в EAX находится число 1
MOV EBX, EAX ; теперь и в EAX и EBX находится число 1
MOV peremen, 15 ; теперь в переменной peremen число 15
В первой строке EAX был приемником, а 1 – источником. Во второй EBX – приемник, EAX – источник. Ну и в последней строке peremen – приемник, 15 – источник.
CALL – вызов процедуры. Процедура может быть, как описана в теле программы, так и находится в подключаемой DLL. После отработке процедуры управление возвращается на команду идущую после CALL. В основном процедуры вызываются с помощью меток:
(Метки)
Метка – это символическая ссылка, которой обозначается начало и конец процедуры. При компиляции метки заменяются адресом, на которой начинается процедура. Метки в основном сделаны для удобства программиста ведь не надо вычислять каждый адрес, а просто обратится к метки. Название метки можно давать любое кроме имен зарезервированные компилятором (например, название оператора). Конец метки обозначается оператором end.
Например:
start: ; начало метки
end start ; конец метки
А теперь пример оператора call:
start: mov EAX, 15
mov EBX, EAX ; это вы уже знаете
end start
vuzov: call start ; а вот это и есть вызов процедуры
mov assa, EBX ; после процедуры в EBX будет 15, которые и заносятся
в переменную assa.
end vuzov
PUSH – оператор который «толкает» данные в стек. Именно этим оператором заносятся данные в стек.
POP – оператор которым данные извлекаются из стека. Например, функция нам возвращает число после отработки в регистр EAX (пусть это будет 20). И для того чтоб сохранить его и в дальнейшем использовать толкаем его в стек (PUSH EAX), после работаем с регистром EAX, так как нам нужно, а когда вновь понадобится число, которое возвратила процедура извлекаем его из стека. Главное в стеке следить за правильностью извлечения данных, и не запутаться.
CMP – функция которая вычитает из операнда-получатеся операнд-отправитель. Фактически самый важный оператор для крэкера поскольку именно им обычно сравниваются ключ который сгенерила прога и который ввели при регистрации. Когда сравниваются числа без знака, флаги нуля (ZF) и переноса (CF) устанавливаются командой CMP в таком порядке:
CF ZF
Получательотправитель 0 0
JMP – оператор который заставляет процессор продолжать выполнение команд с нового места в программе. Относится к группе безусловных переходов.
JNZ – оператор который относится к группе условных переходов т.е. выполняется только при определённом условии. Это условие «если не равно». Например:
CMP EAX, 0 ; если EAX не равно 0 то
JNZ START ; прыгаем на метку START.
Ну, вот вроде основные операторы изложил, думаю, этот необходимый минимум должен знать каждый крэкер, ну а если хотите стать хорошим «исследователем» советую вам хорошо выучить ассемблер и уметь программировать на нём.
Теперь приступаем непосредственно к терминам крэкинга.
(Тулзы)
Отладчик – основной инструмент, именно та прога в которой вы увидите ассемблерный код разбираемой программы. Современные отладчики включают в себя множество функций, такие как: пошаговая трассировка, бряки и много другого. Также отладчики показывают содержание регистров и состояние флагов. Я назвал две основные функции которые вам понадобятся, теперь разберём их.
Пошаговая трассировка – функция, при которой выполнение программы выполняется шаг за шагом, т.е. выполняется одна строка программы и она останавливается, при нажатии кнопки выполняется следующая строка. Фактически вы управляете выполнение программы.
Брейкпоинт (в народе бряк, ещё его называют «точка останова», но мне это название как-то не по душе) – представьте, что вам нужно остановится в каком-то месте программы, например на двухсотой строке. Не нажимать же 200 раз по кнопке пошаговой трассировки (это в лучшем случае). Как же это сделать? Всё просто, надо поставить бряк на двухсотую строку и запустить программу на выполнение, отладчик остановится на той строке, которая вам нужна автоматически.
На данный момент лучшими отладчиками считаются OllyDbg (Оля) и SoftIce (айс, сайс). Лично я предпочитаю Олю, поскольку она довольно проста в обращении, а функциональностью не уступает сайсу, все примеры я буду приводить в ней. Достать её в сети просто и весит она метров пять, шесть (в зависимости от сборки).
Дизассемблер – тоже переводит код программы в ассемблерный. Самым лучшим считается IDA, но я пользуюсь Win32Dasm (скачать тоже не проблема).
Пакер – программа для сжатия кода, тем самый, уменьшая размер. Например, написали вы программу весом 20 кб, после сжатия она весит уже 10 кб (это примерно, всё зависит от языка, на котором написана программа и от стиля программиста). Основными считаются UPX и платный ASpack (хоть и платный, а жмёт хуже UPX). Назвал я всего два, но их гораздо больше.
Криптор – программа, которая тоже сжимает код, но её основное направление это зашифровать код программы от крэкеров. Основной сейчас ASprotect. Также как и пакеров протекторов гораздо больше чем я назвал.
Анализатор – определяет, чем упакована программа. Часто запакована программа или нет, можно определить на глаз в отладчике, но это приходит с опытом, а пока пользуйтесь анализаторами. Лучший, это PEID (Также их множество, я основываюсь на собственном имхо).
Распаковщик – допустим, пейд показал, что программа запакована UPX. UPX распаковывается самим же UPX (т.е. ищем в Интернете программу для запаковки в UPX и ей распаковываем). Ну а если показал ASprotect, тогда есть два варианта: 1. Это распаковывать вручную. 2. Это скачать автоматический распаковщик, который сделали добрые люди. Как вы понимаете тут каждый случай особенный, поэтому ничего не советую.
Вот и весь начальный набор, также есть много тулз для ручной распаковки и прочего, но я думаю для новичка они пока не к чему. Так что до следующей статьи, в которой сломаем первую прогу и распакуем файл, запакованный UPX’сом.
По всем замечаниям, предложениям обращаться на аську.
Статьи по теме:
Удаленный доступ (telnet)ПРИНЦИПЫ ДЕЙСТВИЯ И СТРУКТУРАЯ СХЕМА КОМПЬЮТЕРАОперационные системы реального времени для CompactPCI- компьютеровКому нужны ваши данные?..Области в которых используются компьютерные системы на базе CompactPCIДеловые игрыФормат Магнитной Записи Lto (Linear Tape Open)Алее Софтвер Приглашает На Docflow 2008! Легальное использованиеЛогическое хранение и кодирование информацииКомпьютерные сетиПрограмма AntiVirШифрование. PGP-ключАда и СиПроверка состояния очереди печати Экспертные системы Учет Клиентов, Учет Заказов - Самое Востребованное Программное ОбеспечениеМетодическая сущность деловой игрыТИПЫ ЛКСИнформатизация общества: социальные условия, предпосылки и последствияИстория Браузера OperaУстройство Netping Cooler Board Поступило На Склад Компании Зао «Лайт Коммуникейшн»Социальные аспекты информационного обществаЛегализация По. Цена Ошибки!Проблемы формирования информационного общества в УкраинеЭффективность микропроцессоровСетевая этикаЗрительная работа за компьютером и ее последствияГрафические интерфейсы пользователяИнформационные ресурсы украинского сегмента InternetЧерный Баннер - 25й кадр интернетаРабота с дисками на физическом уровнеDesigner/2000 + Developer/2000Устройства вводаРазвитие Железной Индустрии Или Кому Сейчас Нужны Многоядерные ПроцессорыЛинейная Магнитная Запись Dlt (Dlt-V/Sdlt/Dlt-S4)Проект СКСРеализация ЭССтруктура региональной системы именБудущие модули CompactPCI- которые будут производится в ближайшее времяСОЗДАНИЕ БАЗ ДАННЫХ И ВВОД ДАННЫХПрокладка абонентских линийМикротравмыУровень агентовПолиграфия без типографии? Это возможноПерезапуск задач печати Масштабирование изображения COSMOS/M трансляторыИнтерфейс, селекторный и мультиплексный каналыNosy о привычках вашего парня он-лайн?Открытие документа в процессе загрузки операционной системы Нарушение правил эксплуатации ЭВМ, системы ЭВМ или их сетиГлобальный уровеньЛинукс привелось в действие приборы: Теперь в рынкеНесколько слов об иных возможностях