!!!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 Комментарий указывает на то, чо в следующей команде происходит обращение к нужной строке- 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, которой через стек передаются два параметра: :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 Взял из журнала хакер тока не помню какой номер.. Пока всё..) Продолжения скоро будет..)))
1. Адрес сайта оли - , а не www.ollsbg.de, как ты написал. 2. Да и меня смущает то как ты писал =).. Начало абсоютно безграмотно (грамматически), потом всё отлично... Ну это неважно ) 3. Первый крякми фантома может крякнуть любой человек умеющий читать ), ты бы хоть про второй написал ) 4. . - 100% что я уже где-то это видел ) [добавлено позже] Вот откуда растут ноги у этой статьи ) http://www.xakep.ru/magazine/xa/080/070/1.asp Как я и предполагал...
Все крякмисы от Fantom'a + тутор от меня(BUG(O)R). WxProtect_CrackMe TimeCOP NoName CrackMe's Crackme#13_By_Detten Читать тут: http://hunger.ru/debug
шестезначном - шестнадцатеричном (это ж тебе не аська) почему за адресом 00401296 следует адрес 004001299 (по идеи ты должен был скопировать это из дизасемблера) cnp eax, 00000000 - cmp eax, 00000000 (нет такой команды cnp) Если кодишь на asm'e, эти ошибки сложно незаметить, их даже сложно допустить, не говоря о том, что ты должен был это хотябы проверить, перед списыванием. Ну ладно, оформление хорошее, смысл направлен на обучение начинающих крякеров. +
CodePimps e-zine issue #5 статья 0x05 Введениe в реверс инжиниринг by Zool разобраны все crackmes`ы FaNt0m’a.. смотрим здесь.. весь номер тут.. здесь еще один кракми http://ct757.net.ru/misc.html
nerezus проще диск от краклаб купить всего 300р зато там ВСЕ ----- и в журнале хакер это тоже писали =))) --------- кстати был даже хакер спец в котором ВСЕ про крекинг писали =))
Начало на ссылка Продолжение. ###Убираем наги.### Наг- это назойливое окошко, которое присуще любой триальной программе. Смысл окошка- напомнить пользователю о том, что програмисты тожелюблять кушать, поэтому покупка програмы была бы очень кстати. Общий принцип таков. Во время запуска приложения , осуществляется простая проверка- заригистрированая ли програма или нет. Индикацией того, что приложение зарегистрировано, может быть наличие некоторого файла, ключа реестра или, что более вероятно, что прога уже зарегистрирована, то никакого наг-окна не выводится, и программа продолжает обычную работу. В противном случае управление передается прочедуре, которая выводит наг на екран и в большинстве случаев требуетнажать клавиши для продолжения работы. Как правило убрать наг-окно не представляет труда, в этом можнолегко убедиться на примере FaNt0ms CrackMe #2.После запуска проги пользователя одаривают не один, а сразу двумя наг-окошками, но задача от этого практически не усложняеися. к сожалению, взможность негистрации не предусмотрена, поэтому единствинное, что остается сделать, - это вручную убрать из кода левые фрагменты програмы. Или точнее говоря, вызовы процедур, выводящих на экран эти назойливые сообщения. В принципе это можно сделать с помощью дизассамблера и НЕХ-редактора, но удобнее и уместнее все-такм использовать отладчик (или и то, и другое одновременно) - скоро ты в этом убедишся. Итак, запускаю OllyDBG, а с помощью меню отрой файл CrackMe2.exe. В принципе, найти нужный фрагмент кода, содержащий вызовы левых процедур, можно по описаному ранее алгоритму в(часть №1).Для етого нужно кликнуть правой мыши в окне с ассемблерным кодом. и в контекстном меню выбрать пункт Search for -> All referenced text string. В появившемся списке ты срвзу же увидишь текст сообщения выводимый в окне нага, а двойным кликом сможешь перейти туда, где н используется. Но мы пойдем по другоу пити и изучим еще один ключевой пример, которой активно используеться во время взлома программ. Если ты уж когда-то пробовал ломать програмы, то наверняка, слышал о так называемых брейкпоинтах (breakpoints).Брейкпоинт - это место останова програмы, то есть точка, в которой программа приостанавливает свое выполнение и указывает адрес текущей команды в отладике. Использовать ето черезвычайно полезный прием очень просто. Нам уже извесно что, небольшое окошко с сообщением легко может бытьвыведено на экран с помщью функции MessageBoxA. Теперь все, что от нас требуется - установить точку останова на вызове этой функции, а после остановки программы всего лишь вырезать из кода ее вызов. Попробуем.?) Если правильно установил OllyDBG и подключил чрезвычайно полезный плагин CommandBar, то в нижней части экрана должно светиться окно для ввода команды. Введем команду для установки точки останова на вызове функции MessageBoxA: bpx MessageBoxA. Правильност установки брейкпойнта можно проверитьв окне Breakpoints (меню View-> Breakpoints). Там же его можно на время деактивизировать, или вовсе удалить.
Далее необходимо запустить программу из отладчика для этого нажми клавишу 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. Всё..)..
Супротив граматнасти ниче протев не емею, но емей совисть, пеши хатябы "ассемблер" правильна. Родной язык машины заслуживает того чтобы его название писали правильно, в отличие от васиков, сей, пырлов, дэбльфей и проч=) Без коментариеф. . ---------------------- А воще статья довольно примитивная. Реальные защиты далеко не так примитивны. 1) можно обойтись без мессадж боксов, зарегив класс окна и назначив ему простенькую оконную процедурку на выньапи 2) можно сделать сплайсинг в АПИ МесаджБоксА 3) можно замаскировать саму проверку: соотв. CMP будет не так то просто обнаружить если в случ неудачной проверки запустить поток который подождав пару сек вызовет МессаджБоксА (или еще свое окно как наприм. сделано в выньраре). 4) еще один поток может висеть в это время в памяти и периодически проверять чексум критического участка кода, причем этот поток можно даже внедрить (такое дело токма в хрюхе но всерано) в совершенно левый процесс (напр в эксплорер.ехе). Ессесно вылет произойдет даже тогда когда в этот код просто поставить точку останова (int 3), что обычно и делает дебагер. 5)Как вариант такую проверку может осуществлять совершенно безобидная на первый взгляд АПИ-функция, которую ессесно перехватили. Трассировка перехваченных АПИ функций геморойное дело. Например если это была инъекция (или первые 6 байт меняются) то поставив туда точку останова мы или вылетим нах из отладчика или уйдем лесом (в зависимости от варианта реализации и самого отладчика). 6) динамическая шифрация/расшифрация очень затруднит фикс проги, даже если в памяти мы его успешно крякнули. 7) методов ухода из-под дыбугера (валом) ну и так дальше. просто влом писать все методы постановки палок в колеса кракерам. их очень много.
Чувак..) ТеМа: Cracking для новичков... я неспорю есть много ищо нюансов... но ето для профи.. а статя разчитана на новичков.)
HakNet Слы, а почему все на ачате пишут "для новичков"? Откуда такая забота о новичках=) Ламер тот кто считает себя хакером Ага - одно из определений, на мой взгляд довольно удачное (слава богу я считаю себя програмером )
кстать, давно бы пора (в который раз) открыть отдельный раздел низкоуровневого программирования, крякинга и реверсинга...