Реализация защиты с помощью перехвата функций
NDIS - библиотеки
Этот метод является трудоемким, совершенно не документированным,
но в то же время чрезвычайно эффективным.
Реализация этого метода позволяет создать как бы оболочку над самой библиотекой
NDIS. Этот метод аналогичен методу перехвата системных сервисов. В данном
случае заменяются адреса необходимых функций библиотеки NDIS, в результате
чего можно получить контроль над всеми сетевыми операциями в системе.
Рассмотрим упрощенно, какие NDIS-функции вызываются во время загрузки
сетевых драйверов. Сначала инициализируется драйвер сетевой карты, при
этом для него вызывается функция NdisMInitializeWrapper, предупреждающая
NDIS о том, что инициализируется новый минипорт (драйвер сетевой карты).
Затем вызывается функция NdisMRegisterMiniport, которая регистрирует точки
входа MiniportAjcx минипорта для NDIS-библиотеки. Далее вызывается точка
входа в драйвере сетевой карты Miniportlnitialize, которая готовит реальную
или виртуальную сетевую карту для выполнения сетевых операций ввода/вывода,
запрашивает все аппаратные ресурсы, необходимые сетевой карте, и размещает
ресурсы, необходимые драйверу для выполнения сетевых операций ввода/вывода.
Затем начинают инициализироваться драйверы протоколов TCP/IP, NETBEUI,
IPX/ SPX и т.д. Для каждого из них вызывается функция NdisRegisterProtocol,
которая регистрирует точки входа ProtocoLAjcc драйвера и имя протокола
для библиотеки NDIS.
После инициализации драйвера протокола и драйвера сетевой карты вызывается
функция NdisOpenAdapter, которая устанавливает связь между вызвавшим эту
функцию протоколом и определенным нижележащим драйвером сетевой карты
или промежуточным драйвером. А затем уже начинается обмен пакетами между
драйвером протокола и драйвером сетевой карты.
Из приведенного выше процесса инициализации сетевых драйверов видно, что,
перехватив вызовы таких функций как NdisMInitializeWrapper, NdisMRegisterMiniport,
NdisRegisterProtocol, NdisOpenAdapter, можно отследить загрузку сетевого
драйвера, и установить адреса своих обработчиков для точек входа MiniportXxx-процедур
(например, Miniportlnitialize, MiniportQuery Information, MiniportSetlnformation,
MiniportSend, MiniportSendPackets, MiniportTransferData и т.д.) и для
точек входа ProtocolXxx-процедур (например, ProtocolBindAdapter, ProtocolReceive,
Protocol ReceiveComplete, ProtocolSend Complete, ProtocolTransferDataComplete,
ProtocolStatus, ProtocolPnPEvent, ProtocolReceiyePacket, ProtocolUnbindAdapter,
ProtocolUnload и т.д.), а затем контролировать все сетевые операции ввода/вывода,
проходящие через него.
Важно, чтобы ваш драйвер, который должен заменить адреса NDIS-функций
в таблице экспорта библиотеки NDIS на адреса собственных обработчиков,
загружался сразу после загрузки драйвера Ndis.sys. Иначе, к моменту загрузки
вашего драйвера может уже произойти инициализация некоторых сетевых драйверов.
|