Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Регистрация Fairstars Audio Converter 1.26 и написание Keygenа

Обсудить статью на форуме

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: MC707 <mc707@mail.ru>

Инструменты

OllyDbg 1.09d (1.10a)
Stripper 2.03/caspr/AspackDie 1.41/руки - любое из этого :)
some brains
OllyDbg 1.10 http://home.t-online.de/home/Ollydbg/beta110a.zip
Все утилиты описанные в программе могут быть взяты с http://protools.cjb.net/

Немного о программе

Защита: Aspack 2.12
FairStars Audio Converter - утилита конвертирования мультимедиа форматов WAV, AIFF, AU, VOC, APE, OGG, VQF, MP1, MP2, MP3, WMA, WMV, ASF to WMA, MP3, VQF, OGG, APE, WAV друг в друга. Можно конвертировать в пакетном режиме сразу несколько файлов, независимо от их начальных форматов. Имеет встроенный плеер. Конвертирование происходит без создания каких-либо временных файлов, с высокой скоростью. Есть еще поддержка "нормализации" (авторегулировка громкости), редактирование ID3 и др. Сайт программы: http://www.fairstars.com/

Ну чтож, приступим. После установки программы заходим в указанную при инсталляции папку и смотрим на файл AudioConverter.ExE. Невооруженным глазом видно, что на нем висит Aspack - присутствует секция ".aspack", хотя не факт еще, что если есть такая секция, то файл запакован aspack-ом. Но я вам зуб даю, кто не верит - может проверить (взять утилиту PEiD 0.91). Не мудрствуя лукаво я взял AspackDie 1.41 и натравил на него наш файл. Итак, после распаковки получаем:
Оригинальный ехе: 637440 байт
Распакованный ехе: 3436544 байт (у вас размер может быть другим)
Ну, приступим к анализу.
Загружаем файл в OllyDbg, оказываемся на Оригинальной Точке Входа (OEP, Original Entry Point), месте, откуда все программы начинают свое выполнение (для каждой программы свое такое место). Запускаем программу на выполнение (F9). Сразу появляется окно Регистрации, где нас просят ввести User Name, Product Number (PN) и собственно Serial Number (SN). Вводим любую информацию и смотрим что получится... Появляется окно "PN Error!", "UserName Error!", либо "Registration Number Incorrect!!!" (в зависимости от того, что вы ввели). Ну конечно если мы случайно не угадали верные регистрационные данные =)))). В принципе информации нам достаточно. Закрываем программу, возвращаемся в OllyDbg. Перезапускаем программу (Ctrl+F2). Снова оказываемся на OEP. Теперь жмем правой клавишей мышки по дизассемблированному коду и из появившегося меню выбираем Search for->All referenced text strings. Появляется окно со всеми найденными строками внутри ехе-файла. Перемещаемся на самый верх - Home :) . Нажимаем Ctrl+L (search for text) и вводим "Number Incorrect" например. Находим и видим, что все нужные нам строки находятся в одном месте. Жмем Enter и оказываемся на адресе 411AD9. Видим, что чуть выше находится строка "Registered OK" (411A7D) и еще выше (41193C) и (411915) - "PN Error!" и "UserName Error!" соответственно.
 00411901  |. 8B86 8C130000  MOV EAX,DWORD PTR DS:[ESI+138C]
 00411907  |. 8D9E 8C130000  LEA EBX,DWORD PTR DS:[ESI+138C]
 0041190D  |. 8378 F8 01     CMP DWORD PTR DS:[EAX-8],1
 00411911  |. 7D 11          JGE SHORT AUDIOCON.00411924
 00411913  |. 55             PUSH EBP
 00411914  |. 55             PUSH EBP
 00411915  |. 68 8C334C00    PUSH AUDIOCON.004C338C   ;  ASCII "UserName Error!"
 0041191A  |. E8 6B550300    CALL 
 0041191F  |. E9 06020000    JMP AUDIOCON.00411B2A
 00411924  |> 8B8E A0130000  MOV ECX,DWORD PTR DS:[ESI+13A0]
 0041192A  |. 8D86 A0130000  LEA EAX,DWORD PTR DS:[ESI+13A0]
 00411930  |. 894424 20      MOV DWORD PTR SS:[ESP+20],EAX
 00411934  |. 8379 F8 08     CMP DWORD PTR DS:[ECX-8],8
 00411938  |. 74 11          JE SHORT AUDIOCON.0041194B
 0041193A  |. 55             PUSH EBP
 0041193B  |. 55             PUSH EBP
 0041193C  |. 68 80334C00    PUSH AUDIOCON.004C3380   ;  ASCII "PN Error!"
 00411941  |. E8 44550300    CALL 
 00411946  |. E9 DF010000    JMP AUDIOCON.00411B2A
 0041194B  |> 8B17           MOV EDX,DWORD PTR DS:[EDI]
 0041194D  |. 8B42 F8        MOV EAX,DWORD PTR DS:[EDX-8]
 00411950  |. 83F8 10        CMP EAX,10
 00411953  |. 0F85 D1010000  JNZ AUDIOCON.00411B2A
 ..
 004119AA  |. 8D4424 10      LEA EAX,DWORD PTR SS:[ESP+10]
 004119AE  |. 8BCE           MOV ECX,ESI
 004119B0  |. 50             PUSH EAX                     ; /Arg1
 004119B1  |. C68424 F400000>MOV BYTE PTR SS:[ESP+F4],4   ; |
 004119B9  |. E8 02FDFFFF    CALL AUDIOCON.004116C0       ; \AUDIOCON.004116C0
 ..
 00411A7B  |. 57             PUSH EDI
 00411A7C  |. 57             PUSH EDI
 00411A7D  |. 68 70334C00    PUSH AUDIOCON.004C3370       ;  ASCII "Registered OK!"
 00411A82  |. E8 03540300    CALL 
 00411A87  |. 8D4C24 14      LEA ECX,DWORD PTR SS:[ESP+14]
 00411A8B  |. C68424 F000000>MOV BYTE PTR SS:[ESP+F0],5
 00411A93  |. E8 D4530300    CALL 
 00411A98  |. 8D4C24 10      LEA ECX,DWORD PTR SS:[ESP+10]
 00411A9C  |. C68424 F000000>MOV BYTE PTR SS:[ESP+F0],4
 00411AA4  |. E8 C3530300    CALL 
 00411AA9  |. 8D4C24 18      LEA ECX,DWORD PTR SS:[ESP+18]
 00411AAD  |. C68424 F000000>MOV BYTE PTR SS:[ESP+F0],3
 00411AB5  |. E8 B2530300    CALL 
 00411ABA  |. 8D4C24 4C      LEA ECX,DWORD PTR SS:[ESP+4C]
 00411ABE  |. C78424 F000000>MOV DWORD PTR SS:[ESP+F0],-1
 00411AC9  |. E8 721A0100    CALL AUDIOCON.00423540
 00411ACE  |. B8 01000000    MOV EAX,1
 00411AD3  |. EB 57          JMP SHORT AUDIOCON.00411B2C
 00411AD5  |> 6A 00          PUSH 0
 00411AD7  |. 6A 00          PUSH 0
 00411AD9  |. 68 4C334C00    PUSH AUDIOCON.004C334C;  ASCII "Registration Number Incorrect!!!"
 00411ADE  |. E8 A7530300    CALL 
 
Отсюда делаем вывод, где-то здесь находится процедура проверки введенных данных (в частности проверки SN) и что программа вероятно очень слабо защищена. Ставим 4 Breakpoint-а (точки останова) на эти адреса (F2) и снова запускаем программу. Появляется окно регистрации. Ничего не вводя нажимаем на Register и сразу прерываемся по адресу 411915. Как видим программа хочет сказать, что мы ввели неверное имя... неужели :). Посмотрев чуть повыше (41190D и 411911) можно увидеть проверку, как нетрудно выяснить, отвечающую за проверку длины имени (должна быть не меньше 1). Итак, получаем первое обязательное условие [1] - имя не может не быть :)... т.е. мы должны ввести хоть какое-то имя. Идем дальше. Перезапускаем программу, запускаем на исполнение. Вводим какое-нибудь имя и жмем Register. Прерываемся на месте, где программа хочет сказать, что мы ввели неправильный PN. Аналогичными, как и в случае проверки имени (см. адреса 411934 и 411938), действиями приходим к выводу, что длина PN сравнивается с 8, и если это условие не выполняется - выводится сообщение об ошибке. Таким образом, получаем второе условие [2]- длина PN должна быть ни больше, ни меньше, 8 символов.

Теперь начинается самое трудное из всего процесса (это не относится к тем, кто имеет опыт в исследовании программ) - найти то место, где программа проверяет правильность введенного SN. Самый простой способ, какой только я придумал - посмотреть куда дальше мы попадаем, если первые два условия [1] и [2] выполняются. Ставим break на адрес 41194B. Почему? Да потому, что туда мы попадаем, если выполняется условие [2]. Запускаем программу на выполнение, вводим в поле UserName например, MC707, в поле PN - 12345678 и в поле SN, например, 1111-1111-1111-1111. Жмем Register и прерываемся по адресу 41194B. Видим, что в регистре ECX у нас сейчас находится PN, а в окне стека видим наш SN. Потрассировав по F8, замечаем, что до захода в процедуру 4116C0 по адресу 4119B9 в окне стека находится строка 1111111111111111, а после появляется еще и 1E1A213F463C3941.
 00C134D4   00000001
 00C134D8   00C73F98  ASCII "1E1A213F463C3941"
 00C134DC   00C134FC
 00C134E0   00C73E58
 00C134E4   00C74038  ASCII "2345678"
 00C134E8   00C15078
 00C134EC   00C73E58
 00C134F0   00C73FE8  ASCII "1111111111111111"
 00C134F4   31313131
 
Делаем предположение, что 4116C0 - процедура генерации правильного SN, и 1E1A213F463C3941 - он и есть. Проверяем: записываем куда-нибудь 1E1A213F463C3941, перезапускаем программу (можно перед этим убрать брейкпойнт на адрес 41194B, чтоб не прерываться) и вводим с теми же данными этот SN. Оп-па! программа прерывается по адресу 411A7D и мы видим там "Registered OK!". Отпускаем программу дальше (F9) и видим окно с надписью "Registered OK!". Все. Программа зарегистрирована! Нам интересно, как вычисляется SN. Зайдем в процедуру регистрации и посмотрим. В принципе ничего сложного, банальный XOR... Ладно, к этому вернемся чуть позднее.
Проверяем, как зарегистрировалась программа - закрываем отладчик и запускаем Fairstars Audio Converter... Что за???.... Она опять просит ввести регистрационные данные! Как так? Мы же ее зарегистрировали! А вот нет. Кто не верит - может попробовать повторить процедуру уже без отладчика, результат будет тем же. В чем же дело? Не знаю как вам, а мне интуиция подсказала, что нужно копать в сторону PN. Не зря же он назван Product Number, т.е. не какие- либо произвольные данные туда можно вводить. Видим, что до и после процедуры генерации есть вызов еще одной процедуры 423640 по адресам 411997 и 4119FA. Не к добру и не спроста. Трассируя по F8 до нее, зайдем в эту процедуру по F7 и поставим на нее breakpoint. Перезапустим программу и увидим, что она прервется буквально начав работу. Именно в этой процедуре. В ней я сразу скажу - ничего интересного нет. Нажмем Ctrl+F9 чтобы пройти быстро всю эту процедуру и остановиться на ее конце - ret. Нажимаем F8 и выходим из нее на адрес 41F5B4. Потрассируем немного по F8 и заметим интересное - после прохода процедуры по адресу 41F5D5 в окне стека появляется строка "0000000000000000". Интересно, что за строка такая, перезапуская программу, заходим в эту процедуру по F7. Ой, что мы видим там... Наш PN внутри сравнивается со строками F9520071, N9730668 и U7949909. Ну и ладно, мусор это все :) . Смотрим дальше... о господи... Видим тот же код, что находится в процедуре генерации SN, т.е. SN генерируется еще раз. И именно здесь. Проходим чуть дальше и натыкаемся на самое главное... Вобщем если присмотреться к адресам 41F846-41F852, то видим, что берется первый символ нашего PN и сравнивается с 4Eh, 46h и 55h. А это не что иное, как символы "N", "F", и "U". И если это условие не выполняется, то PN обнуляется. Таким образом поучаем третее обязательное условие - [3] первый символ PN должен быть "F", "N" или "U"! Это все, если в поле PN ввести теперь например F7070707, то соответствующий ему SN будет 681E213B423C3D3D и если все правильно, то программа будет зарегистрирована. Проверяем - всё работает! Программа полностью зарегистрирована!

Мы же на этом не остановимся и попытаемся сделать для программы keygenerator. Что это такое? Это программа, которая при любых указанных валидных данных вычисляет верный для данной программы SN. Для этого нам нужно проанализировать процедуру генерации SN. Стираем все брейкпойнты (пункт меню View->Breakpoints в Olly, Del) и ставим один единственный на адрес 41F76C. Запускаем, прерываемся. Подробно я описывать не буду. Трассируя по F8, делаем такие выводы. Из PN вырезается первый символ. Оставшиеся символы преобразовываются в число функцией atol(PN) (41F786). После этого это число делится на 0Ah, т.е. на 10 и остаток сохраняется в регистре EBX (41F7A1). Затем Берутся 2 строки-константы "FSCon100" и "163elisa", "163elisa" преобразовывается в "asile361". Заходим в цикл и видим, что над каждым символом этих двух строк производится операция XOR и затем к полученным значениям прибавляется соответствующая цифра PN. Каждая операция дает 2 символа. Цикл проходит 8 раз. Таким образом, складывая 8 раз по 2 символа получаем регистрационный SN. Кстати забыл сказать, что от поля UserName вообще ничего не зависит! Проходит любое имя!
Я набросал небольшую функцию в VC++ вычисляющую правильный SN:
 void CKeygenDlg::OnGenerate()
 {
     CString str,str1;
     GetDlgItemText(IDC_EDIT2,str);		// Здесь у нас берется PN
     GetDlgItemText(IDC_EDIT1,str1);		// Здесь - UserName
     char q=str[0];
     if (str=="")						// Если не введен PN,
         MessageBox("Please Enter PN");	// то ничего не делаем
     else
         // Если первая буква не F, N, или U
         if (q!=0x4e && q!=0x46 && q!=0x55)
             MessageBox("PN must be like this:
             \nFXXXXXXX, NXXXXXXX or UXXXXXXX,\nwhere X is a number!");
         else
             if (str.GetLength()!=8)		// Длина PN должна быть 8
                 MessageBox("PN must be 8 characters length");
             else
                 if (str1.GetLength()<2)
                     MessageBox("Name Incorrect");
                 else
                 {
                     // Текущая цифра/буква из PN
                     char tmp = 0;
 
                     // Сначала номер PN, потом остаток от деления на 10
                     long Nmb = 0;
 
                     // Это у нас готовый проксоренный шаблон
                     char FSCon100_163elisa[8] =
                         {0x27,0x20,0x2a,0x03,0x0b,0x02,0x06,0x01};
 
                     // Удаляем первый символ PN
                     str1 = str; str1.Delete(0);
 
                     char k[1];			// Конвертируем в k номер (2 цифры)
                     CString serial;		// Здесь будет полученный серийник
 
                     Nmb = atol(str1);	// PN -> Число
                     Nmb %= 10;			// Берем остаток от деления на 10
 
                     for (int i=0; i<8; i++)			// Обрабатываем все 8 чисел
                     {
                         tmp = str[i];				// Берем текущее число
                         tmp ^= FSCon100_163elisa[i];// XOR с шаблоном
                         tmp += (char)Nmb;			// Прибавляем остаток
 
                         // Конвертируем в строку из 2х знаков
                         _ltoa(tmp, k, 16);
 
                         serial += k;				// Прибавляем к серийнику
                     }
                     serial.MakeUpper();	// Делаем все символы заглавными
                     serial.Insert(4,"-");
                     serial.Insert(9,"-");
                     serial.Insert(14,"-"); // Вставляем 3 знака "-"
                     SetDlgItemText(IDC_EDIT3, serial);
             }
 }
 
Это всё. So long!

С вами был MC707. Мой E-mail : mc707@mail.ru.

Обсуждение статьи: Регистрация Fairstars Audio Converter 1.26 и написание Keygenа >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS