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

Юзер приходит к сисадмину и спрашивает:
- Скажи, в чем принципиальная разница между Win95 Win98?
А тот ему и отвечает:
- В 95м кол-во ошибок нужно умножить на 95, а в 98м - соотв-но на 98.
Юзер (мечтательно задрав голову в потолок):
- Наверное Win 3.1 был такой хороший, без ошибок...
Сисадмин:
- Идиот! Это означает, что из трех юзеров выживал только один!!!

Target: Ashampoo WinOptimizer Suite Plus Pack 1.31

Tools:

  • Some brains
  • TRW2000
  • Win32Dasm 8.93

Вступление

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

Решил я потестировать системные программы на компакт диске журнала Hard&Soft за 4.2002 г. Запустил первую (эту прогамму), а она не зарегена. Нехорошо это подумал я и решил ее модифицировать. А так как запатчить это любой сможет, то мы займемся созданием регистрационного кода к этой проге, глядишь он и к следующей версии подойдет, да и хранить его легче.

Что за прога:

Эта программа включает в себя кучу разных утилит для оптимизации работы системы. Там и очистка реестра и оптимизация интернет и прочее, так же включает в себя бесплатный навороченный проигрыватель. Все это в архиве занимает приближенно 10 Мб.

Начало

Первое с чего начинается любой взлом это определить какую защиту имеет программа. В основном это имя-код, код, ключ-файл (отсортированы в порядке встречаемости в природе). Запускаем прогу, лезем в About, а там нет ничего... Cтранно. Поищем еще. Нашлось в меню Internet\ Enter Reg/Trial key. Так тут ввод только кода, делаем вывод, что будет какое-то математическое преобразование, и подсмотреть в Soft-Ice настоящий код нам не удасться.

Так вводим любой код. О выскакивает окно, что код неправильный. Было бы интересно, если бы было обратное.

Запускает Soft-Ice и пытаемся проделать тоже самое... Но не тут то было, авторы предусмотрели и такой вариант. Вываливается окно, что Soft-Ice загружен. Ну и фиг-то с ним попробуем поймать это окно. Ставим бряк на MessageBoxA. Запускаем прогу, а она не хочет ловиться. Ладно. Перезагружаемся без Soft-Ice. Попробуем дизассемблировать файл, там же была надпись возможно она есть и в тексте. Так берем Win32Dasm пихаем туда файл AshampooWinOptimizerSuite.exe. Судя по его размеру он не запакован. И правда все хорошо. Только вот в меню строк текст на чем-то нехорошем. Скорее всего на немецком, я в немецком не бум-бум и перевести с ходу не могу. Но если в файле нет строк на english'е, а интерфейс на нем поэтому делаем вывод в каком-то файле эти строки храняться. Посмотрев в каталоге с прогаммой обнаруживаем 3 подозрительных ini-файла: allmods.ini MOD.ini, Module.ini. В них как раз и содержаться эти строки. Переместим их в другое место. Теперь если запустить программу, она будет на немецком. Идем куда нам надо, вводим любой код и в окне видим такую строку Der eingegebene Code war falsch! Поищем ее в листинге. Нашлась по адресу 502B87 посмотрим какой код идет перед ней


:00502B70 8B45FC     mov eax, dword ptr [ebp-04] <- Заносистся адрес на код
:00502B73 E884C6FCFF call 004CF1FC               <- Процедура проверки номера
:00502B78 83F801     cmp eax, 00000001           <- Если eax=1
:00502B7B 1BDB       sbb ebx, ebx                <- то ebx=FFFFFFFF, иначе ebx=0
:00502B7D 43         inc ebx                     <- ebx=ebx+1
:00502B7E 84DB       test bl, bl                 <- Если ebx<>0
:00502B80 754A       jne 00502BCC                <- то переход
:00502B82 6A00       push 00000000               <- Иначе
:00502B84 8D55F0     lea edx, dword ptr [ebp-10] <- вывод

* Possible Reference to String Resource ID=50300: "Der eingegebene Code war
                                                   falsch!"
                                  |
:00502B87 B87CC40000  mov eax, 0000C47C          <- строки

Узнать, что после команды mov eax, dword ptr [ebp-04] в eax будет адрес на введенный код можно так: запускаем TRW2000 ставим бряк на 00502B70, вываливаемся. Пишем d eax. И видим свой код.

Рассчет кода

Теперь посмотрим процедуру подсчета правильности кода. Заходим в call 004CF1FC. Идем в конец процедуры и смотрим от чего зависит будет eax=1 или нет. Смотрим, смотрим, смотрим.... Длинная!!! Но ничего разберемся как-нибудь.


* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004CF25E(C), :004CF4C5(C)
|
:004CF4D1 807DF301    cmp byte ptr [ebp-0D], 01
:004CF4D5 0F94C0      sete al
:004CF4D8 807DF201    cmp byte ptr [ebp-0E], 01
:004CF4DC 0F94C2      sete dl
:004CF4DF 22C2        and al, dl
:004CF4E1 807DF101    cmp byte ptr [ebp-0F], 01
:004CF4E5 0F94C2      sete dl
:004CF4E8 22C2        and al, dl
:004CF4EA 7402        je 004CF4EE
:004CF4EC B301        mov bl, 01

Видно, что если хоть в одном из байтов по адресам [ebp-0D],[ebp-0E], [ebp-0F] будет 0, то al = 0. Три критерия проверки, нам надо, чтобы во всех из них была 1. Так же сюда ведут два перехода: второй видно откуда, посмотрим откуда идет первый. Идем к 004CF25E.


:004CF253 8B45FC       mov eax, dword ptr [ebp-04]
:004CF256 E8D557F3FF   call 00404A30
:004CF25B 83F812       cmp eax, 00000012
:004CF25E 0F856D020000 jne 004CF4D1

Очень похоже на проверку длинны кода. Значит код должен быть равен 18 символам. Хорошо учтем.

Теперь ищем где в первый байт [ebp-0D] записывается 1. И наты- каемся на такой кусок кода.


:004CF419 8B45F8      mov eax, dword ptr [ebp-08]
:004CF41C 8B55F4      mov edx, dword ptr [ebp-0C]
:004CF41F E85057F3FF  call 00404B74
:004CF424 7504        jne 004CF42A
:004CF426 C645F301    mov [ebp-0D], 01

Скорее всего это сравнение строк по адресам находящимся в eax и edx. А что в них? Запускаем TRW 2000. Ставим бряк на 4CF419. Вводим произвольный пароль из 18 символов. И смотрим, что в этих строках. По адресу eax какое-то 4-х значное hex-число, по адресу edx 4 последних символа нашего кода. Уже кое-что. Заранее скажу, что число в eax есть сумма кодов первых 13 байтов нашего кода. Эта сумма вычисляется в процедуре по адресу 004CF568, следующей сразу после проверки количества символов в коде.

Теперь смотрим второй критерий [ebp-0E] выраженный в таком куске кода


:004CF469 8B45F8     mov eax, dword ptr [ebp-08]
:004CF46C BA58F54C00 mov edx, 004CF558
:004CF471 E8FE56F3FF call 00404B74
:004CF476 7504       jne 004CF47C
:004CF478 C645F201   mov [ebp-0E], 01

Проводим тот же маневр с TRW 2000. Ставим бряк на 4CF469 и видим, что по адресу eax находится 6-й символ кода, а по edx hex-число C. По скольку адрес указан статический, то можно сделать вывод, что C это неизменяемая константа. С учетом этого код выглядит так: xxxxxCxxxxxxxxXXXX. Где "x" - цифра или буква, "XXXX" - сумма кодов первых 13 символов.

И наконец третий критерий [ebp-0F] вычисялется из такого куска кода:


:004CF440 8B45F8     mov eax, dword ptr [ebp-08]
:004CF443 BA4CF54C00 mov edx, 004CF54C
:004CF448 E82757F3FF call 00404B74
:004CF44D 7504       jne 004CF453
:004CF44F C645F101   mov [ebp-0F], 01

Видно, что код аналогичен двум первым случаям. Только по адресу eax находится первые 3 символа кода, а по адресу edx три буквы "WOD".

Общая форма кода принимает вид: WODxxCxxxxxxxxXXXX

Поскольку считать самому XXXX мне было в лом, я состряпал такую программу на Pascal, пришлось даже написать функцию перевода из dec в hex.


Var
 St,Z,M:String;
 C:Byte;
 B:LongInt;

function Hex(N:Integer):String; {Функция перевода из dec в hex}
Begin
  M:='123456789ABCDEF';
  C:=4;
  Z:='0000';
  repeat
   Z[C]:=M[Round((N/16-N div 16)*16)];
   N:=N div 16;
   dec(C);
  until N=0;
  Hex:=Z;
End;

Begin
 St:='WODxxCxxxxxxx'; {Здесь вместо x вписываете любые буквы или цифры}
 B:=0;
 For C:=1 TO 13 Do B:=B+Ord(St[C]); {Сумма кодов первых 13 байт}
 Writeln;
 Write(St+'-'+Hex(B));
End.

У меня получился такой код: WOD11C1111111-02E6 Вводим. Загегистрировано. Запускаем опять и видим unregistred. Почему? Да все просто мы ввели Trial-код, а надо Reg-код. Посмотрим процедуру проверки повнимательней.

Это было, и это было, и это тоже... А что это за процедура проверки?


:004CF492 8B45F8     mov eax, dword ptr [ebp-08]
:004CF495 BA64F54C00 mov edx, 004CF564
:004CF49A E8D556F3FF call 00404B74
:004CF49F 7417       je 004CF4B8

Все как обычно загружаем в TRW 2000 ставим бряк начало блока. И смотрим по адресу eax 4-й и 5-й байты кода, а по edx 77. Так вот значит чем отличается код Trial-версии, от обычной?!!! Здесь должно стоять мое недоумение, вроде бы мощный продукт, а код генерится как в детском саду, ей богу. Товарищи программисты не будьте так наивны!

Значит в тексте прогаммы заменяем в строке St:='WODxxCxxxxxxx'; третий и четвертный символы на постоянные 77.

Еще разок пробуем ввести на сей раз моим кодом будет такая строка WOD77C1111111-02F2.

B нам показывают, что мы зарегились полностью. Ура-а-а!!! Вопли восторга с разбрызгиванием слюны вокруг.

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

Удачи в Reversing Engeneering!

Послесловие

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

Собратья, если Вам понравилась эта программа и у вас есть деньги купите ее, иначе если никто не будет покупать, то никто не будет писать программы, следовательно нам будет нечего делать.

Программисты, не будьте наивны - защищайте свои творенья как следует, не надейтесь на совесть крякеров, у некоторых ее не бывает.

"Любая программа личностна, так как личность есть отражение свойств пространства на беспредельности бытия." (Fess)

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

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

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

With best wishes Fess

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

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