скрыть

скрыть

  Форум  

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

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



Google  
 

Кейген для Wave Flow 4.1


Автор: Fess

Забрел как-то компьютерный вирус на зеркальный винчестер, посмотрел на свое отражение и с грустью сказал: "Сон разума рождает уродов."

Target: Wave Flow 4.1

Tools:

  • Some brains
  • TRW2000/Soft-Ice
  • Win32Dasm 8.93
  • Pascal

Все, кроме мозгов, можно найти на www.exetools.com

Вступление

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

Был обычный серый вечер, на часы в гостинной показывали 21:40. До фильма оставался ровно час и я решил заняться делом: что-нибудь поломать. Первым попавшимся под руку диском с шароварой оказался Hard&Soft 9.2001. На нем я обнаружил несколько не ломанных мной ранее программ. Среди них была и Wave Flow 4.1. Установил все как обычно.

Что за прога:

Какой-то звуковой редактор, функций мало, да, я особо не проверял - меня интересовала другая сторона этого дела. В архиве занимает около метра. Написана на Dephi это можно узнать, посмотрев ресурсы. Требования минимальные, так что приступаем.

Начало

Что же мы будем сегодня делать? А сделаем мы два кейгена: один на основе самой проги, второй на Паскале (Вы его не знаете? Тогда учите быстрей)

Проги на Дельфях проще ломать с помощью SoftIce, то мы и делаем. Запускаем прогу, нажимаем на кнопочки Register и Enter Passowrd. Вводим любое имя и код, код лучше взять такой, чтобы точно не встречался в памяти, я беру всегда такой 110022334455. Ну, а имя Fess. Нажимаем Ctrl+Dи вываливаемся в айсе, пишем команду s 0 l -1 "110022334455". Команда означает, что нужно искать строку "1100.." во всей памяти. Она как ни странно нашлась :). Адрес памяти должен начинаться с 8. Ставим бряк на этот адрес командой bpmb адрес rw. Где вместо адрес вписываем ваш адрес. Вводим. Выходим из айса по кнопке F5 или Ctrl+D. Нажимаем Ok и вываливаемся в айсе. Раз восемь делаем F12, пока не дойдем до такого блока команд.


:00472451 8B45F0       mov eax, dword ptr [ebp-10]
:00472454 50           push eax
:00472455 8D55EC       lea edx, dword ptr [ebp-14]
:00472458 8B45FC       mov eax, dword ptr [ebp-04]
:0047245B 8B80D4020000 mov eax, dword ptr [eax+000002D4]
:00472461 E886E5FBFF   call 004309EC
:00472466 8B45EC       mov eax, dword ptr [ebp-14]
:00472469 8D55F4       lea edx, dword ptr [ebp-0C]
:0047246C E8E3040000   call 00472954
:00472471 8B55F4       mov edx, dword ptr [ebp-0C]
:00472474 58           pop eax
:00472475 E8D21AF9FF   call 00403F4C
:0047247A 0F85C8010000 jne 00472648

Проходим первую строку, набираем команду d eax. И мы видим введенный код. Идем дальше по F10, проверяя изменяющиеся адреса. По адресу указанному в edx, после прохода выделенной строки мы видим, какую-то строку цыфирек. Это наводит на мысль о том, что это настоящий код. Так и есть, если вам просто нужно сломать, то можете паковать вещи, а я продолжу. Код мы узнали, но как быть, если у Вас сотня друзей, у которых еще по сотне и все хотят зарегить прогу на свое имя. Можно, конечно, поставить бряк на эту строку и каждому выдавать код. А можете сбатцать кейген и давать его всем и пусть нагенерят себе кодов сколько надо. И Вы сможете потратить свое время более логично.

Скорее всего код генерится в процедуре по адресу 47246C. Потому что, если посмотреть на две строчки перед ней, то ясно видно как ей передается в eax наше введенное имя. Значит смотрим в процедуру и пытаемся разобраться в ее назначении. Я, конечно, прокомментирую этот код, но вы попробуйте сами разобраться в его назначении в отладчике.


:00472954 55          push ebp
(...выброшена часть ненужно кода)
:00472981 8B45FC      mov eax, dword ptr [ebp-04] < Адрес на имя
:00472984 E8B314F9FF  call 00403E3C  < Проверка длинны имени, результат в eax
:00472989 85C0        test eax, eax  < Проверка длинны
:0047298B 7E13        jle 004729A0   < Если длинна = 0, то гуляй Вася
:0047298D BA01000000  mov edx, 00000001  < Счетчик на 1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047299E(C)
|
:00472992 8B4DFC     mov ecx, dword ptr [ebp-04]  < Берем адрес на введенное имя

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047291F(C)
|
:00472995 0FB64C11FF movzx ecx, byte ptr [ecx+edx-01] < Берем символ имени в зависимости от счетчика
:0047299A 03D9       add ebx, ecx                     < Добавляем к сумме (ebx) код символа
                                                      \ В начале ebx=0
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047292E(C)
|
:0047299C 42         inc edx   < Увеличиваем счетчик
:0047299D 48         dec eax   < Убавляем от длинны имени один
:0047299E 75F2       jne 00472992 < Пока в eax не ноль переход работает

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0047298B(C)
|
:004729A0 895DF8     mov dword ptr [ebp-08], ebx   < Сохраняем сумму

Далее идут команды сопроцессора (префикс f). Для их понимания желательно иметь книжку с описание команд процессора, у меня это В. Юров "Ассемблер. Специальный справочник". В принципе это можно достать с сайта интела www.intel.com, но там на англицком, а мене русский ближе. Я в кратце объясню, что делает блок кода до 4729B3. Берем сумму из кодов символов имени и умножаем это на 0.8 результат в eax. Честно признаюсь, что в начале забыл про книжку и нашел это опытным путем (методом профессионального тыка).


:004729A3 DB45F8     fild dword ptr [ebp-08] < Преобразование операнда в целочисленном формате
                                              \ в вещественный
:004729A6 DB2DF8294700 fld tbyte ptr [004729F8] < Загрузка в стек вещественного значения (0.8)
:004729AC DEC9       fmulp st(1), st(0)  < Умножаем сумму на 0.8, результат в стеке
:004729AE E87100F9FF call 00402A24
  [начало процедуры
  [:00402A24 83EC08  sub esp, 00000008
  [:00402A27 DF3C24  fistp qword ptr [esp] < Результат в вершину стека
  [:00402A2A 9B      wait
  [:00402A2B 58      pop eax < Берем результат из стека в eax
  [:00402A2C 5A      pop edx
  [:00402A2D C3      ret
  [конец процедуры
:004729B3 F7E8       imul eax  < Умножаем eax на eax, т.е. возводим eax во вторую степень
:004729B5 8BF8       mov edi, eax  < Переносим eax в edi
:004729B7 8B45FC     mov eax, dword ptr [ebp-04] < В eax адрес памяти указывающий на имя
:004729BA E87D14F9FF call 00403E3C < В eax возвращается длинна имени
:004729BF 03C0       add eax, eax  < eax=eax+eax или eax=eax*2
:004729C1 03D8       add ebx, eax  < Прибавляем к сумме длинну умноженную на 2
:004729C3 8BC3       mov eax, ebx  < eax=ebx
:004729C5 03C0       add eax, eax  < eax=eax+eax
:004729C7 03F8       add edi, eax  < Прибавляем ко всему этому (eax)
                                   \сумму умноженную на 0.8 во второй степени (edi)
:004729C9 8BC7       mov eax, edi  < eax=edi
:004729CB 8BD6       mov edx, esi  < В edx адрес памяти куда запишется правильный код
:004729CD E8EE5AF9FF call 004084C0 < Преобразуем полученное (eax) в строку десятичных символов,
                                   \ которая является правильным кодом

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


PROGRAM KeyGen;{Keygen for WaveFlow 4.1}
Uses Crt; {Заявляем об использовании модуля Crt}
Var        {Блок объявления переменных}
 S:String;
 N:LongInt;
 B:Byte;
Begin      {Начало программы}
  ClrScr;  {Очищаем экран}
  WriteLn('KeyGen For WaveFlow 4.1 by Fess [PTDS] URL: vallkor.chat.ru');
     {Выводим строку, типа сбацал я}
  WriteLn; {Пропускаем строку}
  Write('Enter name: '); {Просим ввести имя}
  ReadLn(S);  {Берем имя в переменную S}
  N:=0; {Присваиваем сумме начальное значение 0}
  For B:=1 to Length(S) Do N:=N+Ord(S[B]); {Считаем сумму кодов имени}
  N:=SQR(Round(N*0.8) {Сумму умножаем на 0.8 и возводим во вторую степень}
     + (N + Length(S)*2)*2 ); {Прибавляем к сумме длинну умноженную на 2 и все это умножаем на 2}
  Write('Your Key: ',N); {Выводим получившийся код}
  If readkey=#0 then;   {Ждем нажатия на любую клавишу}
End.       {Конец программы}

Процедура генерации опробована и проверена!! Так что ошибок нет. Сделана на Turbo Pascal 7.0.

Для имени FessCool код должен быть 408672.

Будем надеятся, что вы все поняли из выше сказанного, если что-то непонятно пишите на мыло. Я помогу!

Послесловие

Спасибо автору за предоставленный для исследования продукт. Было очень интересно. Спасибо фирме Borland за превосходный Паскаль, без которого я жить не могу. :)

Господа Авторы: Ну, как это назвать?!! Очень стандартная защита, короче мусор. Нормальный крэкер сломает ее на несколько минут. Хотите получать деньги делайте защиту лучше! 25 US$ баксов для России это очень много, а крэкеров в России много! Россия рулез!

Братья Крэкеры: Не стоит сильно ругать авторов, они там за бугром не ведают, что творят.

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

Спасибо за интерес к моему творчеству!

Удачи в Reversing Engeneering!

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

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

With best wishes Fess

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






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




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