Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Пример взлома: WinRAR

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #057, стр. 057-048-4


DoRegister proc near

0044A299 call sub_40DB5C

0044A29E test al, al

0044A2A0 jz short loc_44A2B6 ; продолжение регистрации

0044A2A2 mov al, 1

0044A2A4 mov edx, [ebp+var_11C]

0044A2AA mov large fs:0, edx

0044A2B1 jmp loc_44A40D ; на вход из функции

Если sub_40DB5C возвращает ноль, функция DoRegister продолжает регистрацию. Ненулевое значение приводит к немедленному выходу из функции. Логично предположить, что sub_40DB5C просто сообщает статус регистрации: ноль - не зарегистрирован, не ноль - зарегистрирован. Подведем курсор к началу sub_40DB5C и переименуем ее в "IsRegistered".

А давай заставим IsRegistered всегда возвращать ненулевое значение! Тогда программа будет признана зарегистрированной, несмотря на то, что ключевого файла, заверенного электронной подписью, у нас нет (да и откуда бы ему взяться)!

Запускаем HIEW, дважды нажимаем <ENTER> для перехода в дизассемблерный режим, давим <F5>, вводим ".40DB5C" (адрес функции IsRegistered), затем <F3> для перехода в режим редактирования и <ENTER> xor eax,eax <ENTER> inc eax <ENTER> retn <ESC> (обнулить регистр eax, тут же увеличить его на единицу и свалить из функции). Записываем изменения клавишей <F9> и выходим из редактора.

Надпись "evaluation copy" в заголовке окна послушно исчезает, а в окне About появляется строка "Registered to".

Укрощение about'а

Надпись "Registered to" - это, конечно, хорошо, только непонятно, на кого именно зарегистрирована программа. Первое, что приходит на ум - найти этот "Registered to" в программе (он там находится по смещению 50DBA4h) и заменить его на "hacked by KPNC", однако более длинный ник вместить уже не удастся, поскольку предельно допустимая длина строки жестко ограничена. Лучше найдем тот код, который выводит эту строку, и немного подкорректируем его!

Запускаем Kerberos, загружаем winrar.exe, открываем "About", закрываем winrar.exe и лезем в протокол, в конце которого содержится строка DialogBoxParamA(400000, 496005: "ABOUTRARDLG", 001200AA, 00444618, 00000000), вызываемая по адресу 441D1Ch. Ага, это наш About Rar Dialog и есть! Возвращаемся в ИДУ и переходим по указанному адресу.

00441D01 push offset sub_444618 ; lpDialogFunc

00441D06 push dword_4B161C

00441D0C push offset aAboutrardlg

00441D11 push hLibModule

00441D17 call DialogBoxParamA

Функция sub_444618, как и подсказывает IDA, представляет собой процедуру, ответственную за вывод диалога. Заглянем, что там? Ой-ой-ой, сколько всяких вызовов! Это же крышей поехать можно, пока разберешься, что к чему! Мы видим множество вызовов SetDlgItemTextA. Какой из них наш? Чтобы ответить на этот вопрос, требуется выяснить идентификатор соответствующего элемента управления.

Запускаем Microsoft Visual Studio (или любой другой редактор ресурсов), говорим "open file", в "Типе файлов" выбираем "Все файлы", а в Open as – Resources (если этого не сделать, файл будет открыт как двоичный, что совсем не входит в наши планы). В дереве ресурсов находим ветку "Dialogs", а в ней "ABOUTRARDLG". Дважды щелкаем по нему мышью или просто жмем <ENTER>. Запустится редактор ресурсов. Находим строку "40 days trial copy", на месте которой в зарегистрированной версии выводится "Registered to", и, вызвав контекстное меню, определяем ее ID. В нашем случае он равен 102 (или 66 в HEX-представлении).

Назад на стр. 057-048-3  Содержание  Вперед на стр. 057-048-5