Читать реферат по информатике, вычислительной технике, телекоммуникациям: "Защищаем Perl: шунт в мозг, или зверская нейрохирургия" Страница 4
эту таблицу.
Опираясь на эти ключевые слова, вы можете отыскать в Internet готовое решение, либо написать приложение-"перехватчик" самостоятельно. Получившийся у меня результат перехвата (я использовал компилятор Delphi, поскольку для языка C примеров можно найти достаточно) вы можете скачать по ссылке [1].
Внедрение защитной DLL
Чтобы "пристыковать" dll в адресное пространство процесса, я использую метод подмены DLL. Для этого я захожу ... правильно, текстовым редактором в исполняемый файл Perl.exe и исправляю подстроку Perl56.dll на romix1.dll (так мы назовем нашу защитную компоненту).
Пробую запускать Perl.exe. Конечно же, Perl пишет, что не найдена необходимая библиотека romix1.dll. Ну что же, создадим ее. Для этого скомпилируем программу из трех строк на Delphi, назвав ее romix1.dpr:
library romix1;
begin
end.
Этого недостаточно: теперь Perl при запуске выдает ошибку:
"Perl.exe связан с отсутствующим компонентом Romix1.dll:RunPerl".
Perl импортирует единственную функцию RunPerl из этой библиотеки, и мы ее сейчас создадим (наша "подделка" будет просто передавать управление на "оригинал"):
library romix1;
procedure RunPerlOrig; external 'Perl56.dll' name 'RunPerl';
//Это оригинальная функция RunPerl из библиотеки Perl56.dll.
procedure RunPerl; export; stdcall;
//Перехватчик функции RunPerl
begin
asm
jmp RunPerlOrig; //Делаем переход (jump)
end;
end;
exports RunPerl;
begin
//Расположенный здесь код будет выполняться при каждом запуске DLL
end.
Ассемблерная вставка делает переход, куда надо. Теперь ругательные сообщения прекратились, и изменений в работе Perl не видно. Зато мы достигли важного результата: наша dll стала полноправным членом (если не мозгом) исполняемого процесса Perl.exe. Дальнейшее становится делом техники (точнее, системных вызовов Windows API и нескольких "точечных" замен в таблице импорта Perl56.dll). Вы можете взять готовый код [1] и посмотреть, что у меня получилось.
Какие системные функции необходимо перехватывать?
Технология динамически компонуемых библиотек (DLL) существенно облегчает модификацию Windows-приложений (закрытый исходный код компенсируется тем, что все названия функций и точки их входа не только хорошо видны, но и доступны для изменения). Просматривать статический импорт DLL или EXE удобно при помощи утилиты dumpbin.exe из студии разработки Microsoft.
Пример вызова этой утилиты из командной строки:
dumpbin.exe /imports perl.exe
Программа выдаст список DLL и их функций, которые импортирует программа из этих DLL. Вот полезный нам фрагмент вывода этой утилиты:
Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Dump of file perl.exe
File Type: EXECUTABLE IMAGE
Section contains the following imports:
...
Perl56.dll
402038 Import Address Table
4020C0 Import Name Table
0 time date stamp
0 Index of first forwarder reference
3C3 RunPerl
...
Замечание: Из этого листинга мы видим, что программа импортирует библиотеку Perl56.dll Это большая и "тяжелая" динамическая библиотека, которая поддерживает все функции Perl; Perl.exe же фактически является небольшим загрузчиком для этой библиотеки, только лишь запуская ее единственную функцию RunPerl. Смысл такого разделения, видимо, в том, что при завершении работы Perl.exe система выгружает библиотеку из памяти лишь через несколько секунд, если к ней не будет новых обращений. Поскольку все запущенные копии Perl.exe используют только одну копию библиотеки, система экономит время на выгрузках-загрузках (при
Похожие работы
Интересная статья: Основы написания курсовой работы

(Назад)
(Cкачать работу)