::: Cracking Part I: Begin & Crack Animagic GIF Animator v1.10 :::


Привет о любители байтов, битов и прочей размерности =). Сейчас я вас посвящу в основу крякерства и даже приведу свой пример для большего интереса =) !
Начнём как всегда с основ ассемблера, нужных нам для взлома программ! Любую программу можно взломать! Это факт! А тот, кто скажет обратное..тому я помочь не могу =). Программы ломают 2 способами: непосредственным хирургическим вмешательством и косвенным вмешательством (т.е. используя разного вида RealTime программ, которые работают с памятью...такие как SoftIce)! Итак...будем разбираться!
Начнём с первого метода (люблю я его =): хирургическое вмешательство. Изначальная зацепка крякера - это так называемые "Nag экраны"/Диалоговые окна и т.д. (т.е. те, что постоянно направляют нас на путь истиный: говорят нам зарегистрироваться/выдают ошибку при неправильной регистрации и т.д.). В приложениях для виндовс эти Nag экраны/диалоговые окна и т.д. можно вызвать многими способами, но мы будем разбирать простые примеры! Но пока нам не важно то, как вызывается этот "экран"..нам нужна надпись, которая содержится в нём, т.к. все изначально заложенные в прогу "тексты" сохраняются в чистом виде! Такой же принцип и в приложениях разработанных под ДОС! Т.е. если нам показали при регистрации проги "Invalid password or username!", то данный текст заложен в екзешник/в ресурс (его вообще можно куда угодно запихнуть =) ! Итак..со всякими окошками мы разобрались...Они используются практически везде: при регистрации, триальной версии и т.д. Т.е. это первое на что обращает внимание взломщик! Допустим мы решили сломать прогу...чтоб она нас зарегистрировала нелегально. Для этого нам надо найти место в программе, где происходит некая проверка на "зарегистрированность"..а для этого нам для удобства надо за что-то зацепиться: за текст "о неправильно введённом пароле". Мы загружаем прогу в дизассемблер и апосля пытаемся найти этот текст! После чего легко найти адрес, откуда идёт вызов данного текста...и после этого уже ломануть прогу, изменив байты так, чтоб эта надпись не появлялась...т.е. сделать так...что при очередной проверке на "зарегистрированность" результат был всегда положительным! Проверка, если рассуждать логически...должна быть перед улётом в облом! И тут начинается недоумением у большинства читателей...и тут я начинаю читать краткий курс ассемблера! В ассемблере существует такой оператор сравнения, как cmp ,, который сравнивает 2 значения...какие именно типы данных с какими можно сравнивать я объяснять не буду...скажу лишь только то, что при сравнении устанавливаются соответствующие флаги какие именно..узнаете позже...После сравнения логично будет сразу сделать условный/неусловный переход. Условный переход - это переход в другую область памяти (или с точки зрения языка ассемблера..переход на определённую метку), учитывая результат сравнения! Соответственно безусловный переход - переход, на который не влияет результат сравнения! Оператор такого перехода - jmp <метка>! Давайте теперь вкратце разберём операторы условного перехода (для начала я хочу отметить следующее значение буковок в операторах условного перехода: e - равно, n - отрицание, g - больше, l - меньше, a - меньше, b - больше (a и b используются для беззнаковых чисел)): 1) Для чисел без знака... je - если op1=op2 (что такое op1 и op2 ты увидишь выше...как наткнёшься на оператор cmp), zf (ZeroFlag..надеюсь сможете перевести..это как раз и есть один из флагов =)=1; jne - если op1<>op2, zf=0; 2) Для чисел со знаком jl/jnge - если op1<>of; jle/jng - op1<=op2, sf<>of, zf=1; jg/jnle op1>op2, sf=of, zf=0; jge/jnl - op1>=op2, sf=of; 3) Для чисел без знака... jb/jnae - op1<="op2," jna jbe>op2, cf=zf=0; jae/jnb - op1>=op2, cf=0; 4) А так же... jz - zf=0; js - sf=1; jc - cf=1; jo - of=1; jp - pf=1; 5) А ещё есть и такое... jcxz - cx=0 (ax,bx,cx,dx - базовые регистры). Воо...теперь мы уже знаем что это за звери такие и для чего они нужны! Теперь нам ничто не стоит при сравнении...сделать либо безусловный переход либо просто сделать финг рогами и воспользоваться командой nop (0x90), которая предназначена для того, чтобы делать задержку в программе...для медленных процессоров (т.е. банальный пропуск байта). Т.е. если рассматривать наш пример (не забыли ещё...о чём мы говорили =)?)..где у нас было сравнение чего-то там...и если результат такой-то то прыгаем на наш Nag screen...т.е. нам надо вставить 2 команды nop (т.к. оператор перехода занимает 2 байта), чтобы не прыгать на этот экран и тем самым зарегистрировать себя в программе! Но увы...нынче такая тупая защита встречается редко! Почему? Потому! Такая защита эквивалентна следующему коду на вусокоуровневом языке (допустим на паскале):
if op1<>inttohex(bb,4) then begin
showmessage('You are not registered! Register please...');
close;
end;
showmessage('You are registered!');
Данную прогу легко можно сломать таким способом, который я объяснил выше...можете сами попробовать!
Итак.. такую защиту как Nag screen мы разобрали...теперь давайте немножко углубимся =). А точнее разберём задачку потруднее: если у нас не банальное сравнение, а какое-то мудрённое...где такой замены байт не достаточно...и нужно ещё как-то получить нужные программе результаты. Вызов подпрограмм происходит при помощи команды call <подпрограмма/смещение/операнд>. Подпрограмма делает какие-то действия. Код подпрограмм можно переписать 2 способами: тупо и хитро. Тупо - это переписать подпрограмму целиком...хитро - это хитро =)..т.е. подправить что-нить в подпрограмме... Кроме подпрограмм так же есть всякие манипуляции с флажками...типа xor,or,and,test и т.д. что они делают я говорить не буду...если надо сами узнаете! =) Теперь мы знаем основы взлома программ хирургическим методом...стоит ещё просто перечислить другие методы хирургического вмешательства: дешифровка тела программы, вскрытие и анализ ресурсов и прочие...Я их описывать не буду..
Что касается второго метода взлома программ: косвенным методом (тот что в режиме RealTime =)...не забыли?), то тут все попроще...хотя это относительно! Ибо всё равно нужны знания ассемблера =)! Для такого вида взлома советую всеми рекомендуемый SoftIce...программка работает непосредственно с памятью сис-мы! Что это нам даёт? Допустим вы не смогли справиться с прогой первым методом (руки трясутся..скальпель тупой =))...тогда стоит попробовать организовать перехват! Что это такое и что для этого нужно? Перехват или breakpoint (точка прерыва) позволяет прервать выполнение программы в определённом месте! Как узнать где именно надо прерывать программу? А вот для этого-то как раз надо знать разные функции и процедуры ОС. В инете вы можете найти огромные списки всякого рода процедур и функций...Например, прога кидается Nag Screen'ом (к примеру, диалоговым окном)..тогда следует поставить в SoftIce такие bp (breakpoints) на функции: GetWindowText, GetWindowTextA, GetDlgItemText, WM_GETTEXT ну и т.д. И если nag screen вызывается имеено той функцией, на которую вы поставили точку прерывания...то выполнение программы прервётся и появится SoftIce, который сообщит из какой области памяти куда..что и как...т.е. нужную нам инфу! Т.е. узнаем в какой области памяти сидит функция и где происходит вызов....Это нам может пригодиться при поиске в памяти, к примеру, то значение которое мы ввели при регистрации...Зачем? +)) Потому что встречаются такие программки и довольно таки не редко, которые генерят пароль в какой-то функции...и соответственно этот сгенеренный пароль сохраняется в памяти...что даёт вероятность того, что мы просто напросто увидим уже приготовленный для нас пароль для нашего имени и организации, если есть такой пункт в регистрационной форме...А чтоб узнать где в памяти сидит сгенеринный пароль, который сравнивается с тем, что мы ввели от балды....нужно сообщить SoftIce'у, чтоб он в таком-то диапозоне при очередной регистрации нашёл введённый нами пароль...и потом в окрестности этого адресав памяти...порыскать что-нить интригующее =). Вот пожалуй и всё об этом методе! Информацию по SoftIce'у можно прочитать везде!
Теперь непосредственно о реальном взломе популярной программы, которая называется Animagic GIF 32bit v1.10 и позволяет создавать анимированные картинки!
Было это одним..непомню каким..днём! Я от скуки рисовал что-то... Всё бы ничего, если бы кто-нить удосужился крякнуть программку и на пиратский сидюк выложить кряк. А постоянная надпись о незарегистрированной версии меня уже порядком достала =). Я запустил прогу и появилось окошечко, которое так надоело уже мне...я нажал на кнопку регистрации и после этого мне предложили ввести юзернэйм и пароль. Я заполнил поля от балды и нажал "ок". Мне показали фигу...и я эту фигу запомнил....Фраза была что-то типа.."Password is incorect..." я запустил интерактивный дизассемблер IDA, который всем советую из-за своих полезных функций =)... И нашёл там строку о неправильно заполненной форме...и нашёл тот адрес, откуда было это вызвано...после чего решил надурнячка заменить условный переход на безусловный...и в результате ничего не вышло...т.е. заполняю форму...жму "Ёк"..мне показывают..что мол вы зарегины...а на самом деле это не так...т.к. в рубрике абоут...написано попрежнему анрегистред..После этого я опять вернулся к IDA и начал анализировать процедуру, которая вызывается перед сравнением...она оказалась довольно таки сильно разветвлёной...и мне пришлось 15-30 минут изучать каждый блок...и вот наконец я заметил закономерность...что большенство ссылок ведут к обнулению регистра ax: xor ax,ax - своеобразное обнуление...а сравнение после процедуры шло таким макаром: cmp al,1 - сравнение младшего байта регистра ax с 1. Т.е. уже и так понятно, что обнулять регистр ax нам никак не надо...и я просто напросто занопил это обнуление...после чего, когда при регистрации я жал "ОК"..программа меня регистрировала =)). После этого я написал кряк и теперь он доступен каждому...
Вот пожалуй и всё! Удачного кряка =) !

AcidFalz


[an error occurred while processing this directive]