Техника защиты компакт-дисков от копирования



              

Передача управления на функцию обработки сообщений - часть 2


Что ж! Можно так подправить адрес возврата, чтобы он указывал на функцию ExitProcess!

Давайте создадим простейшее Windows-приложение и поэкспериментирует с ним. Запустив

Microsoft Visual Studio выберем "New à Project à Win32 Application" и там –— "Typical Hello, World application". Добавим новый пункт меню, а в нем: char *p; *p = 0; и откомпилируем этот проект с отладочной информацией.

"Роняем приложение на пол" и, запустив отладчик, подгоняем мышь к первой строке цикла обработки сообщений и в появившемся контекстном меню находим пункт "Set Next Statement". Нажимаем клавишу <F5> для возобновления работы программы и… она действительно возобновляет свою работу!

А теперь откомпилируем наш проект в чистовом варианте (т. е. без отладочной информации) и попробуем реанимировать приложение в "голом" машинном коде. Пользуясь тем обстоятельством, что Windows –— это действительно многозадачная среда, в которой крушение одного процесса не мешает работе всех остальных, запустим свой любимый дизассемблер (например, IDA Pro) и проанализируем таблицу импорта отлаживаемой программы (вообще-то это может сделать и бесплатно распространяемый утилитой dumpbin, но его отчет не так нагляден).

Целью нашего поиска будут функции TranslateMessage/DispatchMessage и перекрестные ссылки, ведущие к циклу выборки сообщений (листинг 3.15).

Листинг 3.15. Поиск функций TranslateMessage/DispatchMessage в таблице импорта

.idata:004040E0 ; BOOL __stdcall TranslateMessage(const MSG *lpMsg)

.idata:004040E0      extrn TranslateMessage:dword            ; DATA XREF: _WinMain@16+71^r

.idata:004040E0                                                   ; _WinMain@16+8D^r

.idata:004040E4 ; LONG __stdcall DispatchMessageA(const MSG *lpMsg)

.idata:004040E4      extrn DispatchMessageA:dword     ; DATA XREF: _WinMain@16+94^r

.idata:004040E8




Содержание  Назад  Вперед