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

Почемy ломание программ лучше секса.
1. Ломать программы можно более 6 часов непрерывно.
2. У программ не бывает периодов, когда их нельзя ломать.
3. Тебе не надо всякий раз покупать новый отладчик и дизассемблер чтобы сломать очередную программу.
4. Когда ты ломаешь программу она y тебя не спрашивает, сколько программ ты сломал до нее и во сколько лет сломал первую программу.
5. Можно ломать две, три и более программы одновременно.
6. Одновременно с ломанием программы можно кушать, смотреть телевизор и читать книжку.
7. Чем быстрее ты сломаешь программу, тем лучше.
8. Программа никогда не скажет "А прошлый кpакеp меня дольше ломал."
9. Ломать программы можно в присутствии друзей, родителей и преподавателей.
10. Когда ты сломал программу, то можешь (и хочешь) приступить к слому другой уже через пару минут.
11. После того как ты сломал программу y тебя не болит спина и не заплетаются ноги.
12. Одну программу достаточно сломать один раз.
13. Тебя не заставляют жениться на сломанной программе.
14. Кpак к программе можно подарить своим друзьям или продать.
15. Если тебе вдруг надоело, то ты можешь остановиться и продолжить ломать программу на следующей неделе.

Target: WinMusic Jukebox 4.0

Tools:

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

Вступление

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

После недолгого перерыва, сейчас посмотрю сколько прошло... Кто-нибудь мне подскажет сколько будет 23-7, а? Нет не 1С, не в шестнадцатеричном формате живем, а прошло 16 дней. Нифига себе сказал я и решил порадовать Вас новым тьюториалом. Что ж читайте и путь с вами пребудет великий дух bad-сектора.

Что за прога:

Да, кто его знает. шваль какая-то за 19 убитых енотов, но у нас на такое г**** денег нет, так что будем ломать и не просто, а срубим настоящий кейген. Прога для работы с музыкой или что-то в этом роде, в архиве 793 кило, так что качайте и приступим.

Начало

Так, так, так, что это за зверь?

Попробуем понять запакована ли программа, а поскольку мы не долбаные ламеры, определим это в ручник. Запускаем любой просмотрщик ресурсов (Я пользуюсь встроенным в WinNavigator. И вообще это прога must have и рулез форева). Так секция строк просматривается нормально, значит прога не пакована. Попробуем кинуть его в Win32Dasm.

Вроде, все прошло нормально, но что-то недает нам покоя, а это то, что это прога 16-битное приложение, а не 32-х. Но мы кул хацкеры и поламаем и такую гадость. Верно ведь?

Пожалй пришло время запустить саму прогу и посмотреть ее реакцию на любой пароль, там вывалилась в MessageBoxe, такая строка Invalid Registration Information. Да как эта недостойная прога посмела отказать нам в регистрации, но мы добьемся своего любой ценой. Ищем эту строку в секции строк Win32Dasmа, когда найдем жмем два раза и оказываемся здесь.


:0001.0487 50           push ax
:0001.0488 56           push si
:0001.0489 9A6210FFFF  call 0001.1062
:0001.048E 83C406       add sp, 0006
:0001.0491 0BC0         or ax, ax
:0001.0493 7419         je 04AE
:0001.0495 C7065A680100 mov word ptr [685A], 0001
:0001.049B 56           push si
:0001.049C 1E           push ds

* Possible StringData Ref from Data Seg 004 ->"Thank you for your Registration."
                                  |
:0001.049D 68AF00       push 00AF
:0001.04A0 1E           push ds

* Possible StringData Ref from Data Seg 004 ->"WINMUSIC JUKEBOX"
                                  |
:0001.04A1 689E00       push 009E

* Possible StringData Ref from Data Seg 004 ->"Registered to: "
                                  |
:0001.04A4 6A30         push 0030
:0001.04A6 9ABA040000   call USER.MESSAGEBOX
:0001.04AB 56           push si
:0001.04AC EB15         jmp 04C3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.0493(C)
|
:0001.04AE 56           push si
:0001.04AF 1E           push ds

* Possible StringData Ref from Data Seg 004 ->"Invalid Registration Information."
                                  |
:0001.04B0 68E100       push 00E1
:0001.04B3 1E           push ds

* Possible StringData Ref from Data Seg 004 ->"WINMUSIC JUKEBOX"
                                  |
:0001.04B4 68D000       push 00D0

Все как обычно, простой переход, если неправильный ключ. Посмотрим чуть повыше перехода и видим строку or ax, ax, что это такое думаете вы, да все просто это почти тоже самое, что и test eax,eax, к которому мы привыкли. Соответственно если выделенная процедура возвращает 0, то переходим на неправильно, если не равно 0, то все в порядке. Здесь очень легко можно сделать патч, это удалить переход, и более верное сделать так, чтобы процедура всегда возвращала число не равное 0. Как это сделать было подробно описано в других моих тьюториалах. Сегодня я хочу сделать кейген.

Смотрим еще чуть выше. Тут вызывается два раза процедура GETDLGITEMTEXT, (! НЕ ПУТАЙТЕ С GetDlgItemTextA это разные вещи). А значит пришло время отладчика, я пользую TRW2000, т.к. перезагружаться в падлу мне всегда.

Ставим бряк на эту процедуру bpx GETDLGITEMTEXT. И запускаем прогу и вводим любое имя и любой код (я ввел Fess и 110022334455), один раз пропускаем, нажимаем F12 и оказываемся, где нужно. (В TRW2000 надо еще 1 раз нажать F8). Т.е. на строке 0001.0480. Идем до нужной на процедуры и заходим в нее.

Идем пока не натыкаемся на следующий участок кода (остальное там обнуление и присваивание, хотя их много)


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.10D5(C)
|
:0001.10D9 56        push si
:0001.10DA 9A483F0A11 call 0003.3F48
:0001.10DF 5B        pop bx
:0001.10E0 8946FC    mov [bp-04], ax
:0001.10E3 8B4608    mov ax, [bp+08]
:0001.10E6 8946FE    mov [bp-02], ax
:0001.10E9 8BF0      mov si, ax

Процедура вызывает у нас подозрение, встав на строке 10D9 или на самой процедуре, пишем команду d si (Не esi, только si). Но в окне кода мы не видим ничего путного, потом до нас доходит, что прога 16-битная, а значит надо писать d ds:si и мы видем первые 5 символов нашего введенного кода. Так же вызывает подозрение строка 10E0 тут возвращенное процедурой значение пихают в память (в переменную). Я решил зайти и проверить, что это за процедура, а вы со мной, так как иначе нельзя! Я не буду рассматривать всю процедуру, там в начале обнуление, а потом, проверка на вхождение кода в рамки от 0 до 9, короче идем до след. участка кода.


В начале bx и dx равны 0.
:0003.3F6F AC                     lodsb <-берем символ 1 кода в ax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0003.3F6D(C)
|
:0003.3F70 3C39    cmp al, 39 <- если больше, т.е. больше '9'
:0003.3F72 771F    ja 3F93
:0003.3F74 2C30    sub al, 30 <- вычитаем их al 30
:0003.3F76 721B    jb 3F93
:0003.3F78 D1E3    shl bx, 01 <- Далее куча сдвигов хитрожопых
:0003.3F7A D1D2    rcl dx, 01
:0003.3F7C 8BCB    mov cx, bx
:0003.3F7E 8BFA    mov di, dx
:0003.3F80 D1E3    shl bx, 01
:0003.3F82 D1D2    rcl dx, 01
:0003.3F84 D1E3    shl bx, 01
:0003.3F86 D1D2    rcl dx, 01
:0003.3F88 03D9    add bx, cx
:0003.3F8A 13D7    adc dx, di
:0003.3F8C 03D8    add bx, ax   <- bx=bx+ax
:0003.3F8E 83D200  adc dx, 0000
:0003.3F91 EBDC    jmp 3F6F <- снова

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0003.3F72(C), :0003.3F76(C)

|:0003.3F93 58     pop ax
:0003.3F94 3C2D    cmp al, 2D     <- если последний символ '-' то не переходит
									 (У нас в коде таких не будет можете забыть)
:0003.3F96 93      xchg ax,bx     <- ax = bx
:0003.3F97 7507    jne 3FA0       <- если не равно переход (точно не равно переходим)
:0003.3F99 F7D8    neg ax

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


:0001.10F0 8A04        mov al , [si]  <- берем символ имени в al
:0001.10F2 257F00      and ax, 007F   <- присваиваем ah=0
:0001.10F5 8BC8        mov cx, ax     <- cx=ax
:0001.10F7 8D5BC8      lea bx, [bp+di-38]  <- bx=bp+di-38
:0001.10FA 368B01      mov ax, ss:[bx+di]  <- берем в ax символ по адресу ss:[bx+di]
:0001.10FD F7E9        imul cx             <- ax=ax*cx
:0001.10FF 0146FA      add [bp-06], ax     <- добавляем в переменную еще 1 значение
										    (в первый раз переменная равна 0)
:0001.1102 47          inc di              <- увеличиваем счетчики
:0001.1103 46          inc si              <- увеличиваем счетчики

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0001.10EE(U)
|
:0001.1104 FF7608      push word ptr [bp+08]
:0001.1107 9ACA3EC40C  call 0003.3ECA <- возвращает длинну имени
:0001.110C 5B          pop bx
:0001.110D 034608      add ax, [bp+08]
:0001.1110 3BC6        cmp ax, si
:0001.1112 77DC        ja 10F0 <- не помню, пока символы имени не кончатся повторяем
:0001.1114 8B56FA      mov dx, [bp-06] <- берем все суммы в dx
:0001.1117 B81879      mov ax, 7918    <- ax=7918h
:0001.111A 2BC2        sub ax, dx      <- ax=ax-dx
:0001.111C 8BD0        mov dx, ax      <- dx=ax
:0001.111E 3B56FC      cmp dx, [bp-04] <- сравниваем если равны, то зарегена
:0001.1121 752F        jne 1152

Рекомендую повнимательней приглядеться к строке 10FA, там поочереди берутся значения 3 8 3 3 5 2 3 5 3 2 7 5 6 4 3 7 7 6 7 5 и заносятся в ax. Это к сведению.

В принципе теперь все понятно. Здесь можно обойтись простым перебором всех кодов, я не проверял является ли обратимой функция вычисления по коду, но врядли. Короче, перебор все номеров от 10000 до 99999.

Вот я сляпал кейген на Делфи, разбирайтесь. Как всегда затащите на форму два компонетна Edit (по умолчанию их имена Edit1 и Edit2) и одну кнопку, нажмите на кнопку два раза и вставьте нижеследующий код. Потом запустите программу в Edit1 введите свое имя и нажмите на кнопку и в Edit2 появиться настоящий код.


procedure TForm1.Button1Click(Sender: TObject);
Var
 S:String;
 DXX,BXX,Itog, Cod:Word;
 EDXX,Z:Dword;
 I:Byte;
 Ura:Boolean;
begin
  S:='38335235327564327675'; //  Это числа я Вам писал
  Itog:=0; //Общая пин-ключ для имени
  For I:=1 To Length(Edit1.Text) Do // Процедура генерации пинключа для имени
  Begin
    EDXX:=Ord(S[I])-$30;
    DXX:=Ord(Edit1.Text[I]);
    asm
     mov eax,edxx
     mov cx,DXX
     imul cx
     add itog,ax
    end;
  End;
  Itog:=$07918-Itog; //Пин-ключ для имени готов, теперь приступаем к подбору
     //пин-ключа для кода

  Ura:=False; //Переменаая Ura будет True когда два пин-ключа будут равны
  Z:=10000; // Код с которого начинаем подбор
  repeat    //Цикл перебора возможных кодов
   BXX:=0;
   DXX:=0;
   S:=IntToStr(Z);

  For I:=1 To 5 Do  //Цикл для вычисления пин-ключа для кода
  Begin
    Cod:=Ord(S[I])-$30;
   asm
    pusha
    mov ax, Cod
    mov bx,BXX
    mov dx, DXX
    shl bx,1
    rcl dx,1
    mov cx, bx
    mov di,dx
    shl bx,1
    rcl dx,1
    shl bx,1
    rcl dx,1
    add bx,cx
    adc dx,di
    add bx,ax
    mov dxx,dx
    mov bxx, bx
    popa
   end;

  End;

  if bxx=itog then Ura:=True; // Сошлось УРА, то Ura:=True
  Inc(Z);
  until (Z>99999) or (Ura); // Перебор пока все коды не выйдут

  Edit2.Text:=S; // Подобраный код в Edit2, или если не подобрал, то 100000,
    // Но у меня такого не было, всегда был код
end;

Процедура генерации опробована и проверена!! Так что ошибок нет. Сдалана на Delphi 4.5, я думаю, подойдут все версии, начиная с 4.

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

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

Послесловие

Спасибо автору за предоставленный для исследования продукт. Было очень интересно.

Господа Авторы: защита фигня, если хотите, чтобы за прогу платили баблосы - делайте защиту лучше.

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

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

Удачи в Reversing Engeneering!

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

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

With best wishes Fess

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

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