Создание регистрационного кода к Ashampoo WinOptimizer Suite Plus Pack 1.31
|
Юзер приходит к сисадмину и спрашивает:
- Скажи, в чем принципиальная разница между 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-сектора.
|