Соглашение | Публикация статей

Красивые рольшторы - roll-service.by

Крэкинг (вершина айсберга)
Категория: Статьи

Если вы читаете эту статью значит, вам надоело часами искать кряк или серийник для новой проги, или вообще ждать пока он выйдет. В этом (как я надеюсь) цикле статей я постараюсь описать способы "исследования защиты программ", и помочь вам не ждать милости крэкеров, а самим ломать программы. В первой статье я опишу теорию и некоторые термины, а потом уже приступим к практике в следующих статьях. И так приступим!
(Несколько абзацев про асм)
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’сом.
По всем замечаниям, предложениям обращаться на аську.

Статьи по теме:

Интерфейсы и мобильность Windows Vista
Создание, использование и распространение вредоносных программ для ЭВМ
ПРОЯВЛЕНИЕ НАЛИЧИЯ ВИРУСА В РАБОТЕ НА ПЭВМ
РАСКЛАДКА ПРОВОДОВ
WordPad: Поиск и замена слов по шаблону
Хакеры, как субъекты компьютерных преступлений
Мышление и информация
Основные черты NetWare 3.x - 4.x
Антивирусные программы
Задача, решаемая с использованием систем управления базами данных
Банковские операции с использованием вычислительной техники
Адресация в системе электронной почты
Настройка параметров видеоустройства
CRT мониторы
СФЕРЫ ПРИМЕНЕНИЯ КОМПЬЮТЕРОВ
Софт Можно Скачать С Варезных Сайтов Или Же Приобрести В Интернет-Магазинах
Установка Windows Xp По Сети Без Использования Ris
Формат Магнитной Записи Lto (Linear Tape Open)
Электронная почта (e-mail)
Выпущена Версия Mobile Forex 2.15: Новый Подход К Надежности И Удобству
Преобразование рисунка
Учет Клиентов, Учет Заказов - Самое Востребованное Программное Обеспечение
COSMOS/M интерфейсы
Разработка контрольно-информационных инструментов для PADS
Трассировка процессов в UNIX
Электронный подход
Видеопамять
Четырехбитное мышление
Функции BIOS для работы с дисками
Социальные аспекты информационного общества
Чарльз Бэббидж
Транзисторы
Программная совместимость ЕС ЭВМ
ЦИКЛ ФУНКЦИОНИРОВАНИЯ ВИРУСОВ
Уголовно-правовой анализ ст? 273 гл? 28 УК РФ "Создание: распространение и использование вредоносных программ для ЭВМ"
Заливка области рисунка
Самый востребованный софт!
Почему именно Vista?
Простые меры защиты
Общие сведения языка программирования
Политика безопасности Microsoft Internet Explorer
3Ds Max 2008 (Rip)
Электронные таблицы «EXCEL»
Вывод специальных символов CRT
Редактирование звукового файла
Введение в Windows
Блокнот: Автоматическая вставка даты и времени
Правда об активации Windows Vista
Проверка Софта На Лицензионность
Региональная Система Имен
Процедуры и функции модуля CRT
Поисковые системы и каталоги ресурсов
Критерий использования ЭС для решения задач
Технологическая Платформа 1С:Предприятие 8 - Направления Развития
История развития компьютера