скрыть

скрыть

  Форум  

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

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



Google  
 

Создание регистрационного кода к 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-сектора.






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




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