русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Подавление NAG'а


Дата добавления: 2015-06-12; просмотров: 1100; Нарушение авторских прав


Всякий диалог выводится не сам по себе (это ведь не кошка), а отображается некоторой API-функцией. Перехватив API-функцию, выводящую NAG, мы сможем дизассемблировать защитный код, который ее вызывает, и проанализировать условия, определяющие появление NAG'а на экране.

Существует множество API-функций, связанных с диалогами: CreateDialog, DialogBox, MessageBox и т.д. Какую из них использовал разработчик RAR'а? Чтобы не гадать, воспользуемся API-шпионом. Он все покажет. Только сначала настроим фильтр, чтобы Kerberos отбрасывал малоинформативные API-вызовы, захламляющие файл отчета. Откроем ke_spy.txt и закомментируем следующие функции: TlsGetValue, DefWindowProcA, DispatchMessageA, GetFocus, GetMessageA, SendMessageA, SendMessageW, TranslateAcceleratorA, TranslateAcceleratorW и TranslateMessage (чтобы закомментировать функцию, перед ее именем вставляется знак ';'). Для усиления фильтрации имеет смысл зайти в Опции (кнопка "options") и взвести флажок "report only .exe calls", чтобы собирать API-вызовы только из winrar.exe, но не из загружаемых им DLL. Если этого не сделать, ничего страшного не произойдет, но файл отчета получится слишком большой и удручающе ненаглядный.

Рисунок 2.Настройка фильтра перед запуском шпиона.

Теперь нажимаем Browse, указываем путь к RAR'у и давим Inject. Дождавшись появления NAG'а на экране, выходим из RAR'а и открываем файл отчета WinRAR.rep, находящийся в одном каталоге с RAR'ом.

Рисунок 3.API-шпион kerberos, готовый к работе.

Изучение файла-отчета (см. листинг 1) лучше начинать с конца (ведь NAG-screen появляется в последнюю очередь, когда основной интерфейс уже инициализирован). Только слепой не обнажит вызов функции DialogBoxParamA, выводящей диалог с грозным именем "REMINDER" (то есть, "напоминатель"). Она-то этот противный диалог и создает. Да... с фантазией у разработчиков защит всегда были напряги.



WinRAR.exe|0044B030|LoadAcceleratorsA(00400000, 00496BA8: "VIEWACC") returns: 001E006F

WinRAR.exe|00440F73|DialogBoxParamA(400000,495FE1:"REMINDER",70094,444FF4,0) returns:0

WinRAR.exe|00440F9B|WaitForSingleObject(00000110, 0000000A) returns: 00000102

Листинг 1.Фрагмент файла отчета.

Kerberos (вот умница!) даже сообщает адрес возврата из функции - 440А73h, ведущий прямо к защитному коду. Заглянем сюда дизассемблером? Загружаем winrar.exe в IDA PRO и давим <G> (Jump to address), "440A73", <Enter>.

Рисунок 4.Защитный код, исследуемый в дизассемблере IDA PRO.

Отчетливо виден вызов DialogBoxParamA, выше которого находится следующий дизассемблерный код:

00440F1D cmp dword_4B3A90, 0

00440F24 jnz short loc_440F73

00440F26 cmp byte_495A60, 0

00440F2D jnz short loc_440F73

00440F2F cmp byte_4B7E00, 0

00440F36 jnz short loc_440F73

00440F38 cmp byte_49F9BC, 0

00440F3F jnz short loc_440F73

00440F41 mov eax, dword_004B43C8

00440F46 cmp eax, 28h

00440F49 jg short loc_440F4F

00440F4B test eax, eax

00440F4D jge short loc_440F73

00440F4F

00440F4F loc_440F4F: ; CODE XREF: sub_4408C8+681^j

00440F4F mov byte_495A60, 1

00440F56 push 0 ; dwInitParam

00440F58 push offset sub_444FF4 ; lpDialogFunc

00440F5D push dword_4B161C ; hWndParent

00440F63 push offset aReminder ; lpTemplateName

00440F68 push hLibModule ; hInstance

00440F6E call DialogBoxParamA

00440F73 loc_440F73: ; CODE XREF: sub_4408C8+65C^j

00440F73 ; sub_4408C8+665^j ...

00440F73 cmp dword_4B3A90, 0

Листинг 2.Дизассемблерный листинг защитного механизма (фрагмент).

Как мы видим, функция DialogBoxParamA вызывается, когда выполняется условный переход: cmp eax, 28h/jg loc_440F4F (прыжок, если eax > 28h). В десятичной системе 28h равно 40. Это и есть срок демонстрационного периода, положенный нам по праву. Теперь становится понятен "физический" смысл переменной dword_004B43C8, содержащей количество дней, прошедших с момента установки программы.

Открываем свежее пиво! Штаб-квартира защитного механизма найдена! Как мы будем действовать? Чтобы заблокировать NAG, можно, например, изменить cmp eax,28h (83 F8 28) на xor eax,eax/nop (33 C0/90), тогда eax всегда будет равен нулю независимо от того, какой день сейчас за окном, ну а команда nop понадобилась нам для того, чтобы скомпенсировать уменьшение длины инструкции (cmp занимает три байта, а xor - только два).

Запускаем hiew, загружаем winrar.exe, дважды нажимаем на <ENTER> чтобы перейти в ассемблерный режим, давим <F5> (goto) и пишем ".440F46" - адрес инструкции cmp, ну а точка здесь затем, чтобы сообщить hiew'у, что это именно адрес, а не смещение в файле. Нажимаем <F3> для перехода в режим редактирования (edit), а затем <ENTER> для ввода ассемблерной инструкции. В появившемся диалоговом окне пишем "xor eax,eax" <ENTER> "nop" ESC>. Сохраняем все изменения в файле нажатием <F9> и выходим.

Рисунок 5.Три байта, блокирующие NAG.

Запускаем winrar. Теперь NAG уже не выводится! Весь взлом не занял и десяти минут! Как вариант, можно заменить mov eax, dword_004B43C8 (A1 C8 43 4B 00) на mov eax, 6 (B8 06 00 00 00) и тогда RAR будет считать, что с момента регистрации всегда прошло ровно шесть дней. Почему именно шесть? Ну, не шесть, так девять. Какая нам разница?! Главное, чтобы не больше 40! А еще можно заменить jg short loc_440F4F (7F 04) на jmp short loc_440F73 (EB 28), тогда безусловный переход будет перескакивать диалог независимо от текущего времени.

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



<== предыдущая лекция | следующая лекция ==>
Введение | Принудительная регистрация


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.34 сек.