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

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

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

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


Наиболее красивым взломом считается тот, в результате которого в файл было введено минимум исправлений. Двумя байтами мы смогли отучить программу от надоедливого диалога, однако можно было управиться и с помощью одного. Найти его, скорее всего, не составит большого труда.

Принудительная регистрация

Несмотря на то, что раздражающий NAG успешно ликвидирован, программа остается незарегистрированной и честно пишет в заголовке окна: "evolution copy". А если нажать About, мы увидим "40 days trial copy". И хотя никаких ограничений в демонстрационной версии нет, чисто психологически работать с зарегистрированной копией намного приятнее.

Известно, что регистрация осуществляется с помощью ключевого файла с электронной подписью, сгенерированной на криптографической основе с таким расчетом, чтобы подделка ключа была невозможной. Все это так, но нам же не нужен ключ! Мы хотим установить флаг регистрации! А как его найти? Вернемся к защитному механизму.

Выше уже известной нам инструкции "cmp eax, 28h" ополчилась целая серия условных переходов, при определенных обстоятельствах перепрыгивающих через этот противный диалог. Очевидно, один из них принадлежит флагу регистрации (у зарегистрированных пользователей NAG не выводится), но как определить, какой именно?

Разберемся со всеми по порядку. Назначение переменной byte_495A60 определяется сразу. При выводе диалога сюда записывается 1, то есть диалог уже выведен и выводить его повторно не нужно. С переменной dword_4B3A90 все гораздо сложнее. Чтобы узнать, кем она используется и для чего, необходимо просмотреть перекрестные ссылки. Подводим курсор к имени переменной, вызываем контекстное меню и выбираем пункт "jump to xref to operand" или просто нажимаем <X>. Появляется окошко с кучей информации.

Фу! Куча перекрестных ссылок по чтению (r) и записи (w), разбросанных по всему телу программы, среди которых доминируют dec и inc. На флаг регистрации это мало похоже. Скорее, это какой-то дикий семафор, используемый для организации взаимоблокировок. В общем, запчасть от интерфейса.

К переменной byte_4B7E00, ведут три ссылки, две из которых находятся в непосредственной близости от функции DoDragDrop, так что их можно откинуть сразу.

А вот переменная byte_49F9BC - это настоящий клад. К ней ведет множество перекрестных ссылок на чтение и запись, но все записываемые значения возвращаются либо функцией sub_40DB5C, либо sub_44A278. При первом же взгляде на sub_44A278 бросаются в глаза текстовые строки "rarkey", заботливо оформленные дизассемблером как комментарии. Ага! Похоже, это и есть процедура, ответственная за регистрацию. Подводим курсор к ее началу, нажимаем <N> и переименовываем ее в "DoRegister".

С функцией sub_40DB5C разобраться тоже несложно. Достаточно проанализировать код, находящийся в самом начале DoRegister:

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