Главная » Статьи » Крэкинг |
Регистрация 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] Отсюда делаем вывод, где-то здесь находится процедура проверки введенных данных (в частности проверки 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.Делаем предположение, что 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()Это всё. So long! С вами был MC707. Мой E-mail : mc707@mail.ru. | |
Просмотров: 1596 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |