16:47 Взламываем WinRar 2.05 | |
Вам всем наверное очень хорошо известен
архиватор 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'ом до этого места можно убедится в том что ваше имя и рег. код находятся в стеке, откуда потом и используются функцией. Примерно эту функцию я описал так: Параметры функции передаютя в функцию в обратном порядке, согласно правилам языка C/C++ (для тех кто этого еще не знает). :00413C4A 8D8D54FFFFFF lea ecx, dword ptr [ebp+FFFFFF54] ; второй параметр (1234) Идем дальше ..... Интересно а что это за проверка eax на 0 сразу после вызова функции. Уж не возвращает ли функция в регистре eax 0, если регистрация неправильная и 1, если правильная. :00413C5D 85C0 test eax, eax ; проверка eax Убедится в том что здесь и выполняется проверка, помогают следующие строки. Предлагаю всмотреться в них повнимательнее !!! Наверное невооруженным глазом видно что если в eax возвращается 0 то перехода не будет и на экран будет выведено сообщение о том что Registration Falied. Ну а если в eax 1, то мы зарегистрированы. :00413C68 0000 add byte ptr [eax], al Что может быть проще как исправить команду jne 00413C93 на jmp 00413C93 и все в порядке. Запускаем HIEW, открываем файл winrar95.exe и нажимаем F5 чтобы перейти на нужный нам адрес. Набираем .00413C5F жмем Enter и видим знакомый текст. Для тех кто не знает как править код поясняю. Жмем сначала F3, потом F2 и вводим нужную нам команду. Жмем F9 чтобы записать изменения. Пробуем зарегистрироваться еще раз.. Вау !!!! Получилось, работает !! Выглядит это так: Казалось что нам еще нужно. Выходим из программы чтобы проверить исчезла ли
дурацкая строчка evaluation copy в заголовке окна. Не тут-то было.
Похоже разработчики программы не полные дураки. Что же будем думать дальше. Логика подсказывает что где при запуске программа делает еще одну проверку на правильность регистрации. А то ведь так можно просто текст в ini - файле подправить и все. Кстати вот и кусок текста в файле Rar.ini [registration] Снова запускаем W32Dasm и ищем где еще вызывается функция находящаяся по адресу [0040A4A5] Ну как ...... Вызов происходит во всей проге всего 2 раза в начале и при самой регистрации. Вот кусок кода который исполняется при инициализации программы :00408045 6880AD4200 push 0042AD80 ; наше 1234 Для тех кому интересно как же считывается имя и код может посмотреть дизассемблированный листинг немного повыше до того места где вызывается функция GetPrivateProfileStringA которая и считывает из файла rar.ini имя и код. Ладно вернемся к нашему листингу. Надо найти место где выполняется проверка eax на 0 или на 1. Но что это, значение eax после вызова функции нагло затирается на 1. Выглядит это так :00408057 B801000000 mov eax, 00000001 ; здесь в eax записывается 1 Уж не хотят ли разработчики чтобы прога всегда оставалась зарегистренной. Оказывается нет. Не хотят. Видать как я уже писал они не полные дураки. Проверок eax на 1 или 0 дальше не оказалось. Теперь пришло время обратиться к тексту самой функции которая скрывается под адресом [0040A4A5]. Тело самой функции крайне неинтересно, т.к. в нем выполняется множество всевозможных проверок и модификации имени и кода, но вот кусок кода в самом конце функции наводит на определенные размышления. Вот он: :0040A77D C60300 mov byte ptr [ebx], 00 ; неинтересно Значит результат проверки записывается в глобальную переменную по адресу [0042575C] ну а потом еще записывается и в eax. И значит где-то при инициализации проверяется не значение eax а эта переменная. На этой переменной и стоит нам остановиться. В W32Dasm делаем поиск строки [0042575C] и что же. Их встречается довольно много, 5-8, может больше (не считал). Теперь исследуем эту переменную на предмет модификации. Во всех случаях, когда W32dasm находит эту переменную, смотрим изменяется она или нет. Я нашел что она изменяется только в двух местах. Но внимание должно привлечь только одно место. А вот и это место: :0040A716 0F94C1 sete cl Теперь все сводится простому. Исправляем в редакторе HIEW две команды sete cl и and ecx, 0000001 на команду mov ecx, 00000001. Пробуем еще раз выйти из программы и запустить ее снова. И что же ....... Наши старания вознаграждены - программы работает безо всяких
ограничений и регистрит кого угодно. Ну вот вроде и все. | |
|
Всего комментариев: 0 | |