Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Кейген для 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-сектора.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay