скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

От простого к сложному - три способа взлома на основе Audio MP3 Maker 1.12


Автор: Fess

Tools:

  • Some brains
  • TRW 2000 (Soft-Ice)
  • Win32Dasm 8.93
  • Любой hex-редактор (я использую QView)

Вступление

Как это начиналось:

Взял я компакт Hard&Soft от 04.2002 глубокомысленно изучив список еще не взломанных прог остановился на этой. Такие программы как правило не сильно защищены и сломать их не сложно.

Что за прога:

Да обычная грабилка с CD в MP3 таких сейчас навалом. Конечно красивый интерфейс и прочее. Может в ней и есть, что-то полезное, но я выбрал ее прото так. Занимает все это хозяйство в установочном архиве 1.2 Мб.

Примечание:

Господа крякеры. Кто считает себя мастером крякером или на самом деле является таковым не читайте эту статью. Да бы не выблевать только что съе- деный ужин. Статья написана для начинающих и в ней подробно разжевывается весь этап от взлома программы, до написания кейгена используя эту программу.

Начало

Итак приступим. Я не перестаю повторять: любой взлом начинается с определения типа защиты программы. Я выделяю 3 таких типа это имя-код, код, ключ-файл (отсортированы в порядке встречаемости в природе). Так же можно выделить демо, но такие программы (если программист не последний лопух) взлому не поддаются.

Что мы видим при запуске программы: за эту прогу просят 29.95 зеленых портретов американского президента. Почему не 30? Потому, что так решили менеджеры компании. Ну да мы все равно ни за что платить сегодня не будем.

Продолжаем. На появившемся диалоге три кнопки это "Buy Now", "Exit", и "Try It". Жмем "Buy Now" типа щас хочу. А он лезет в Инет. Значит пароль вводят не здесь. Жмет тогда "Try It", кнопка "Exit" не для нас, мы так просто не сдаемся.

В появившемся окне замечаем кнопку Register. О, это для нас подходит. Давим туда со всей силы. Вываливается окно с примерно таким текстом

Если бабки заплатил,
То и кодик получил,
Коли так пиши скорей
Не зевай, да не робей.

Ну мы, конечно, ничего не платили, но попробуем что-нибудь написать. Авось проге понравится и скажет что зарегистрирована. Если у Вас это получилось, то можете считать себя страшно везучим, комбинаций трилиарды. Дальше читать статью Вам не имеет смылса пакуйте чемоданы и направляй- тесь в Лас-Вегас. Если не угадали Вам написали Invalid reg code. Ну и ладно. Можете погрозить компьютеру кулаком и обругать производителей этой проги последними словами...

Успокоились? Тогда читайте дальше. Сегодня вашему вниманию будут пред- ставлены сразу три способа взлома одной проги. Один легче другого, но я для порядка их распределю так по сложности:

1) Патч (Patch)
2) Подсмотр кода
3) Кейген из этой же программы

1. Патч (Patch)

Этот способ произошел от слова Patch - что по научному значит: изме- нять. Способ известен с давнишних времен, когда грамотные индейцы стирали долотом лишние цыферки в ведомостях на каменных плитах, чтобы платить по меньше налоги.

На мой взгляд это самый простой способ взлома. Обычно для взлома та- ким способом хватает: чайной ложки мозгов, дизассемблера, hex-редактора. Этот способ я познал сам не читая никаких тьюториалов, с моей помощью Вы получите все знания необходимые для взлома прог этим способом.

Недостаток данного метода в том, что для каждой последующей версии этой программы придется заново ее ломать, а если они выходят чуть ли не каждый божий день. Хотя для сиюминутной потребности в самый раз.

Приступаем берем дизассемблер Win32Dasm и дизасмим exe-файл программы с названием amm.exe. Все завершилось хорошо, значит он не запакован exe- паковщиком. Это радует, так как проблем намного меньше.

Далее идем в секцию строк (кнопка "Strn Ref" или в меню "Refs\String Data References). Там и ищем нашу строку. Какую? Я напомню: Invalid reg code. Когда найдете два раза кликните на нее, и попадете в такой участок кода. Я пронумерую строки, а самые основные выделю цветом.


1) :0040D83F 8B1B         mov ebx, dword ptr [ebx]
2) :0040D841 8B4DE8       mov ecx, dword ptr [ebp-18]
3) :0040D844 53           push ebx
4) :0040D845 51           push ecx
5) :0040D846 E8AE9E0000   call 004176F9
6) :0040D84B 83C408       add esp, 00000008
7) :0040D84E 85C0         test eax, eax
8) :0040D850 6A00         push 00000000

* Possible StringData Ref from Data Obj ->"Message"
                                  |
9) :0040D852 68C47B4400   push 00447BC4
10):0040D857 7518         jne 0040D871

* Possible StringData Ref from Data Obj ->"Thank you, please restart programs"
                                  |
11):0040D859 68EC7D4400   push 00447DEC
12):0040D85E 8BCE         mov ecx, esi
13):0040D860 E889CE0100   call 0042A6EE
14):0040D865 8B16         mov edx, dword ptr [esi]
15):0040D867 8BCE         mov ecx, esi
16):0040D869 FF92C4000000 call dword ptr [edx+000000C4]
17):0040D86F EB37         jmp 0040D8A8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D857(C)
* Possible StringData Ref from Data Obj ->"Invalid reg code"
                                  |
18):0040D871 68D87D4400   push 00447DD8
19):0040D876 8BCE         mov ecx, esi
20):0040D878 E871CE0100   call 0042A6EE
21):0040D87D EB29         jmp 0040D8A8

Наша строка в 18, а чуть повыше строка 11 только с обратным сообще- нием, о том, что программа зарегистрирована. Значит должна быть проверка а после нее переход. Между строками 17 и 18 написан адрес откуда идет переход на строку 18. Перейдя на указанную там строку оказываемся на строке 10. Переход jne означает, что переход если не равно. Эта команда одно и тоже, что и команда jnz (переход если не 0). Так что не удивляй- тесь, если в своем hex-редакторе увидите jnz вместо jne поторяю это одно и тоже. Смотрим чуть повыше и видим команду сравнения test eax,eax. Меня (в бытность мою начинающим крякером) удивляло, как может осуществляться сравнение строк этой командой. Эта команда, как оказалось вовсе и не сравнивает строки, а устанавливает флаг нуля (флаг Z), который может принимать два значения 1 или 0. Если 1 переход осуществляется у команды je (jz), если равно (если ноль). Если же 0 переход осуществляется у команд jne (jnz), которые мы рассматривали. Сравнение же идет в процеду- ре перед этой командой, которая возвращает в eax 0, если строки не равны и 1 в противном случае. test аналогична команде and с тем условием, что and изменяет сами регистры, а test флаг нуля. У команды test eax,eax флаг нуля будет выставляться в том случае, когда eax<>0.

У Вас может возникнуть вопрос, что же сравнивает команда call стоя- щая по номером 5. Это может быть правильный код и наш введенный код (обчно так и бывает) или сгенерированные контрольные суммы у нашего кода и нашего имени. Самый простой способ это узнать используя отладчик. Но нас это пока не интересует.

Первое, что приходит на ум изменить jne на обратный переход je. Это самое простое, но увы, не всегда верное. Обращение к процедуре сравнения может идти из разных частей программы. В итоге выполучите, то что прога напишет вам, что вы зарегистрированы. Но при перезапуске программы все повторится снова. Можно, конечно, найти все вызовы этой функции и после них переправить все переходы. Мы же применим другой метод, т.е. в самой процедуре сравнения сделаем так, чтобы она всегда возвращала 1, т.е. что сравниваемые строки всегда равны.

Делаем следующее заходим в процедуру, это можно сделать, поставив курсор на процедуру (у нас это номер 5) и нажав кнопку call. Вернуться обратно можно с помощью кнопки ret. После того как мы туда зайдем, по- смотрим чуть повыше, откуда же вызывается эта функция? Ооо.. много. Вот поэтому менять переход после процедуры не хорошо. Можно сделать просто, а можно наверняка.

1) Простой вариант Сразу после входа в процедуру ставим команду ret, т.е. выход из процедуры, эффект основан на том, что при входе в процедуру eax не будет равно 0. Вероятность этого 98,2%.

2) Стопудовый вариант Сразу после входа в процедуру пишем такие команды.


xor eax,eax
inc eax
ret

Как это сделать. Я буду описывать как это сделать с помощью QView, в принципе его использование аналогично использованию Hiew, так что я ду- маю это сработает и для него.

Приступим.

1) Записываем байты, с которых начинается процедура, обычно достаточно 9 главное, чтобы такой кусок кода встречался в программе один единствен ный раз. У нас это: 55 8B EC 83 3D 3C C8 4400005356.

2) Закрываем Win32Dasm, т.к. Windows производит разделение доступа к фай- лам, и если вы его не закроете, то не сможете в него записать. Рекомендую так же перед этим сохранить проэкт файла, т.к. в случае чего его открыть будет намного быстрей, чем еще раз дизассемблировать.

3) Копируем файл qview.exe в каталог с программой.

4) Создаем резервную копию изменяемого файла.

5) Пишем команду qview.exe <имя-изменяемого-файла> У нас будет такая команда: qview.exe amm.exe.

6) Два раза нажимаем F4, чтобы перейти к ассемблерному коду.

7) Один раз нажимаем F2, чтобы перейти к 32-битному режиму.

8) Нажимаем F7 и вписываем в hex-поиск предварительно записанные байтики. Жмем Enter.

9) Нажимаем Shift-F7 для повтора поиска, если больше совпадений нет, то начинаем изменять, иначе выписываем еще несколько байтов и повторяем поиск

10) Нашлась одна, теперь нажимаем Tab и начинаем писать команды. У нас строка нашлась на 176F9. Пишем написанные выше команды, после каждой нажимаем Enter.

11) Нажимаем Esc. И в ответ на предложение сохраниться нажимаем "W".

Запускаем программу, выскакивает сообщение об ошибке. Черт, значит мы ошиблись это просто процедура сравнения строк и она используется, не толь- ко для сравнения пароля. Как же нам быть? Я думаю так: посмотрим еще раз на участок кода с 3 по 10. Значит так в стек заносятся параметры ebx и ecx что-то подобное вероянее всего будет и при следующих проверках. Нажимаем поиск и вводим call 004176F9. Ищем до того момента, когда командой push в стек будут заносится регистры общего назначения (оканчивающиеся на ..x ). Ищем пока не натыкаемся на следующий участок кода.


:00404FD0 8B4DE4     mov ecx, dword ptr [ebp-1C]
:00404FD3 8B55DC     mov edx, dword ptr [ebp-24]
:00404FD6 51         push ecx
:00404FD7 52         push edx
:00404FD8 E81C270100 call 004176F9
:00404FDD 83C408     add esp, 00000008
:00404FE0 8D4DDC     lea ecx, dword ptr [ebp-24]
:00404FE3 85C0       test eax, eax
:00404FE5 0F94C0     sete al
:00404FE8 25FF000000 and eax, 000000FF
:00404FED 885DFC     mov byte ptr [ebp-04], bl

Больше таких участков не встречается, значит проверка одна. Что нам это дает? Значит изменив переход здесь мы получим полноценный вариант програм- мы. Перед повторным изменением, не забудьте восстановить из копии рабочий вариант программы. "А где же здесь переход?" - спросите Вы. А я Вам отвечу нету его здесь. Здесь переход заменен на команду sete al, она устанавлива- ет al=1, если результат последней проверки истина. Последней проверкой и будет наше сравнение. Сделаем так, чтобы в al всегда была 1. Делается это элементарно. Мы видим, что команда sete al занимает 3 байта это 0F94C0. А команды


xor eax,eax   - 31C0
inc eax         40

Тоже ровно 3 байта получается полноценный замен. Раз все получается, за- меняем! Надеюсь Вас не надо учить пользоваться hex-редактором?

Запускаем программу и что же мы видим?.. Nag-screen пропал, все работает просто отлично. Покажем всем друзьям какой Вы КулХацкер. И начнем дальней- шее обучение по методу дядюшки Fess'a.

2. Подсмотр кода

Подсмотр кода. Этот метод появился на заре цивилизации с появлением рыбаков, которые, если у другого ловится, а у них нет начинают вынюхивать, почему так происходит. Подсмотрев за другим рыбаком, они используют его методу и у них тоже начинает клевать. К сожалению, рыбаки народ особый и не очень-то любит расставаться со своими секретами, поэтому приходится прибегать к хитрым средствам,таким как: дерево, заросли и самое надежное - бутылка водки.

У нас этой бутылкой станет отладчик TRW 2000. Можно было бы использо- вать и старый проверенный Soft-Ice. Но мне было в лом перезагружаться, де- лов то, на 5 секунд. Я немного ошибся, надо было этот способ сделать пер- вым по простоте, ну уж ладно.

Помните, что я Вам говорил в 1 части про патч, показывая вот этот кусок кода. После выполнения команд 1 и 2 в регистрах ebx и ecx находятся две строки. А что за строки предстоит узнать Вам вооружившись отладчиком. !!!! Не забудьте восстановить файл из резервной копии, проверять, то надо на настоящем файле.


1) :0040D83F 8B1B         mov ebx, dword ptr [ebx]
2) :0040D841 8B4DE8       mov ecx, dword ptr [ebp-18]
3) :0040D844 53           push ebx
4) :0040D845 51           push ecx
5) :0040D846 E8AE9E0000   call 004176F9
6) :0040D84B 83C408       add esp, 00000008

Вообщем, грузим файл в TRW 2000. Нажимаем Load и вываливаемся в точке входа в файл. Что за точка и по какому адресу нас не колышет и мы с усерди- ем на лице ставим бряк на адрес 40D844 командой bpx 40D844. Т.е. сразу пос- ле того как адреса окажутся в ebx и ecx. Запускаем программу (кнопка F5). Идем в до боли знакомый пункт регистрации набираем свое имя и любой пароль. Я обычно набираю Name: Fess, Code: 110022334455. (такую строку искать в па- мяти легко). Жмем кнопку ЗАРЕГИТЬ МЕНЯ КАК СВЯТОГО КОНЯ и вываливаемся в окно TRW. Как раз на команде под номером 3. Теперь можно посмотреть, а что у нас в памяти по этим адресам. Пишем команду d ebx и видим в окне данных введенный Вами код. А что по другому адресу? Набираем команду: d ecx и в окне данных видим преинтереснейшее число. И тут из глубины души зараждается мысль, что это и есть тот самый настоящий код. Хватаем ручку и быстро чер- каем на любом огрызке бумаги этот код. Посмотрели какой он длинный можете подсчитать каким везением надо обладать, чтобы угадать ТАКОЕ! Теперь вводим подсмотренный нами код. И программа в агонии от радости, что вы ее купили. Хе-хе-хе как бы не так. Просто не правда ли? Таких программ становится все больше. Начинающим крякерам это очень нра- вится теперь можно перед всеми хвастаться настоящим реальным кодом да еще на свое имя, а если еще распечатать регистрационную анкету. То вообще все поверят, что вы ее купили.

3. Кейген из этой же программы

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

Создать кейген на основе имеющейся программы достаточно просто, если в ней заложен принцип сравнения правильного и неправильного кода. Этот метод является совокупностью первого и второго. Еще раз взглянем на этот отрывок:


3) :0040D844 53           push ebx
4) :0040D845 51           push ecx
5) :0040D846 E8AE9E0000   call 004176F9
6) :0040D84B 83C408       add esp, 00000008
7) :0040D84E 85C0         test eax, eax
8) :0040D850 6A00         push 00000000

* Possible StringData Ref from Data Obj ->"Message"
                                  |
9) :0040D852  68C47B4400   push 00447BC4
10):0040D857  7518         jne 0040D871

Чем является в данном контексте слово "Message". Оно является заголовком окна при правильной и неправильной регистрации. Так? Так вот, а что если нам слово "Message" заменить правильным регистрационным кодом. Каково, а? Делается это просто элементарно просто. Надо Push " Message" заменить на Push правильный регистрационный номер. Т.е. push 00447BC4 на push ebx. Пос- кольку push на эту строку единственный, то строка его индитификационных байтов единственная. Посмотрим ищем hex строку 68C47B4400. А нет, не едист- венная, их две. Добавим еще один байт 75, теперь одна. Теперь ее надо заме- нить на строку push ebx, а его код 53 остается 4 лишних байта. Для того, чтобы программа могла нормально работать, их надо забить nop'ами, т.е. пу- стыми операторами. Код у nop'a 90. Т.е. надо заменить строку 68C47B4400 на 5390909090. Теперь даже если Вы напишите неправильный код программа выдаст вам правильный в заголовке.

Она выводит Ваш пароль вместо нормального? Так и есть это я недосмотрел. Просто после выполнения процедуры ecx и ebx приравниваются, а пароль нахо- дится в edx. Так что вместо 53, надо написать 52 и все заработает. Надеюсь.

К сведению, удалить информацию о предыдущей регистрации можно, удалив файл keyinfo.key из каталога программы

Теперь вы можете показать всем какой вы Хацкер, снабдив их все кодами со своими именами.

Так же можите поробовать записать вместо текста "Invalid reg code" тоже этот же пароль. Это будет Вашим домашним заданием. Сделав которое, Вы пой- мете, что нет на свете вещи интересней, чем ломание прог.

Послесловие

Хочу выразить огромную благодарность авторам за предоставленный продукт, побольше бы таких продуктов и их программы, вообще, перестали бы покупать.

Люди читающие эту статью! Мир не без добрых людей, если Вам понравилась эта программа купите ее, поддержите финансами развивающуюся отрасль.

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

"Кряк это отражение морали и духа крэкера в единице письменного, ибо иначе это сводит на нет его усилия." (Fess)

Все ругательства отправлять в null
Все остальное на lomovskih@yandex.ru

P.S. Запомните все материалы публикуются только в учебных целях и автор за их использование ответственности не несет!!

P.P.S. Возможно имеют место опечатки, заранее извините!

With best wishes Fess

И да пребудет с вами великий дух bad-сектора.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook