Local Service Provider (LSP/SPI)

Мне часто задавали вопросы, связанные с функционированием сети, понятиями SPI, LSP, NSP … поэтому я решил создать этот раздел справочной системы и подробно расписать базовую теорию и то, как вредоносные программы могут повредить работу Winsock.
Условно схема работы Winsock отображена на рисунке:
 
Winsock 2 имеет как бы две "зеркальные стороны" - Winsock API и Winsock SPI. Winsock API предназначен для реализации архитектуры открытых систем Windows (WOSA), обладающей стандартными API интерфейсами между Winsock и использующими его приложениями. SPI - это интерфейс между Winsock и поставщиками служб Winsock.
 
Поставщики услуг SPI бывают двух типов:
·Поставщик пространства имен (Namespace Provider, NSP). Задача поставщика пространства имен  - независимое от протокола разрешение имен, т.е. преобразование дружественного имени в зависимый от протокола адрес. Классическим примером может являться DNS, который преобразует дружественное для пользователя имя www.z-oleg.com в IP адрес сервера, на котором размещен данный сайт;
·Поставщик транспорта (Transport Service Provider, TSP). TSP - это службы, предоставляющие функции установления связи, передачи данных, управления потоком, обработки ошибок и т.п. Поставщики транспортной службы бывают двух видов - базовые и многоуровневые. Базовые (Base) поставщики реализуют конкретные  детали сетевого транспортного протокола (типа TCP/IP), включая базовые сетевые функции протокола, такие как отправка и получение данных по сети. Многоуровневые (Layered) поставщики реализуют только высокоуровневые функции связи нуждаются в базовом поставщике для фактического обмена по сети;
 
Как видно из рисунка, поставщиков NSP и TSP может быть несколько (если точнее - то практически неограниченно много). Еще более интересно то, что список используемых LSP и TSP хранится в специальной базе данных (которая размещена в реестре). Более того, в Winsock API есть функции, которые позволяют программе не только получать списки LSP и TSP, но и регистрировать своих поставщиков.
 
С точки зрения физической реализации провайдер SPI является обычной DLL, разработанной по определенному стандарту - в частности, эта DLL обязана экспортировать ряд функций для взаимодействия с Winsock.
 
С одной стороны, хранение списка поставщиков и их параметров в базе данных и наличие функции для управления этой базой является очень грамотным шагом - любое приложение может инсталлировать свои провайдеры SPI, расширяя возможности Winsock. При этом прикладной программе совершенно не обязательно знать с том, какие конкретно провайдеры SPI и как именно обеспечивают разрешение имен и обмен по сети. Получается универсальная система, и многие программы используют эти возможности - при помощи AVZ нетрудно исследовать настройки SPI и посмотреть, какие провайдеры там зарегистрированы - в списке провайдеров можно обнаружить Firewall, антивирусы, разнообразные антишпионские программы, утилиты для борьбы с рекламой, учета трафика и т.п.
 
Однако теперь давайте посмотрим на SPI глазами разработчика вирусов и SpyWare/AdWare программ. Получается, что установив 2-3 провайдера  можно взять под контроль весть обмен компьютера с сетью. При помощи своего поставщика пространства имен вредоносная программа может отслеживать запросы на разрешение имени (собственно для шпионажа) и вмешиваться в этот процесс. Упрощенно говоря, к примеру вы запрашиваете адрес сайта www.yandex.ru, а "вражеский" NSP выдаст вместо этого IP адрес скажем адрес www.никому не известный поисковик.com Аналогичные "безобразия" можно устраивать на уровне поставщика транспорта - SpyWare чаще всего устанавливают свои Layered Service Providers - LSP. Получается, что открытость и универсальность SPI Winsock становится его уязвимым местом - создатели вредоносного ПО знают это и активно используют. Примеров очень много - Spy.NewDotNet (not-a-virus:AdWare.NewDotNet), Spy.SAHAgent, Spy.WebHancer, Trojan.Riler, Adware.SpywareNuker, Backdoor.Kika … - список можно продолжать достаточно долго. Кроме вмешательства в работу Winsock выполнение backdoor-компоненты в виде SPI имеет множество преимуществ - скрытный запуск, отсутствие видимого процесса.
 
Возможность установки вредоносной в качестве SPI провайдера - это еще только половина проблемы. Оказывается, что у Winsock есть очень неприятная особенность - любое повреждение базы данных в реестре с описанием поставщиков SPI приводит к сбоям в работе Winsock (конкретный вид сбоев зависит от характера повреждения, однако все ошибки для пользователя обычно сводятся к двум - компьютер перестает "видеть Интернет" и возникают проблемы при работе с локальной сетью - если проанализировать приведенную в начале данного раздела схему, то такие ошибки понятны и закономерны). Причин повреждения настроек SPI может быть очень много, наиболее характерные:
 
·Удаление DLL, являющейся провайдером SPI без отмены ее регистрации в базе провайдеров SPI (DLL может быть удалена вручную, антивирусным сканером, анти-шпионской программой, штатным деинсталлятором - способ удаления не важен);
·Повреждение базы в реестре в ходе инсталляции/деинсталляции SPI провайдеров, либо в результате  ручной "чистки" реестра.
 
При обнаружении ошибки Winsock в частности в вся система Windows в целом не принимают никаких мер по ее ликвидации и не выдают никаких диагностических сообщений. Важно отметить, что переустановка системы "поверх" имеющейся не приводит к исправлению настройки SPI.
 
Как видно из приведенного мной описания, термин LSP встретился пару раз - я вообще заострил на нем внимание из-за утилиты LSP Fix и кочующего по описаниям троянских и SpyWare программ термина "LSP" - его применение во многих случая не совсем корректно. Причем тенденции "исправления" терминологии постепенно появляются - в последних описаниях вирусов они начинают давать более корректные и конкретные термины типа "…Registers a Windows sockets SPI hook in the LSP chain named…". Поэтому "лечить" и восстанавливать необходимо именно настройки SPI, а не LSP …