Главная » Статьи » Крэкинг |
Крэкинг.Часть 1. - Funny Hack Team
(Вступление) Если вы читаете эту статью значит, вам надоело часами искать кряк или серийник для новой проги, или вообще ждать пока он выйдет. В этом (как я надеюсь) цикле статей я постараюсь описать способы "исследования защиты программ", и помочь вам не ждать милости крэкеров, а самим ломать программы. В первой статье я опишу теорию и некоторые термины для того что б вы немного ориентировались, а потом уже приступим к практике в следующих статьях. И так enjoy! (Несколько абзацев про асм) Assembler - (асм) низкоуровневый язык программирования (это значит что он наиболее приближен к машинным кодам т.е. один оператор (команда) асма соответствуют одному машинному коду).Из за этого программы на асме получаются максимально быстрые и маленькие. Очень часто на ассемблере пишутся критические (которые на других языках очень медленно выполняются) области кода, а также драйвера. Так, например в с++ (язык высокого уровня) есть поддержка ассемблерных вставок (т.е. к основному коду на с++ можно ещё вставить код на асме). Наверно вы спросите, а зачем нам вообще этот асм? С радостью отвечу. Дело в том, что любую скомпилированную программу можно представить в виде языка ассемблера. Именно его вы увидите при разборе программы, а не тот язык, на котором она была написана (конечно, сейчас существуют программы, которые распознаю код, на котором было написано приложение, но в большинстве своём они мало эффективны). Итак, приступим собственно к асму. Если вы совсем не знакомы с программированием, вам покажется это сложным, но со временем сами будете удивляться насколько всё легко. (Долго думал с чего начать решил начать таки с регистров.) Регистр – ячейка в памяти предназначенная для временного хранения информации. В современных ОС применяются 32-разрядные регистры. Основных регистров не так уж много, это: EAX – аккумулятор EBX – база EDX – регистр данных ECX – счетчик Основными я их назвал (уж пусть простят меня гуру асма), потому что они могут использоваться для любых целей (хранение данных, результаты разных функций… и т.д.) Ещё четыре регистра (ESI, EBP, EDI, ESP) используются в более узком кругу (напр. без ESI,EDI не обойтись в строковых операциях), но они также не маловажны. (Cтек) Стек – это область в памяти в которую помещаются данные и параметры для хранения. Данные в стек кладутся довольно специфически. Попробую объяснить на пальцах. Допустим, стек - это стол, у вас возле стола лежит кипа бумаг – это данные. И вам надо переместит бумагу по одному листку в такую же кипу на стол. Соответственно вы будете брать один листок, и класть на стол, далее ещё один листок, но второй листок вы уже должны будете класть поверх первого, третий поверх второго… и так далее. Так же и в стеке данные ложатся как бы друг на друга. И доставать их из стека тоже нужно в обратном порядке. Примеры работы со стеком я приведу в разделе операторов. (Операторы) Оператор – (команда) это символическое название команды понятное человеку. С помощью операторов производятся различные операции с памятью. Перечислю те, что понадобятся знать для крэкинга (после точки запятой буду расставлять комментарии при компиляции (сборке) программы эти комментарии не учитываются): 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 end vuzov ________________________________________________________________ PUSH – оператор который «толкает» данные в стек. Именно этим оператором заносятся данные в стек. POP – оператор которым данные извлекаются из стека. Например, функция нам возвращает число после отработки в регистр EAX (пусть это будет 20). И для того чтоб сохранить его и в дальнейшем использовать толкаем его в стек (PUSH EAX), после работаем с регистром EAX, так как нам нужно, а когда вновь понадобится число, которое возвратила процедура извлекаем его из стека. Главное в стеке следить за правильностью извлечения данных, и не запутаться. CMP – функция которая вычитает из операнда-получатеся операнд-отправитель. Фактически самый важный оператор для крэкера поскольку именно им обычно сравниваются ключ который сгенерила прога и который ввели при регистрации. Когда сравниваются числа без знака, флаги нуля (ZF) и переноса (CF) устанавливаются в зависимости от результата сравнения (подробней читайте в манах по асму) JMP – оператор который заставляет процессор продолжать выполнение команд с нового места в программе. Относится к группе безусловных переходов. JNZ – оператор который относится к группе условных переходов т.е. выполняется только при определённом условии. Это условие «если не равно». Например: ____________________________________ CMP EAX, 0 ; если EAX не равно 0 то JNZ START ; прыгаем на метку START ____________________________________ Ну, вот вроде основные операторы изложил, думаю, этот необходимый минимум должен знать каждый крэкер, ну а если хотите стать хорошим «исследователем» советую вам хорошо выучить ассемблер и уметь программировать на нём. Теперь приступаем непосредственно к терминам крэкинга. (Tools) [Отладчик] – основной инструмент, именно та прога в которой вы увидите ассемблерный код разбираемой программы. Современные отладчики включают в себя множество функций, такие как: пошаговая трассировка, бряки и много другого. Также отладчики показывают содержание регистров и состояние флагов. Я назвал две основные функции которые вам понадобятся, теперь разберём их. Пошаговая трассировка – функция, при которой выполнение программы выполняется шаг за шагом, т.е. выполняется одна строка программы и она останавливается, при нажатии кнопки выполняется следующая строка. Фактически вы управляете выполнение программы. [Брейкпоинт] (в народе бряк, ещё его называют «точка останова», но мне это название как-то не по душе) – представьте, что вам нужно остановится в каком-то месте программы, например на двухсотой строке. Не нажимать же 200 раз по кнопке пошаговой трассировки (это в лучшем случае). Как же это сделать? Всё просто, надо поставить бряк на двухсотую строку и запустить программу на выполнение, отладчик остановится на той строке, которая вам нужна автоматически. На данный момент лучшими отладчиками считаются OllyDbg (Оля) и SoftIce (айс, сайс). Лично я предпочитаю Олю, поскольку она довольно проста в обращении, а функциональностью не уступает сайсу, все примеры я буду приводить в ней. Достать её в сети просто и весит она метров пять- шесть (в зависимости от сборки). [Дизассемблер] – тоже переводит код программы в ассемблерный. Самым лучшим считается IDA, но я пользуюсь Win32Dasm (скачать тоже не проблема). [Пакер] – программа для сжатия кода, тем самый, уменьшая размер. Например, написали вы программу весом 20 кб, после сжатия она весит уже 10 кб (это примерно, всё зависит от языка,на котором написана программа и от стиля программиста). Тут выбор велик, поэтому достаточно использовать www.google.com [Криптор] – программа, которая тоже сжимает код, но её основное направление это зашифровать код программы от крэкеров. Также как и пакеры, легко найти примеры. [Анализатор] – определяет, чем упакована программа. Часто запакована программа или нет можно определить на глаз в отладчике, но это приходит при работе, а пока пользуйтесь анализаторами. Хороший анализатор это PEID. Но не стоит забывать что есть ещё много различных анализаторов. [Распаковщик] – допустим, пейд показал, что программа запакована UPX. UPX может распаковыватся самим же UPX (не всегда). Ну а если показал например ASprotect, тогда есть два варианта: 1. Это распаковывать вручную. 2. Это скачать автоматический распаковщик, который сделали добрые люди. Как вы понимаете тут каждый случай особенный, поэтому ничего не советую. Вот и весь начальный набор, также есть много тулз для ручной распаковки и прочего, но я думаю для новичка они пока не к чему. Так что до следующей статьи, в которой сломаем первую прогу и распакуем файл, запакованный UPX’сом. По всем замечаниям, предложениям писать на мыло (filin[сцобака]ymail.com). Все приведённые примеры программ можно без труда найти в интернете поэтому линки не даются... Если будет достаточно народу которому нужно продолжение, оно будет. PS: Из за туповатой системы фильрации пришлось писать без тегов | |
Просмотров: 2160 | Рейтинг: 5.0/1 |
Всего комментариев: 0 | |