|
ЛОЛЧТО? Или возврат к INT
Опубликовано: 575 дней назад (28-07-2010 15:01)
Настроение: Осторожно ступаю по своим мечтам
Играет: Morphadron - Cold Fusion Power
|
|
Если вы программировали во времена 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, формат которого может изменяться.
|
|
Голосования
|
|
Вам нравится жить в Республике Коми? Да, все замечательно (4)Да, но не всё нравится (4)Нет, но я останусь здесь жить (1)Нет, я хочу уехать (2)Я никогда не жил в Коми (2)
|
|