КомиПорт.РУ - Социальная сеть Сыктывкар / Республика Коми
Регистрация Авторизация В избранное
 
 
Авторизация
Логин:
Пароль:
Запомнить
Забыли пароль?
Меню

ЛОЛЧТО? Или возврат к INT

Автор: Boxxy
Опубликовано: 575 дней назад (28-07-2010 15:01)
Рубрика: Без рубрики
Настроение: Осторожно ступаю по своим мечтам
Играет: Morphadron - Cold Fusion Power
+2
Голосов: 2
Если вы программировали во времена MS-DOS, то должны помнить, что большинство системных вызовов использовали вызов int 21h(а UNIX-системы используют до сих пор int 80h). К чему бы я начала этот разговор? Да вот общалась я тут на днях с одним разработчиком и зашел разговор о софте с кучей плагинов и как реализовывать надежную работу плагинов и ядра софтины. Мне вспомнился один из приемов который года четыре назад описывал Крис Касперски и насколько я помню еще были упоминания.

Суть приема в том, что код, вызывающий int, не имеет и малейшего представления по какому адресу находится системный обработчик. И самое хорошее здесь то, что адрес может динамически меняться. Стоит сказать, что и Windows вплоть до XP версии использовала int как мостик между userl-land и kernel-land, позволяя прикладному уровню использовать системные вызовы.

Интересно, что использование int позволяет отсечь легальную возможность написания плагинов-фильтров встраивающихся между легальными плагинами и ядром(та часть программы к которой подключаются плагины).

И тут как нельзя кстати подходит int, но, во-первых это системно-зависимо и абсолютно не переносимо. Во-вторых, вызывать int с прикладного уровня на прикладной уровень не кошерно. Существует более красивый способ сделать это:
1. Основная программа устанавливает обработчик исключений
2. Плагин для вызова функций программы производит запись особой структуры по нулевому указателю, что приводит к генерации исключения перехватываемой(и обрабатываемого) основной программой.
В итоге программа может динамически переназначать обработчики исключения в зависимости от текущих режимов работы. Тоже самое могут делать и плагины. Устанавливая свой обработчик, перекрывающий предыдущий обработчик, они перехватывают сообщение основной программы со всей цепочкой плагинов-фильтров.

И в заключении пример структуры.
struct foo
{
   char magic[] = "FFUUU";
   //здесь присутствует сильное колдунство
   int syscall_id;
   //номер системного вызова
   void *list
   //указатель на список аргументов системного вызова
}

Вместо номера системного вызова можно использовать имена. Аргументы передаются и возвращаются через *list, формат которого может изменяться.
Консольщица | Ты совершенно не понимаешь сути электроники
Теги: лолчто?

Загрузка комментариев...

 
 
InstantCMS