Взламываем WinRar 2.05

Автор: (C) JAM

Вам всем наверное очень хорошо известен архиватор WinRar. Это версия архиватора RAR под ОС Windows 95/98. Сама проверка регистрационного имени и кода очень запутанная, но если хорошо присмотреться то можно (конечно не с первого раза) обнаружить очень слабое место в защите программы. С помошью всеми нами любимого SoftICE 4.0 и W32Dasm а также HIEW 6.11 можно очень быстро заставить прогу вам поверить и зарегистрировать вас с любым именем и номером.

Ну что же, приступим к делу. Прежде всего любой взломщик тщательно изучаеть взламываемый объект. Начнем с того (довольно однообразное действие), что попытаемся ввести свои данные в поле (Enter your registration (AV) text) и любой код от фонаря в поле (Enter your registration code). Например я ввел JAM в поле имени и код 1234. Жмем OK и что-же. Довольно глупое сообщение о том что вы что-то неправильно сделали и Registration Failed. Запускаем W32Dasm и смотрим импортируемые функции. Ага. из библиотеки USER32 наша прога импортирует функции GetDlgItemTextA .

Это должно навести вас на мысль что прога откуда-то получает текст, а возможно - имя регистрации и код. Ладно, активизируем SoftICE (Ctrl+D для тех кто не знает) ставим точку останова на функции GetDlgItemTextA командой bpx GetDlgItemTextA. Теперь запускаем WinRar и пробуем зарегистрится снова. Жмем OK. Ура сработало - мы в начале функции. Значит с помошью этой функции WinRar и получает имя и код. Жмем F12 чтобы возвратиться в место откуда была вызвана функция.

Примерно это выглядит так :

Попробуем выполнить переход по этому адресу, немного перейдя вниз можно наткнуться на интересный кусок кода. Внимательно присмотритесь к коду начиная с адреса 00413C4A. Именно здесь и вызывается функция, в которую передаются двумя параметрами имя и код. Вызывается эта функция по адресу 00413C55. Дотрассировав SoftICE'ом до этого места можно убедится в том что ваше имя и рег. код находятся в стеке, откуда потом и используются функцией.

Примерно эту функцию я описал так:

function Check_Registration (Char* RegName. Char* RegCode ); stdcall ;

Параметры функции передаютя в функцию в обратном порядке, согласно правилам языка C/C++ (для тех кто этого еще не знает).

Идем дальше. Интересно а что это за проверка eax на 0 сразу после вызова функции. Уж не возвращает ли функция в регистре eax 0, если регистрация неправильная и 1, если правильная.

Убедится в том что здесь и выполняется проверка, помогают следующие строки. Предлагаю всмотреться в них повнимательнее. Наверное невооруженным глазом видно что если в eax возвращается 0 то перехода не будет и на экран будет выведено сообщение о том что Registration Falied. Ну а если в eax 1, то мы зарегистрированы.

Что может быть проще как исправить команду jne 00413C93 на jmp 00413C93 и все в порядке. Запускаем HIEW. открываем файл winrar95.exe и нажимаем F5 чтобы перейти на нужный нам адрес. Набираем .00413C5F жмем Enter и видим знакомый

текст. Для тех кто не знает как править код поясняю. Жмем сначала F3, потом F2 и вводим нужную нам команду. Жмем F9 чтобы записать изменения. Пробуем зарегистрироваться еще раз. Вау. Получилось, работает. Выглядит это так:

Казалось что нам еще нужно. Выходим из программы чтобы проверить исчезла ли дурацкая строчка evaluation copy в заголовке окна. Не тут-то было. Похоже разработчики программы не полные дураки.

При последующем запуске видим следующее (внимание на заголовок окна):

Что же будем думать дальше. Логика подсказывает что где при запуске программа делает еще одну проверку на правильность регистрации. А то ведь так можно просто текст в ini - файле подправить и все. Кстати вот и кусок текста в файле Rar.ini

Снова запускаем W32Dasm и ищем где еще вызывается функция находящаяся по адресу [0040A4A5] Ну как. Вызов происходит во всей проге всего 2 раза в начале и при самой регистрации. Вот кусок кода который исполняется при инициализации программы

Для тех кому интересно как же считывается имя и код может посмотреть дизассемблированный листинг немного повыше до того места где вызывается функция GetPrivateProfileStringA которая и считывает из файла rar.ini имя и код.

Ладно вернемся к нашему листингу. Надо найти место где выполняется проверка eax на 0 или на 1. Но что это, значение eax после вызова функции нагло затирается на 1. Выглядит это так

Уж не хотят ли разработчики чтобы прога всегда оставалась зарегистренной. Оказывается нет. Не хотят. Видать как я уже писал они не полные дураки. Проверок eax на 1 или 0 дальше не оказалось. Теперь пришло время обратиться к тексту самой функции которая скрывается под адресом [0040A4A5]. Тело самой функции крайне неинтересно, т.к. в нем выполняется множество всевозможных проверок и модификации имени и кода, но вот кусок кода в самом конце функции наводит на определенные размышления. Вот он:

Значит результат проверки записывается в глобальную переменную по адресу [0042575C] ну а потом еще записывается и в eax. И значит где-то при инициализации проверяется не значение eax а эта переменная. На этой переменной и стоит нам остановиться. В W32Dasm делаем поиск строки [0042575C] и что же. Их встречается довольно много, 5-8, может больше (не считал). Теперь исследуем эту переменную на предмет модификации. Во всех случаях, когда W32dasm находит эту переменную, смотрим изменяется она или нет. Я нашел что она изменяется только в двух местах. Но внимание должно привлечь только одно место. А вот и это место:

Теперь все сводится простому. Исправляем в редакторе HIEW две команды sete cl и and ecx, 0000001 на команду mov ecx, 00000001. Пробуем еще раз выйти из программы и запустить ее снова.

И что же. Наши старания вознаграждены - программы работает безо всяких ограничений и регистрит кого угодно.

Вот так выглядит окно зарегистренного WinRar:

Источник: www.inattack.ru

Категория: Электронная почта

Похожие статьи: