Суббота, 29.08.2026, 00:53
Главная
Регистрация
Вход
Music
Приветствую Вас Гость | RSS
Меню сайта
 Разделы
Мои статьи [18]
MP3-Плеер
Get Your Own Player!
Наш опрос
Как вам дизайн сайта?
Всего ответов: 44
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Мои статьи

Ломаем WinRAR
Вам всем наверное очень хорошо известен архиватор 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 чтобы возвратиться в место откуда была вызвана функция. 
Примерно это выглядит так : 


* Reference To: USER32.GetDlgItemTextA, Ord:0000h 

:00413BF1 E8180D0100 Call 0042490E ; сначала происходит считывание рег. имени 
:00413BF6 8D459C lea eax, dword ptr [ebp-64] 
:00413BF9 50 push eax ; прячем адреса строк в стек 
:00413BFA 8D559C lea edx, dword ptr [ebp-64] 
:00413BFD 52 push edx 
* Reference To: USER32.CharToOemA, Ord:0000h 

:00413BFE E8210C0100 Call 00424824 ; вызываем функцию которая что-то вытворяет 
; с регистрационным именем (не суть важно, что) 
* Possible Reference to String Resource ID=00070: "Authenticity verification FAILED" 

:00413C03 6A46 push 00000046 
:00413C05 8D8D54FFFFFF lea ecx, dword ptr [ebp+FFFFFF54] 
:00413C0B 51 push ecx 
* Possible Reference to Dialog: ARCINFODLG, CONTROL_ID:0066, "Authenticity verification" 

* Possible Reference to String Resource ID=00102: "Unknown format" 

:00413C0C 6A66 push 00000066 
:00413C0E FF7508 push [ebp+08] 
* Reference To: USER32.GetDlgItemTextA, Ord:0000h 

:00413C11 E8F80C0100 Call 0042490E ; Тут прога получает сам код (1234) 
:00413C16 80BD54FFFFFF00 cmp byte ptr [ebp+FFFFFF54], 00 ; проверка длины полученной строки 
:00413C1D 751A jne 00413C39 ; переход если длина возвращаемой 
; не равна 0 
Попробуем выполнить переход по этому адресу, немного перейдя вниз можно наткнуться на интересный кусок кода. Внимательно присмотритесь к коду начиная с адреса 00413C4A. Именно здесь и вызывается функция, в которую передаются двумя параметрами имя и код. Вызывается эта функция по адресу 00413C55. Дотрассировав SoftICE'ом до этого места можно убедится в том что ваше имя и рег. код находятся в стеке, откуда потом и используются функцией. 

Примерно эту функцию я описал так: 
function Check_Registration(Char* RegName, Char* RegCode); stdcall; 

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

:00413C4A 8D8D54FFFFFF lea ecx, dword ptr [ebp+FFFFFF54] ; второй параметр (1234) 
:00413C50 51 push ecx ; адрес строки 
:00413C51 8D459C lea eax, dword ptr [ebp-64] ; первый параметр (JAM) 
:00413C54 50 push eax ; адрес строки 
:00413C55 E84B68FFFF call 0040A4A5 ; вызов функции 
:00413C5A 83C408 add esp, 00000008 ; коррекция стека 
Идем дальше ..... Интересно а что это за проверка eax на 0 сразу после вызова функции. Уж не возвращает ли функция в регистре eax 0, если регистрация неправильная и 1, если правильная. 

:00413C5D 85C0 test eax, eax ; проверка eax 
:00413C5F E92F000000 jne 00413C93 ; если 1 то переход 
Убедится в том что здесь и выполняется проверка, помогают следующие строки. Предлагаю всмотреться в них повнимательнее !!! Наверное невооруженным глазом видно что если в eax возвращается 0 то перехода не будет и на экран будет выведено сообщение о том что Registration Falied. Ну а если в eax 1, то мы зарегистрированы. 

:00413C68 0000 add byte ptr [eax], al 
:00413C6A 59 pop ecx 
:00413C6B 50 push eax 
* Possible Reference to Dialog: ARCINFODLG, CONTROL_ID:006A, "" 

* Possible Reference to String Resource ID=00106: "Registration failed" 

:00413C6C 6A6A push 0000006A 
:00413C6E E8F5640000 call 0041A168 
:00413C73 59 pop ecx 
:00413C74 50 push eax 
:00413C75 FF7508 push [ebp+08] 
* Reference To: USER32.MessageBoxA, Ord:0000h 

:00413C78 E86D0C0100 Call 004248EA 
:00413C7D 33D2 xor edx, edx 
:00413C7F 89155C574200 mov dword ptr [0042575C], edx 
:00413C85 891538564200 mov dword ptr [00425638], edx 
:00413C8B 89154C564200 mov dword ptr [0042564C], edx 
:00413C91 EB56 jmp 00413CE9 
* Referenced by a (U)nconditional or (C)onditional Jump at Address: 
|:00413C5F(U) 
* Possible StringData Ref from Data Obj ->"WinRAR" 

:00413C93 68DC6A4200 push 00426ADC 
:00413C98 FF35A0644200 push dword ptr [004264A0] 
* Reference To: USER32.SetWindowTextA, Ord:0000h 

:00413C9E E8C30B0100 Call 00424866 ; здесь мы станем зарегистрированными 
* Possible Reference to String Resource ID=00048: "Normal" 

:00413CA3 6A30 push 00000030 
* Possible Reference to Dialog: ARCINFODLG, CONTROL_ID:006C, "" 

* Possible Reference to String Resource ID=00108: "Correct registration" 

:00413CA5 6A6C push 0000006C 
:00413CA7 E8BC640000 call 0041A168 
:00413CAC 59 pop ecx 
:00413CAD 50 push eax 
* Possible Reference to Dialog: ARCINFODLG, CONTROL_ID:006B, "" 

* Possible Reference to String Resource ID=00107: "Thank you for support" 

:00413CAE 6A6B push 0000006B 
:00413CB0 E8B3640000 call 0041A168 
Что может быть проще как исправить команду jne 00413C93 на jmp 00413C93 и все в порядке. Запускаем HIEW, открываем файл winrar95.exe и нажимаем F5 чтобы перейти на нужный нам адрес. Набираем .00413C5F жмем Enter и видим знакомый текст. Для тех кто не знает как править код поясняю. Жмем сначала F3, потом F2 и вводим нужную нам команду. Жмем F9 чтобы записать изменения. Пробуем зарегистрироваться еще раз.. Вау !!!! Получилось, работает !! Выглядит это так: 

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

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

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

:00408045 6880AD4200 push 0042AD80 ; наше 1234 
:0040804A 6830AD4200 push 0042AD30 ; и соответственно JAM 
:0040804F E851240000 call 0040A4A5 ; вызов проверки 
:00408054 83C408 add esp, 00000008 ; коррекция стека 
Для тех кому интересно как же считывается имя и код может посмотреть дизассемблированный листинг немного повыше до того места где вызывается функция GetPrivateProfileStringA которая и считывает из файла rar.ini имя и код. 

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

:00408057 B801000000 mov eax, 00000001 ; здесь в eax записывается 1 
:0040805C 5F pop edi ; дальше не интересно 
:0040805D 5E pop esi 
:0040805E 5B pop ebx 
Уж не хотят ли разработчики чтобы прога всегда оставалась зарегистренной. Оказывается нет. Не хотят. Видать как я уже писал они не полные дураки. Проверок eax на 1 или 0 дальше не оказалось. Теперь пришло время обратиться к тексту самой функции которая скрывается под адресом [0040A4A5]. Тело самой функции крайне неинтересно, т.к. в нем выполняется множество всевозможных проверок и модификации имени и кода, но вот кусок кода в самом конце функции наводит на определенные размышления. Вот он: 

:0040A77D C60300 mov byte ptr [ebx], 00 ; неинтересно 

:0040A780 A15C574200 mov eax, dword ptr [0042575C] ; ВОТ ТУТ !!! 
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses: 
|:0040A4FF(U), :0040A53C(U) 

:0040A785 5F pop edi ; Стандартное завершение функции - 
:0040A786 5E pop esi ; восстановление всех регистров 
:0040A787 5B pop ebx 
:0040A788 8BE5 mov esp, ebp 
:0040A78A 5D pop ebp 
:0040A78B C3 ret ; возврат из функции 
Значит результат проверки записывается в глобальную переменную по адресу [0042575C] ну а потом еще записывается и в eax. И значит где-то при инициализации проверяется не значение eax а эта переменная. На этой переменной и стоит нам остановиться. В W32Dasm делаем поиск строки [0042575C] и что же. Их встречается довольно много, 5-8, может больше (не считал). Теперь исследуем эту переменную на предмет модификации. Во всех случаях, когда W32dasm находит эту переменную, смотрим изменяется она или нет. Я нашел что она изменяется только в двух местах. Но внимание должно привлечь только одно место. А вот и это место: 

:0040A716 0F94C1 sete cl 
:0040A719 83E101 and ecx, 00000001 
:0040A71C 890D5C574200 mov dword ptr [0042575C], ecx ; модификация [0042575C] 
:0040A722 FF353C574200 push dword ptr [0042573C] 
Теперь все сводится простому. Исправляем в редакторе HIEW две команды sete cl и and ecx, 0000001 на команду mov ecx, 00000001. Пробуем еще раз выйти из программы и запустить ее снова. 

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

Категория: Мои статьи | Добавил: musi4ka (10.03.2009)
Просмотров: 815 | Рейтинг: 1.0/1 |
Всего комментариев: 0
Имя *:
Email *:
Код *:

Форма входа

Name:


Password:





Форма входа

Суббота
29.08.2026
00:53


Форма входа


| Качаемся на здоровье! :) © 2026 | |

glitter link generator