Главная » Статьи » Крэкинг

Регистрация Fairstars Audio Converter 1.26 и написание Keygenа
Инструменты
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, а после появляется еще и
E1A213F463C3941. 
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; // Берем текущее число
tmp ^= FSCon100_163elisa;// 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.
Категория: Крэкинг | Добавил: -=Hellsing=- (17.06.2009) | Автор: MC707 E
Просмотров: 1596 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]