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

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


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

Не совсем стандартный взлом Awave Audio

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

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

Автор: stahh <lupuslone@yandex.ru>

Не совсем стандартный взлом Awave Audio.

Не знаю, что вы ожидаете здесь прочитать, но это не будет тутор по типу "делай как я". Точнее - это вообще не тутор по взлому. Скорей эта статья даст понимание того, как пользоваться самым рулёзным инструментом крекера. Инструмент называется - мозг. Ну что, это тебя интересует? Нет? Ну тогда ты уже не новичок. Пойди и сам напиши чо-нить. А я продолжу.

В одном из топиков Тim попросил помочь доломать прогу. Awave Audio v9.2 - прога для конвертации различных музыкальных файлов из одного формата в другой. Первым делом я глянул на размер! Причем здесь размер? Ну если ты счастливый обладатель выделенки или адсл, то тебе не понять неандертальцев, пользующихся диалапом. Но даже в наше время прогресс не проник повсеместно.
Короче, размер меня устроил. Прогу я скачал. И - усе. Прога была запакована аспром! Ну и чо? -скажут многие,- Аспр не так уж сложно распаковать. А то! Может у меня руки кривые, может еще чего, но я сам, вручную, не распаковал еще не одного аспра. Хто сказал "чайник"? Ну если вы определяете уровень крекера по умению распаковывать проты, то - да. В этом деле я чайник. Собсно, крекинг - мое хобби. Типа разгадывания кроссвордов. Так шо - уж как-то так. И еще я не умею кодить. И осилил тока 8 номеров рассылки Калашникова.;-)) Но если низя, но очень хочется,- то можно.=))

Итак. Прога была пакована аспром, но Тим ее распаковал и выложил распакованный екзешник. Вот с ним я и начал знакомиться. И после знакомства были сделаны такие выводы.
1. Прога считает триал. Причем отсчет заюзан с таймером. Т.е. если ты ее юзаешь 29 дней, то будешь сидеть и ждать 29сек, пока активируется кнопка "Далее".
2.Требует регфайл. А порывшись в стрингах, я узнал, что в файле должны быть : username, userkey, usercode0, usercode1, usercode3.Наверное дожен быть и usercode2, хз.
3. И самое главное. При запуске выплывает окно с четырьмя кнопками и таймером. Можешь ввести регфайл, можешь продолжить эвалюшн. А можешь просто закрыть.
4. В триал-версии присутствовали ограничения: конвертировались первые 60сек файла, за один раз можно сконвертировать только один файл. И еще какая-то фигня, назначение которой я не понял.

Ну чо? Мысли по поводу "с чего начать" есть? Я в алго генерации ключей слабо разбираюсь, поэтому мысль о кейгене откинул сразу. Посмотрев в инете, увидел, что есть кряки для версии 6.2 и ниже. Очевидно, генерация ключа там - не слабая.
Потом я уже посмотрел, как там все это закручено. При скармливании регфайла, прога берет username и userkey и пишет их в реестр. Потом из этих двух ингридиентов замешивает коктейль. Потом в него добавляется usercode0 и опять мешается. Потом... Короче чего там должно получиться на выходе - хрен его знает. Потому что прога по ходу всех этих вычислений записывает промежуточные значения, сверяет одно с другим и т.д. и т.п. И пойди разберись,- что надо, а что нет. Тем более для такого чайника, как я - это не по силам. Остаётся один способ - отломать проверку регистрации. Что и было мной осуществлено в течении получаса. Далее будет объяснение для тех, кто совсем новичок. Остальные могут закрывать.

При запуске прога лезет в реестр, читает имя и ключ, мешает коктейль, и на основе полученного "пойла" делает вывод: "Демо" или "Недемо". Если демо, то выбрасывает окно(в данном случае наг - не совсем подходит) с кнопочками и таймером. Отсюда вывод - окно - непосредственный результат проверки регистрации. Найдя вызов окна, мы найдем и проверку. Как поймать окно, я описывать не буду(если кто-то и этого не знает, ищите по сайту). Вот вы поймали окно, скажем на CreateWindowExA. Ставьте бряк на Ret, и вы попадете в функцию, которая вызвала функцию вызова окна(не хилый каламбурчик =)).И по этому же принципу поднимайтесь выше по дереву вызовов. Но вот обломс! В одном месте Ret уводит нас в какие-то дебри.Эта секция осталась от аспра. И посмотрев выше вы не увидите кола, который вызывал вашу функцию. Если вы станете в Оле на последнюю отловленную в нормальном коде ф-цию (назовем её Х), то в подсказке будет написано, что данная ф-ция вызывается из двух мест. Смело ставьте бряки на оба! Ни один не сработает. Мистика прям какая-то! Ф-ция сработала, а колы, из которых она вызывается-нет! Никакой мистики - тока хитрости аспростроения. Если поискать ссылки на данный адрес, то Оля покажет, что в некотором месте адрес ф-ции Х заносится в стек, а после него идет колл совсем в другое место. Если в этой ф-ции поставить бряк на RET, то попадем в секцию аспра. А вот оттуда уже и вызывается ф-ция Х, на которую мы глаз положили.
Не долго думая,- я убил колл, который шел после перемещения в стек адреса ф-ции Х. Почему? Ну а нах помещать в стек ненужную вещь? Значит - нужная. Значит дальше это дело юзается, потом делается вывод, что прога не зарегана и выбрасывается наг.
Точнее, я не убил колл, а сделал возврат из ф-ции(назовем её Y)на входе. Там стояло
Call куда-то
Test eax,eax
и т.д.
Ставим
Mov eax,1
Ret
И о чудо! Прога запустилась без нага и таймера.
Ну я, не долго думая, и не потестив прогу на работоспособность, отписал Тиму, чего и где нужно убить. И облажался. Как оказалось, прога конвертит файл в полном размере, но не завершается нормально. А выбрасывает окно, типа "Файл уже существует" и кнопочки "Заменить", "Пропустить", Переписать" и "Выход". Если нажать "Выход" или "Пропустить" то ничо не происходит. А если - "Заменить" или "Переписать", то прога уходит в бесконечный цикл, и переписывает файл снова и снова.
Вот - такасука. Как говорят японцы. Оказалось ф-ция проверки регистрации используется еще и для нормальной работы проги.Вот тут я и завис.=(

Не убивать ф-цию? Я пробовал и менять переходы. И убивать ф-ции, которые вызываются дальше. Прога, схавав ф-цию Y,- всегда запускалась в демо. Тогда я решил прикрутить нормальное завершение работы вместо окна "Файл уже существует". Но получал или стековерфлоу или "ошибка чтения по адресу". Все сводилось к тому, что без этой ф-ции Y -никак. И если б хоть понять, чего там прога делает... Ну вот, вызвала она эту ф-цию, та отработала, вернулась в секцию аспра. И дальше чего? Чо тут можно понять?
004CB025 66:9D POPFW
004CB027 68 6AB74700 PUSH Awave_Au.0047B76A
004CB02C 66:9C PUSHFW
004CB02E 51 PUSH ECX
004CB02F 2BCD SUB ECX, EBP
004CB031 B9 C2FE4100 MOV ECX, Awave_Au.0041FEC2
004CB036 83C9 DD OR ECX, FFFFFFDD
004CB039 C1D1 AB RCL ECX, 0AB ; Shift constant out of range 1..31
004CB03C B9 0EB54300 MOV ECX, Awave_Au.0043B50E
004CB041 8D4C14 39 LEA ECX, DWORD PTR SS:[ESP+EDX+39]
004CB045 2BCA SUB ECX, EDX ; ntdll.KiFastSystemCallRet
004CB047 83E9 39 SUB ECX, 39
004CB04A 8D4C08 06 LEA ECX, DWORD PTR DS:[EAX+ECX+6]
004CB04E 2BC8 SUB ECX, EAX
004CB050 6A E4 PUSH -1C
004CB052 51 PUSH ECX
004CB053 8D4C75 8B LEA ECX, DWORD PTR SS:[EBP+ESI*2-75]
004CB057 8BCC MOV ECX, ESP
004CB059 83C1 04 ADD ECX, 4
004CB05C 56 PUSH ESI
004CB05D 53 PUSH EBX
004CB05E 81EB 109A6AE1 SUB EBX, E16A9A10
004CB064 2BDF SUB EBX, EDI ; ntdll.7C910738
004CB066 81DB DE177CF0 SBB EBX, F07C17DE
004CB06C 8D5C0C 04 LEA EBX, DWORD PTR SS:[ESP+ECX+4]
004CB070 2BD9 SUB EBX, ECX
004CB072 83EB 04 SUB EBX, 4
004CB075 83C3 04 ADD EBX, 4
004CB078 6A 7C PUSH 7C
004CB07A 51 PUSH ECX
004CB07B 81F1 A6A167C4 XOR ECX, C467A1A6
004CB081 8D4C4B 1D LEA ECX, DWORD PTR DS:[EBX+ECX*2+1D]
004CB085 8D49 E3 LEA ECX, DWORD PTR DS:[ECX-1D]
004CB088 C1C9 89 ROR ECX, 89 ; Shift constant out of range 1..31
004CB08B 2B4C24 08 SUB ECX, DWORD PTR SS:[ESP+8]
004CB08F 8D4C04 2D LEA ECX, DWORD PTR SS:[ESP+EAX+2D]
004CB093 2BC8 SUB ECX, EAX
004CB095 8D49 D3 LEA ECX, DWORD PTR DS:[ECX-2D]
004CB098 8D4C08 04 LEA ECX, DWORD PTR DS:[EAX+ECX+4]

Думаю, так выглядит дифференциальное уравнение в машинном коде =)
И такой код идет на несколько экранов. Потом -один-два кола. Или пару переходов и опять...
Вобщем - тупик. Не знаю, ковырял её в это время Тим или нет, но подсказок от него не было. Наверное тоже был в тупике. В голову приходили мысли типа:" Надо найти переход на нормальное завершение" или "Надо сделать джамп в обход окна"Файл уже существует"" и т.д. Короче стандарный набор крекерских приколов, которые описаны в большинстве туторов.
А проблема решилась довольно просто.
Дело в том, что если в Оле стоять в секции кода, то из нее как бы не видно аспровской секции. И наоборот. А в секции, что осталась от аспра - нашлось два вызова ф-ции Y, которую я убил. Первый раз она вызывалась перед конвертацией, и если ее не убить, то конвертилось тока 60сек, а второй раз при завершении конвертирования.Занопить сам колл перед конвертацией? Ничего не дало, потому что проверка регистрации вызывается из нескольких мест. Занопил все вызовы ф-ции Y - прога вообще падает. Значит, надо сделать так, чтоб первый раз прога попадала на убитую ф-цию Y, а второй раз на рабочую. Надо просто переписать где-нить в пустое место убитую ф-цию Y, и исправить второй колл на начало этой записи! Вот и всё решение.
Собственно, весь баг здесь был в том, что с прогой нельзя было работать как с целой. Аспровская секция вроде как сама по себе. Поэтому и нападала такая тупость. Ищешь, скажем джамп, а его -нету. Переходишь в аспровскую секцию - а он там.
.
Итак - главная проблема решена. Прога не проверяет регистрацию, конвертит весь файл и нормально завершает работу. Осталась малость - ограничение на один файл за раз. Тут тоже я застрял. Но по другому. Нашел откуда вызывается окно с предупреждением об одном файле за раз. Кстати в Оле вы этого не найдете. Она в аспровской секции половину стрингов не находит, так как команда скажем
004C8DBC 8DB419 989C4800 LEA ESI, DWORD PTR DS:[ECX+EBX+489C98] показывает на нормальные секции. А Оля их почему-то не видит(это у всех так, или тока у меня?). Поэтому я для таких тяжелых случаев использую Иду. Вот в Иде я и нашел строку, поднялся по ссылкам к началу ф-ции и начал смотреть. Здесь ничего такого не было. Прыжок на это место происходил, если прога проверяла кол-во файлов, и их было больше одного. Проверка регистрации уже отработала и второй раз не вызывалась. А окно на ограничение кол-ва файлов вылазило. И файл конвертился только один. Вот такая хрень.
Между началом ф-ции и занесением в стек строки(которая сообщает об ограничении) всего три кола. Два в нормальные секции и один вида CALL NEAR EDI . Я уж не помню, но здесь вызывалась то ли ntdll, то ли user32. А вот два других кола нам интересны. В одном из них и определяется, что прога всеж таки не зарегана, и потому -один файл за раз.Причем проверка идет где-то в другом месте, а не в той ф-ции Y, что я убил. Вот такая хитрожопая защита. Методом научного тыка будем отрезать все ненужные вещи. Но - прога нам так весело сообчает: " а хуху не хохо?" Если убить второй из этих колов(сделать рет на входе),- то прога падает.Там дальше вызываются важные дела из кернела и нтдлл, поэтому я сделал вывод, что это необходимо для работы проги. А если первый - то "один файл за раз" так и остается. Изменение переходов ничего не дает. Тоже вроде тупик. Но тут я вспомнил(инструмент заработал =)), что убить ф-цию можно по разному.
MOV eax,1
RET
помещает в EAX - 1 и возвращает из ф-ции. Т.е. ф-ция может прыгать по всей проге, чего-то там делать, но в конечном итоге она должна вернуть 1 или 0. Не надо так орать! Я знаю, что это не всегда так, но в основном.
Вот мы и подсовываем 1. А если должен быть 0 ? Надо бы проверить. Что я и сделал.
XOR eax,eax
RET
В результате - прога получила то что хотела, считает себя зареганной и конвертит все, что нам надо.

Для тех кто в танке. Коротко - о главном.
1.Ловим наг.
2.Подымаемся вверх по коллам, пока не найдем проверку, и как следствие - вызов нага.
3.Убиваем ф-цию проверки.
MOV EAX,1
RET
Прога запускается как зареганная, но нормально не завершается.
4.Тупо пялимся в монитор.
5.Включаем инструмент и орем:"Эврика!".
6.Инструмент заработал, и мы понимаем, что надо отталкиваться от нашего патча.
7.Смотрим где юзаются измененные байты, и запоминаем. Можно записать.
8.Дописываем правильные байты в пустое место и переправляем нужный колл туда.
9.Для включения пакетной конвертации - убиваем ф-цию другим способом.
XOR EAX,EAX
RET - что возвращает в ЕАХ 0.
10.Пьём пиво(водку, кофе, колу, керосин).Нужное подчеркнуть.
Пункты 4 и 5 - можно пропустить.

Для чего я это написал? А вы посмотрите рейт последних статей. "Распаковка какой-то хрени", "По поводу распаковки другой хрени" и т.д. Распаковка - это, конечно хорошо. Ну а если прога не запакована? Или распаковал, а защита круче, чем
JE &*^*&^*&? Или распаковал, и сломал, а прога - глючит? Новичкам - неасилить. А вопросов :" сломал прогу, а она теперь..." - хватает.
Надеюсь мой пасквиль кому-нить поможет.

PS:Сам - не мастер, поэтому прошу помидорами не забрасывать. Не люблю помидоры.
Лучче - кетчупом.

stahh @lupuslone-yandex.ru







Обсуждение статьи: Не совсем стандартный взлом Awave Audio >>>


Комментарии к статье: Не совсем стандартный взлом Awave Audio

AlexZ 25.06.2006 13:43:52
Ещё одно подтверждение того что иногда новое - это вовремя вспомненое забытое старое:
mov eax, 1
ret

А ещё забавно читается: "порывшись в стрингах", "Оля покажет"... =)
---

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



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


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