///Статья рассчитана на новичков Здравствуй читатель! Если вы читаете эту статью значит, вам надоело часами искать кряк или серийник для новой проги, или вообще ждать пока он выйдет. В этом (как я надеюсь) цикле статей я постараюсь описать способы "исследования защиты программ", и помочь вам не ждать милости крэкеров, а самим ломать программы. В первой статье я опишу теорию и некоторые термины, а потом уже приступим к практике в следующих статьях. И так приступим! (Несколько абзацев про асм) 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 – (эквивалентный операторам присвоения в языках высокого уровня), этот оператор будет часто вам встречаться. С помощью него и заносятся данные в регистры или переменные. Она заносит данные из источника в приемник, при этом источник не меняется. В первой строке EAX был приемником, а 1 – источником. Во второй EBX – приемник, EAX – источник. Ну и в последней строке peremen – приемник, 15 – источник. CALL – вызов процедуры. Процедура может быть, как описана в теле программы, так и находится в подключаемой DLL. После отработке процедуры управление возвращается на команду идущую после CALL. В основном процедуры вызываются с помощью меток: (Метки) Метка – это символическая ссылка, которой обозначается начало и конец процедуры. При компиляции метки заменяются адресом, на которой начинается процедура. Метки в основном сделаны для удобства программиста ведь не надо вычислять каждый адрес, а просто обратится к метки. Название метки можно давать любое кроме имен зарезервированные компилятором (например, название оператора). Конец метки обозначается оператором end. Например: PUSH – оператор который «толкает» данные в стек. Именно этим оператором заносятся данные в стек. POP – оператор которым данные извлекаются из стека. Например, функция нам возвращает число после отработки в регистр EAX (пусть это будет 20). И для того чтоб сохранить его и в дальнейшем использовать толкаем его в стек (PUSH EAX), после работаем с регистром EAX, так как нам нужно, а когда вновь понадобится число, которое возвратила процедура извлекаем его из стека. Главное в стеке следить за правильностью извлечения данных, и не запутаться. CMP – функция которая вычитает из операнда-получатеся операнд-отправитель. Фактически самый важный оператор для крэкера поскольку именно им обычно сравниваются ключ который сгенерила прога и который ввели при регистрации. Когда сравниваются числа без знака, флаги нуля (ZF) и переноса (CF) устанавливаются командой CMP в таком порядке: CF ZF Получатель<отправитель 1 0 Получатель=отправитель 0 1 Получатель>отправитель 0 0 JMP – оператор который заставляет процессор продолжать выполнение команд с нового места в программе. Относится к группе безусловных переходов. JNZ – оператор который относится к группе условных переходов т.е. выполняется только при определённом условии. Это условие «если не равно». Например: Ну, вот вроде основные операторы изложил, думаю, этот необходимый минимум должен знать каждый крэкер, ну а если хотите стать хорошим «исследователем» советую вам хорошо выучить ассемблер и уметь программировать на нём. Теперь приступаем непосредственно к терминам крэкинга. (Тулзы) Отладчик – основной инструмент, именно та прога в которой вы увидите ассемблерный код разбираемой программы. Современные отладчики включают в себя множество функций, такие как: пошаговая трассировка, бряки и много другого. Также отладчики показывают содержание регистров и состояние флагов. Я назвал две основные функции которые вам понадобятся, теперь разберём их. Пошаговая трассировка – функция, при которой выполнение программы выполняется шаг за шагом, т.е. выполняется одна строка программы и она останавливается, при нажатии кнопки выполняется следующая строка. Фактически вы управляете выполнение программы. Брейкпоинт (в народе бряк, ещё его называют «точка останова», но мне это название как-то не по душе) – представьте, что вам нужно остановится в каком-то месте программы, например на двухсотой строке. Не нажимать же 200 раз по кнопке пошаговой трассировки (это в лучшем случае). Как же это сделать? Всё просто, надо поставить бряк на двухсотую строку и запустить программу на выполнение, отладчик остановится на той строке, которая вам нужна автоматически. На данный момент лучшими отладчиками считаются OllyDbg (Оля) и SoftIce (айс, сайс). Лично я предпочитаю Олю, поскольку она довольно проста в обращении, а функциональностью не уступает сайсу, все примеры я буду приводить в ней. Достать её в сети просто и весит она метров пять, шесть (в зависимости от сборки). Дизассемблер – тоже переводит код программы в ассемблерный. Самым лучшим считается IDA, но я пользуюсь Win32Dasm (скачать тоже не проблема). Пакер – программа для сжатия кода, тем самый, уменьшая размер. Например, написали вы программу весом 20 кб, после сжатия она весит уже 10 кб (это примерно, всё зависит от языка, на котором написана программа и от стиля программиста). Основными считаются UPX и платный ASpack (хоть и платный, а жмёт хуже UPX). Назвал я всего два, но их гораздо больше. Криптор – программа, которая тоже сжимает код, но её основное направление это зашифровать код программы от крэкеров. Основной сейчас ASprotect. Также как и пакеров протекторов гораздо больше чем я назвал. Анализатор – определяет, чем упакована программа. Часто запакована программа или нет можно определить на глаз в отладчике, но это приходит с опытом, а пока пользуйтесь анализаторами. Лучший это PEID. Но не стоит забывать что есть ещё много разныйх анализаторов. Распаковщик – допустим, пейд показал, что программа запакована UPX. UPX распаковывается самим же UPX (т.е. ищем в Интернете программу для запаковки в UPX и ей распаковываем). Ну а если показал ASprotect, тогда есть два варианта: 1. Это распаковывать вручную. 2. Это скачать автоматический распаковщик, который сделали добрые люди. Как вы понимаете тут каждый случай особенный, поэтому ничего не советую. Вот и весь начальный набор, также есть много тулз для ручной распаковки и прочего, но я думаю для новичка они пока не к чему. Так что до следующей статьи, в которой сломаем первую прогу и распакуем файл, запакованный UPX’сом. По всем замечаниям, предложениям обращаться на аську. Все приведённые примеры программ можно без труда найти в интернете поетому линки не даются... P.S.: Заранее извиняюсь за грамматические ошибки. Автор: Filin ICQ: 226-300-300
сомнительно 4то сабж кому-то пригодится, у4итывая 4то в туторах нарвахи то же самое и более детально, единственное 4то модет быть полезно, 4то ты все бегло описал и для на4инающих будет какое-никакое, но представлении именно не об асме и практи4еском крекинге, а еще об отлад4иках) етц
Если подумать то любая инфа которая есть на ачате уже была описана... А новички они ведь всегда будут...Я рассчитываю зделать цикл статей и это только начало...Если продолжение кому-то будет нужно тогда напишу...
Да ну помоему так для ознакомления очень даже и полезна! Даже людям далеких от программинга и крекинга узнать в кратце, что и как называется и зачем оно нужно не помешает, коль они сюда заглянули
Замечания 1. А die? А ProtectionID? ) Так говорить не совсем верно. Просто его юзают довольно часто, но это не значит, что он лучший) В целом расширь набор программ (это касается не только анализаторов). Предложи альтернативу каждой проге, распиши плюсы и минусы. 2. Описание прог лучше оформи так [Программа] Описание линк (это особенно важно) Чисто визуально будет лучше смотреться. 3. Далеко не всегда 4. Лучше просто стек)
кг/ам Большая часть боян скопипастеный с разных книжек и туторов... я думаю тс все равно получит плюсы,которые он так хотел =\ а RDG?
Насчет статьи скажу так: она как минимум требует полной переработки. Во-первых, она наполнена логическими ошибками, во-вторых, если ты считаешь, что новичок слету поймет то что здесь написано, то ты заблуждаешься, в третьих, материала явно не хватает, какието обрывки, непонятно что, где и как. И насчет крякинга, не совсем верно называть эту статью мануалом для новичков, тут крякинга столько же, сколько в России демократии. Удачи.
ну вот хоть конструктивная критика... Да далеко не всегда...но во многих случаях (это давалась общая сводка, если дальше писать буду, то распишу всё подробно и занудно) ... За оформление спасибо, исправлю... И то что Peid лутший основано на личнои опыте... + интересно мнение стоит ли писать дальше? 2GoreMaster я эту статью вообще не хотел постить...убедил меня знакомый...так что не суди да не судимым будеш
Автор! Как новичок заявляю, что статья вполне приличная и жду продолжения. P.s. Хотелось бы побробнее узнать про логику установки флагов оператором Cmp.
Самые страшные и непоправимые ошибки людям наносят те, кто считается "знающим", а пишет некомпетентный бред.
kez Возможно в этом что-то и есть. Думаю, это естественный процесс познания. А почитать новичку статьи "реально знающих" -> Это принесет ещё тяжелее вред и в большенстве случаев отпугнет новичка. // P.s. "реально знающие" не пишут для новичков