PDA

Просмотр полной версии : Cracking для новичков...


Micr0b
03.07.2006, 16:25
!!!CRACKING!!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

###Первые шаги для начинаюшего крэкера.###

Начнем с самого простого. Что вообше нужно для того чтобы взломать програму, обойти или убрать
защиту, сгенерировать серийный код?Правильно - посмотреь исходный код програмы и при
необходимости видоизменить его.К сожалению, найим исходнник к коммерческому продукту практичыске невозможнр, поетму приодитса идти по обходимому пути.Как извесно, любая программа представлена на ПК в виде машиных команд.Ти команды понятны микропроцессору, но
програмировать с их помощю чрезвычайно сложно: открой любой ЕХЕ-файл в
НЕХ -редакторе, и ты сразу поймешь, что я имею в виду. Чтобы облегчить процес программирования был изобретен специальной танслятор -ассамблер. Если из ассамблерного листинга можно получать машишый код, то вполне возможно и обратная операцыя. Любой файл может быть представлеой в виде ассамблерных команд- етим и занимаютса дизассамблеры.Для дизассамблера IDA(www.idapro.ru ) нужно иметь опыт.Для решения несложных задач вполне достаточно удобного W32Dasm
( www.expage.com/page/w32dasm ).А чуть не незабыл нам ищо нужен отладчик (дебаггер).Он такде дизассемблирует исходный код програмы, но при етом когда программа выполнять оприделоные действия, отладчик ищет в исходном коде програмы тот код который выполнилса в даной момент...Лидер среди отладчиков есть OllyDBG (www.OllyDBG.de).

Начиная займатса крэкингом буддь рассудителен. Мой тебе совет: не спеши брать быка за рога
и срвзу браться за взлом добротнлй софтины с продуманой защитой. Без соответствующего опыта
у тебя все равно вряд ли что-то получитса. Скорее всего,ты просто закинешь это неблагородное
занятие, одновременно с этим потеряв всякий интерес к теме.Начинать, как извесно, надо с
простого: здесь будет и понимание, и интерес, исамое главное -толк. Можно, например зайти
на www.downloads.com и накачать пару десятков сомнительных программ, типа СуперКАлькулятор, ГиперБлокнот... - среди них, наверняка, найдутса экземпляры с приметивной защитой. Но я тебе рекомендую начать с так называемых крякмисов(crackme) -специальных заданых для взломщиков. Многите из них написаны специально для новичков... Идеальный вариант для новичков - серия крякмисов от
FaNt0m'a www.crackmes.de/users/fant0m/fant0mcollection. Ее и расмотрим: для лутшего усвоения рекомендую выполнить действия паралельно со мной.Только в этом случае ты будеш понимать, о чем я говорю :).

#Немного теории

Возьмем первый крякмис из колекции - FaNt0m'a CrackMe #1. В задание требуется найти серийник,
при этом используя исключительно дизассемблер . Используя дебагер по условию запрещено, и не
требуется. Посмотрим что собой представляет програма: обычное окно с текстовым полем для ввода.
После ввода случайного значения (например, слова 'античат'), появится всплывающее окно с
ошыбкой Worng rassword. Keep trying, you'll get it!. От этого, соббственно, мы и будем крутиться. Текстовые строки информационных сообщений зачастую хранятся в самом коде программы.Соотвестено, если найти обращения к строке, то без труда найдется и вызов функции вывода сообщения, а там уже и процедура проверки серийника недалеко. Попробуем разобраться во всем более подробно. В общем случае программа состоит из трех областей памяти(сегментов): сегментов кода (CS), сегментов кода (DS) и сегментов кода (SS).В первом, как ты понял, хранится непосредственно код программы, то есть команды.Второй сегмент предзначен для хранения даных (переменых, констант и т.д) - по идее, выданное програмой сообщения разполагается имено там. Сегмент стека прдставляет собой специальную область памяти, предзначенную для временого хранения даных, например, параметров, представаемых процедур и функциям. Слово 'стек' подразумевает спользования принцина FILO (First In- Last Out, первым пришел- последним вышел).Последнее занисенное в стек (командой PUSH) значение, будет извлечено (комадой РОР) первым, предпоследное- вторым и т.д. Можно нагляднопредставить себе это, вобразив колоду карт.Если ты знаком с программированием под Windows то должен знать, что стандартное окно с сообщением чаще всего выводттся с помощью специальной API-функции MessageBoxA.Сама строка собщения и прочие параметры окна помещаются в стек, откуда поже извлекаются и обрабатываются функцие (это самый разпространеный способ передачи параметров функции в язык ассамблер.)Получается что после ввода неправельного ( ты же не думаешь его угадать??))) ) серийника, програма загружает в стек адрес строки и вызывает функцию MessageBoxA. W32Dams, как и многие дизассамблеры, умеют показывать где имено происходит обращения к етой или иной строке. Это значительно облегшает поиск нужного фрагмента
кода: достаточно в дизассамблированном листинге произвести поик текста сообщения, и мы сразу найдем нужный вызов функции MessageBoxA. В большынстве случаев гденибудь рядом разпологоеться и процедура
проверки серийника наша задача- с помощбю дизассамблера просмотреть правильный пароль во впемя сравнения его со введениым.

#Взлом серийника

Зпускай W32Dams, далее меню Dissembler->Open Files и выбирай файл CRACKME1.EXE. Ну и чо переднами..? да да ето дизассемблированный код програмы, но и в нем еще нужно разобраться. Наша цель- найти ту
часть кода, которая каким-то образом использует обозначенную выше строку. Самый банальный способ-
провести поиск строки (меню Search->Find Next), но есть и другой вариант. Дело в том, что W32Dams
записывает все найденные обращения к строковым даным в специальный список
(меню Refs->String Data References). Поетому вместопоиска можно просто выбратьиз списка нужную строку и дражды кликнуть по ней мышью. Так или иначе, W32Dams, автоматически переведет на следующий код:


* Possible StringData Ref from Data Obj -> "Wrong Rassword Keep trying? you'll get it"!
004012A2 6845304000 push 00403045

http://xss-xss.nm.ru/anti/error.GIF

Комментарий указывает на то, чо в следующей команде происходит обращение к нужной строке-
Wrong Rassword Keep trying? you'll get it!. Разберем эту команду более подробно: 004012A2 ето адрес, где в памяти находится даная команда, 6845304000 - представление команды в шестезначном виде
(машинные коды). push 00403045 - непосредственно сама ассемблерная команда. Она помещает в стек адрес
00403045, по которому, судя по комментарию W32Dams'a, хранится наша строка.По нашему предположению после загрузки адреса строки в стек, происходит вызов функции , выводящейсообщения на экран. Так и есть - смотрим ниже:


* REference To: USER32/MerrageBoxA? ord:01BBh
:004012A9 E85C00000 Call 0040130A


W32Dams нам явно указывает , что команды вызова функции Call вызывает имено API- функцию вывода окошка
(MessageBoxA).теперь смотим, что происходит до вызова этой функции.Сразу бросается в глаза следующий код:


00401291 Call 00401352
00401296 cnp eax, 00000000
004001299 je 004012B0

На самом деле это довольно стандартная конструкция - запомн ее.В 90% случаев это и есть код проверкисерийника.Сначала вызывается некоторая процедура, которая сравнивает введенный пользователеми правильный код, и по результатам проверки устанавливаетнужное значение регистра ЕАХ. После этого с помощью команды СМР производится сравнение значения регистра с 0.Если они равны (je - jump equal- перейти, если равно), осуществляется переход на адрес 004012В0. Давайте посмотрим, что находится по этому адресу - нажми Shift+F12 и в появившемся окошке введи этот адрес.ОГО! Появившийся фрагмент кода в точности повторяет код вывода сообщения на екран. Разница лишь в том,
что вместосообщения о неправильном коде, выводится надпись You got it! Your now a cracker!.Отсюда вывод:вызванная ранее процедура действительно осуществляет проверку серийных кодов. Если пользоватнль введет правильный пароль, то значение регистра ЕАХ становится равным 0, и
управление передаеться процедуре вывода сообщения об успехе. В противном случае в регистре
ЕАХ записывается 1, и перехода не происходит. Далее по коду расположен вызов MessagrBoxA с сообщением об ощибке, который и выполняется. В нашем случае все еще проще. Функция проверки является стандартной
функцией сравнения двух строк IstrcompareA, которой через стек передаются два параметра:

http://xss-xss.nm.ru/anti/yes.GIF

:00401287 689С304000 push 0040309C
* Pssible StringData Ref from Data Obj -> "m0tNaF-EmKCARc"
:0040128C 6829304000 push 00403029
* Referece To: KERNEL32.IstrcmpA,Ord:02D5h
00401291 E8BC000000 Call 00401352

Первой командой push в тек заносится адрес введеной нами строки, а второй- настоящтй серийник.W32Dams любезно подсказал, что по этому адресу находится строка m0tNaF-EmKCARc. Это и есть серийник :)).

http://xss-xss.nm.ru/anti/Crackme1.RAR


Взял из журнала хакер тока не помню какой номер..
Пока всё..)
Продолжения скоро будет..)))

tclover
03.07.2006, 16:46
1. Адрес сайта оли - http://www.ollydbg.de/, а не www.ollsbg.de, как ты написал.
2. Да и меня смущает то как ты писал =).. Начало абсоютно безграмотно (грамматически), потом всё отлично... Ну это неважно )
3. Первый крякми фантома может крякнуть любой человек умеющий читать ), ты бы хоть про второй написал )
4. ...Можно, например зайти
на www.downloads.com и накачать пару десятков сомнительных программ, типа СуперКАлькулятор, ГиперБлокнот... - среди них, наверняка, найдутсаэкземпляры с приметивной защитой... - 100% что я уже где-то это видел )
[добавлено позже]
Вот откуда растут ноги у этой статьи )
http://www.xakep.ru/magazine/xa/080/070/1.asp
Как я и предполагал...

Micr0b
03.07.2006, 17:02
1. Адрес сайта оли - , а не www.ollsbg.de, как ты написал.
2. Да и меня смущает то как ты писал =).. Начало абсоютно безграмотно (грамматически), потом всё отлично... Ну это неважно )
3. Первый крякми фантома можёт крякнуть любой человек умеющий читать ), ты бы хоть про второй написал )
4. . - 100% что я уже где-то это видел )
[добавлено позже]
Вот откуда растут ноги у этой статьи )
http://www.xakep.ru/magazine/xa/080/070/1.asp
Как я и предполагал...


Я в это время редагу....)

А про автора провтыкал..сори..)

nerezus
03.07.2006, 17:15
Все крякмисы от Fantom'a + тутор от меня(BUG(O)R).
WxProtect_CrackMe
TimeCOP
NoName CrackMe's
Crackme#13_By_Detten

Читать тут: http://hunger.ru/debug

hidden
03.07.2006, 20:41
шестезначном - шестнадцатеричном (это ж тебе не аська)
почему за адресом 00401296 следует адрес 004001299 (по идеи ты должен был скопировать это из дизасемблера)
cnp eax, 00000000 - cmp eax, 00000000 (нет такой команды cnp)
Если кодишь на asm'e, эти ошибки сложно незаметить, их даже сложно допустить, не говоря о том, что ты должен был это хотябы проверить, перед списыванием.

Ну ладно, оформление хорошее, смысл направлен на обучение начинающих крякеров. +

Micr0b
03.07.2006, 21:11
Я проверял...=))

c411k
03.07.2006, 23:07
CodePimps e-zine issue #5 статья 0x05 Введениe в реверс инжиниринг by Zool
разобраны все crackmes`ы FaNt0m’a..
смотрим здесь.. (http://c411k.jino-net.ru/upload/cp5_0x05.htm)
весь номер тут.. (http://rst.void.ru/cp/CodePimps_5x00.htm.zip)

здесь еще один кракми http://ct757.net.ru/misc.html

~Fenix~
04.07.2006, 02:01
кажется я ето читал на краклоб.ру нехорошо ток делать, лови -

[Zarakul]
05.07.2006, 10:48
Вот откуда растут ноги у этой статьи )
http://www.xakep.ru/magazine/xa/080/070/1.asp
Как я и предполагал...Там без скринов. А HakNet хотя бы старался. За это ему +

Tikson
06.07.2006, 13:49
nerezus проще диск от краклаб купить всего 300р зато там ВСЕ
-----
кажется я ето читал на краклоб.ру нехорошо ток делать, лови -
и в журнале хакер это тоже писали =)))
---------
кстати был даже хакер спец в котором ВСЕ про крекинг писали =))

nerezus
06.07.2006, 15:32
nerezus проще диск от краклаб купить всего 300р зато там ВСЕ и то, что по моим ссылкам? ;)

неужели =)))

Tikson
06.07.2006, 15:47
там крякмисы специально для твоего сайта сделаны? если да, то красавчег )

tclover
06.07.2006, 15:50
Тиксон =)) ... там туторы от Nerezus'a =)

nerezus
06.07.2006, 16:03
Тиксон =)) ... там туторы от Nerezus'a =) не от меня, а от соавтора ) наш сайт с ним ;)

Micr0b
01.08.2006, 18:33
Начало на ссылка

Продолжение.

###Убираем наги.###

Наг- это назойливое окошко, которое присуще любой триальной программе.
Смысл окошка- напомнить пользователю о том, что програмисты тожелюблять кушать,
поэтому покупка програмы была бы очень кстати. Общий принцип таков.
Во время запуска приложения , осуществляется простая проверка- заригистрированая
ли програма или нет. Индикацией того, что приложение зарегистрировано, может быть
наличие некоторого файла, ключа реестра или, что более вероятно, что прога уже
зарегистрирована, то никакого наг-окна не выводится, и программа продолжает
обычную работу. В противном случае управление передается прочедуре, которая выводит
наг на екран и в большинстве случаев требуетнажать клавиши для продолжения работы.

Как правило убрать наг-окно не представляет труда, в этом можнолегко убедиться на
примере FaNt0ms CrackMe #2.После запуска проги пользователя одаривают не один,
а сразу двумя наг-окошками, но задача от этого практически не усложняеися.
к сожалению, взможность негистрации не предусмотрена, поэтому единствинное,
что остается сделать, - это вручную убрать из кода левые фрагменты програмы.
Или точнее говоря, вызовы процедур, выводящих на экран эти назойливые сообщения.
В принципе это можно сделать с помощью дизассамблера и НЕХ-редактора, но удобнее и
уместнее все-такм использовать отладчик (или и то, и другое одновременно) - скоро
ты в этом убедишся.

Итак, запускаю OllyDBG, а с помощью меню отрой файл CrackMe2.exe. В принципе, найти
нужный фрагмент кода, содержащий вызовы левых процедур, можно по описаному ранее
алгоритму в(часть №1).Для етого нужно кликнуть правой мыши в окне с ассемблерным кодом.
и в контекстном меню выбрать пункт Search for -> All referenced text string.
В появившемся списке ты срвзу же увидишь текст сообщения выводимый в окне нага, а
двойным кликом сможешь перейти туда, где н используется. Но мы пойдем по другоу пити
и изучим еще один ключевой пример, которой активно используеться во время взлома программ.
Если ты уж когда-то пробовал ломать програмы, то наверняка, слышал о так называемых
брейкпоинтах (breakpoints).Брейкпоинт - это место останова програмы, то есть точка,
в которой программа приостанавливает свое выполнение и указывает адрес текущей команды
в отладике. Использовать ето черезвычайно полезный прием очень просто. Нам уже извесно
что, небольшое окошко с сообщением легко может бытьвыведено на экран с помщью функции
MessageBoxA. Теперь все, что от нас требуется - установить точку останова на вызове этой
функции, а после остановки программы всего лишь вырезать из кода ее вызов. Попробуем.?)
Если правильно установил OllyDBG и подключил чрезвычайно полезный плагин CommandBar, то в
нижней части экрана должно светиться окно для ввода команды. Введем команду для установки
точки останова на вызове функции MessageBoxA: bpx MessageBoxA. Правильност установки
брейкпойнта можно проверитьв окне Breakpoints (меню View-> Breakpoints). Там же его можно
на время деактивизировать, или вовсе удалить.

Micr0b
01.08.2006, 18:42
Далее необходимо запустить программу из
отладчика для этого нажми клавишу F9 или выбери в меню Debug->Run.Программа сразу же
остановилась на команде с адресом 004010DE:

004010DE CALL <JMP.USER32.MessageBoxA> ; MessageBoxA

Мы получили то, что хотели - программа остановилась до вызова функции MessageBoxA. Если ты
выполняеш действия параллельно сомной то, наверняка приятно удивлен, что OllyDBG приводит
разшифровкупараметров, которыепередаются этой процедуре. Очень наглядно и удобно.

###Нет операции.###

Тепрь рзберемося, как этот вызов можно убрать. В этом нам поможет специальная инструкция
ассемблера - нет операции (NOP). Для того, чтобы убрать вызов процедуры (или любой
другой код), достаточто забыить его машинный код командами NOP. В результате в программе
образуется своеобразная дырка, но на работоспособность она ни коем образом не повлияет.
Правда , здесь есть один нюанс. машинный эквивалент команды NOP (в шестнадцатеричном
представлении - 90) занимает один байт,в то же время машинная командя, вызывающая функцию
MessageBoxA (E8 C5010000) - целых 5. Несоответствия быть не должно, и чтобы полностью
перекпытьисходною комануду нужно исползоватьуоманду NOP 5 раз. К счастю, OllyDBG полностью
избавляет нас от лишнего неорроя.Кликни правой кнопкой мыши на строке, где произашла точка
останова, и выбери в меню Binary->Fill with NOPs. Отладчик самостоятелно заполнит комануду
Nopаминужно число раз. Теперь можно продолжыть выполнения программы - нажымаем F9. Сразу
выясняется две новости: одна хорошая, другая - нет((. Начну с хорошей: первый наг-скрин мы
убрали. Плохая новостьзаключается в том, что другой наш остался на месте. Почему? Видимо,
он отображатся с помощю другой АРІ-функцей,на которою брейкпоинт не установле. Не беда.
Открываетм окно Referencer (view-> Referencer): после установки первого брейкпоинта сюда
записалася список всех вызываемых програмой функций. С базовымизначениями АРІ (или мануалом
под рукой) можно предложыть, что наг выводится с помощю функции DialogBoxParamA. Предлагаю
проверить проверить тебе самому. Все изменения можно вручнуювнести через НЕХ-ркдактор, с
помощю которого байты по нужным адресам перезаписать числом 90.Или же автоматически записать
все изменения с помощью самого OllyDBG: первый клик по исправленниму ассемблерному коду, меню
Copy to Executable-> All modifications.

Всё..)..

Rabid Rabbit
01.08.2006, 20:05
...специальной танслятор -ассамблер. Если из ассамблерного листинга...
Супротив граматнасти ниче протев не емею, но емей совисть, пеши хатябы "ассемблер" правильна. Родной язык машины заслуживает того чтобы его название писали правильно, в отличие от васиков, сей, пырлов, дэбльфей и проч=)
В общем случае программа состоит из трех областей памяти(сегментов): сегментов кода (CS), сегментов кода (DS) и сегментов кода (SS).Без коментариеф.
00401296 cnp eax, 00000000.
----------------------
А воще статья довольно примитивная. Реальные защиты далеко не так примитивны.
1) можно обойтись без мессадж боксов, зарегив класс окна и назначив ему простенькую оконную процедурку на выньапи
2) можно сделать сплайсинг в АПИ МесаджБоксА
3) можно замаскировать саму проверку: соотв. CMP будет не так то просто обнаружить если в случ неудачной проверки запустить поток который подождав пару сек вызовет МессаджБоксА (или еще свое окно как наприм. сделано в выньраре).
4) еще один поток может висеть в это время в памяти и периодически проверять чексум критического участка кода, причем этот поток можно даже внедрить (такое дело токма в хрюхе но всерано) в совершенно левый процесс (напр в эксплорер.ехе). Ессесно вылет произойдет даже тогда когда в этот код просто поставить точку останова (int 3), что обычно и делает дебагер.
5)Как вариант такую проверку может осуществлять совершенно безобидная на первый взгляд АПИ-функция, которую ессесно перехватили. Трассировка перехваченных АПИ функций геморойное дело. Например если это была инъекция (или первые 6 байт меняются) то поставив туда точку останова мы или вылетим нах из отладчика или уйдем лесом (в зависимости от варианта реализации и самого отладчика).
6) динамическая шифрация/расшифрация очень затруднит фикс проги, даже если в памяти мы его успешно крякнули.
7) методов ухода из-под дыбугера (валом) ну и так дальше. просто влом писать все методы постановки палок в колеса кракерам. их очень много.

Micr0b
02.08.2006, 15:13
Чувак..)
ТеМа: Cracking для новичков...

я неспорю есть много ищо нюансов...
но ето для профи..
а статя разчитана на новичков.)

Rabid Rabbit
02.08.2006, 16:19
HakNet Слы, а почему все на ачате пишут "для новичков"? Откуда такая забота о новичках=)
Ламер тот кто считает себя хакером Ага - одно из определений, на мой взгляд довольно удачное (слава богу я считаю себя програмером:) )

ProTeuS
02.08.2006, 17:58
кстать, давно бы пора (в который раз) открыть отдельный раздел низкоуровневого программирования, крякинга и реверсинга...

Rabid Rabbit
02.08.2006, 18:37
ProTeuS ну так потри с Егором да открой, кто те мешает то?

ProTeuS
03.08.2006, 18:08
Rabid Rabbit, кому как не тебе знать 4то на а4ате не все так просто?
и этот вопрос обсуждался уже не раз, и не только на самом форуме (с егоры4ем, в том 4исле)

вообще, надесю 4то в следующем сезоне этот вопрос можно будет обсуждать с новой силой, с приходом новых потенциальных заполнителей\\модеров раздела...

dinar_007
04.08.2006, 03:30
Неплохо =)

gemaglabin
04.08.2006, 03:41
кстать, давно бы пора (в который раз) открыть отдельный раздел низкоуровневого программирования, крякинга и реверсинга...

Было бы здорово только сайт и форум узконаправленной тематики

Вот собственно вопрос.Есть функция IsDebugPresent

mov eax,[fs:18h]
mov eax,[eax 30h]
movzx eax, byte ptr [eax 2]
ret

НОПить функцию не надо.Как изменить структуру PEB ?

ProTeuS
04.08.2006, 07:44
>>Было бы здорово только сайт и форум узконаправленной тематики
да, но низвоуровневое программирование и реверсинг от сетевой безопасноти неотделимы

>>НОПить функцию не надо.Как изменить структуру PEB ?

я так думаю, 4то менять всю структуру тебе не нужно, а только пропат4ить флаг отладки для заданого процесса? если я правильно понял, то:

самый простой способ - юзать HideDebugger плагин для ольки

но путем дизасминга плагина, либо поиска сабжевой инфы в гугле можно обнаружить, 4то
mov eax,[eax 30h] // загружаем адресс PEB
movzx eax, byte ptr [eax 2] // загружаем тетьий байт из нее (флаг BeingDebugged)

таким образом, 4тобы пропат4ить, нужно просто при загрузке в отлад4ик обнулить флаг BeingDebugged

ProTeuS
04.08.2006, 07:47
и еще, вот немного интересной инфы по сабжу:
http://teamx.fatal.ru/
http://www.exploit.in/forum/index.php?showtopic=2734