Создаем Свой Сниффер/Firewall/Родительский Контроль/Spyware/Клиент Для Компьютерного Клуба. Лсп Технология



Создаем свой Сниффер/FireWall/Родительский контроль/SpyWare/Клиент для Компьютерного Клуба.

ЛСП технология

Создаем свой Сниффер/FireWall/Родительский контроль/SpyWare/Клиент для Компьютерного Клуба.
</p><p>
 ЛСП технология

Провайдер).

Недавно знакомый рассказал, что для его электронной комнаты (библиотеки) ему нужна программа, которая бы контролировала доступ к компьютерам и автоматически рассчитывала, кто, что и сколько делает. Так как денег в бюджете на 2012 год не было, друг повесил трубку.

Но меня уже заворожила идея контроля доступа.

Я начал думать, как это можно сделать.

Больше всего меня беспокоил один вопрос.

Как заблокировать HTTP-трафик, если пользователь платит только за аренду компьютера, а не за аренду компьютера с интернетом? В Интернете я нашел интересную статью о ЛСП и здесь представляю ее перевод с некоторыми изменениями.

Кому интересно, смотрите кат.



HTTP-сниффер на основе LSP (поставщик многоуровневых услуг)
В этой статье описывается, как создать простой сниффер для мониторинга HTTP-трафика в ОС Windows. Эта программа основана на открытой технологии Microsoft и называется LSP (Layered Service Provider).

Эта технология используется различным программным обеспечением.

В основном это антивирусы, межсетевые экраны и программы фильтрации трафика.

Для создания этого программного пакета я использовал пример из Microsoft Platform SDK (Program Files\Microsoft Platform SDK\Samples\NetDS\WinSock\LSP\) и добавил дополнительную функцию для фильтрации HTTP-трафика и сбора результатов в отдельном хранилище.

.

Концепция Базовая схема Мы начали Выводы и советы Полезные ссылки.



Концепция.

Основная идея ЛСП — создание провайдера, который будет включен в цепочку существующих провайдеров.

Это чем-то напоминает принцип Hook в Windows.

Создаем свой Сниффер/FireWall/Родительский контроль/SpyWare/Клиент для Компьютерного Клуба.
</p><p>
 ЛСП технология

Во время установки провайдера вы можете указать местоположение в цепочке провайдеров.

И цепочка будет перестроена по новым настройкам.

В нашем случае провайдер устанавливается поверх провайдера [TCP/IP].

Будьте осторожны при установке на реальную машину.

Если установка не удалась, это добавит множество проблем – потерю сети, Интернета и сбой некоторых сетевых приложений.

Чтобы обойти проблемы отладки и создания поставщика LSP, протестируйте его на виртуальной машине.

В поставщике LSP необходимо переопределить все методы библиотеки Winsock. Фактически, в примере Platform SDK логика замены уже включена; остается только добавить логику перехвата, блокировки URL-адресов или сохранения HTTP-трафика.

ПТУ используют как легальные программы, так и SpyWare/AdWare. Например: Юридические программы:

  • Сигейтский межсетевой экран
  • Персональный межсетевой экран Mcafee
  • Электронный сейф
  • Dr.Web Security Space 6 использует LSP в качестве модуля Родительского контроля.

Рекламное ПО:
  • Вебхансер
  • Нью.

    нет

  • НьюДотНет


Создаем свой Сниффер/FireWall/Родительский контроль/SpyWare/Клиент для Компьютерного Клуба.
</p><p>
 ЛСП технология



ЛСП в действии.



Базовая схема
Вот так выглядит базовая схема программного комплекса.



Создаем свой Сниффер/FireWall/Родительский контроль/SpyWare/Клиент для Компьютерного Клуба.
</p><p>
 ЛСП технология

После установки программного пакета многие программы будут использовать наш провайдер (как правило, наш провайдер представляет собой простой DLL-файл, который загружается в каждое приложение, использующее библиотеку Winsock).

Но нам нужно только обнаружить HTTP-трафик.

Ниже приведена строка кода (от нашего провайдера) с жестко запрограммированным портом, который будет отслеживаться (протокол HTTP по умолчанию использует порт 80).

  
  
  
  
  
   

if((namelen >= sizeof(sockaddr_in)) && (((sockaddr_in*)name)->sin_port == htons(HTTPPort))) { SocketContext->intercept = TRUE; }

Вы можете улучшить этот инструмент и сделать логику программы более элегантной для сохранения ваших настроек, а не строго определенных констант, как в примере.

Кроме того, мы должны определить HTTP-запросы.

HTTP-запросы GET определяются путем простого сравнения со строкой «GET».

Определение POST-запросов можно выполнить таким же образом.

У нас также есть Служба, которая собирает всю отфильтрованную информацию.

Служба была создана для предотвращения повреждения данных, которое может произойти, если мы будем отслеживать несколько приложений, а не только одно.

Вся перехваченная информация из браузера будет передана этому сервису.

Этот сервис представляет собой Socket-сервер (слушает порт 4004), поэтому проблем с синхронизацией сбора данных возникнуть не должно.

В данном случае Хранилищем Данных является просто текстовый файл, но его можно легко заменить более удобным и стабильным вариантом (например, использовать СУБД).



Мы начали
Тестовый пакет содержит следующие проекты.

1.Проект LSP (папка LSP) Этот проект содержит перегрузки основных методов Winsock. Здесь мы должны добавить наши изменения.

В моем случае этот проект содержит пример из Platform SDK, где я добавил логику определения подключения к порту 80 и пометил его как перехватываемый в методе Connect:

if((namelen >= sizeof(sockaddr_in)) && (((sockaddr_in*)name)->sin_port == htons(HTTPPort))) { SocketContext->intercept = TRUE; }

Таким образом, при будущих вызовах метода Send мы обнаружим, что этот сокет используется протоколом HTTP. Также мы установили соединение со Службой сбора трафика в методе Connect. В методе SEND мы реализовали логику обнаружения HTTP-запросов и перенаправления их в наш Сервис:

if (IsHTTPRequest(lpBuffers->buf) && SocketContext->intercept) { SetBlockingProvider(SocketContext->Provider); ret = SocketContext->Provider->NextProcTable.lpWSPSend( serviceConnection.GetSocket(), lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno ); SetBlockingProvider(NULL); }

Я создал специализированный класс, который поддерживает одно постоянное соединение для каждого загруженного файла DLL.

class ServiceConnectionKeeper;

Его роль — поддерживать соединение Socket. Таким образом, к службе хранения устанавливается только одно соединение.

2.Common project (Общая папка) — этот проект содержит все утилиты, представленные в примерах Platform SDK. А так же были проведены некоторые манипуляции с GUID от нашего LSP провайдера.

Проект Installer (папка Installer) — это установщик LSP. Мы изменили его основной метод — убрали парсинг командной строки и добавили поиск TCP-провайдера.

Теперь при установке ищем TCP ID провайдера и перестраиваем цепочку провайдеров.

Мы разместили нашего провайдера поверх TCP.

if (IsHTTPRequest(lpBuffers->buf) && SocketContext->intercept) { SetBlockingProvider(SocketContext->Provider); ret = SocketContext->Provider->NextProcTable.lpWSPSend( serviceConnection.GetSocket(), lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno ); SetBlockingProvider(NULL); }

3. Проект Service (папка Service) — сборщик трафика.

Это простая служба Windows и методы ее установки и удаления.

Функция MAIN нашего сервиса также реализует Socket-сервер.

Вся логика работы с сервисом была любезно позаимствована у MSDN. Сервер принимает все входящие соединения и запускает отдельный поток для каждого приложения.

Выполняемый поток получает данные, разделенные последовательным знаком «\r\n\r\n» (по сути, 2 пустые строки) и сохраняет их в хранилище.



do { result = recv(clientSocket, buffer, PACKSIZE, 0); if (result > 0) { response += std::string(buffer, result); do { position = response.find(messageTerminator); if (std::string::npos != position) { if (!CollectorServer::Instance()->SaveData(std::string(response.begin(), response.begin() + position))) { return -1; } response = response.substr(position + messageTerminator.size()); } } while (std::string::npos != position); } else { break; } } while (SOCKET_ERROR != result);

Чтобы начать работу с этим проектом, вам необходимо собрать весь проект Visual Studio. После этого поместите сценарий NSI в папку результатов сборки и скомпилируйте сценарий NSI. Мы получим установочный файл setup.exe. При установке setup.exe все необходимые файлы будут распакованы в свои рабочие папки.

LSP.DLL будет помещен в %SYSTEMROOT%\\system32\\LSP.dll. Установщик службы и поставщика будет помещен в папку Program Files. Ярлык удаления также появится на рабочем столе.

Файл истории будет расположен в корне C://.



Выводы и советы.

В этой статье описывается, как создать собственного интернет-провайдера и отслеживать весь сетевой трафик.

Но это не единственный пример использования данной технологии.

Вы также можете легко реализовать логику для: Блокировка HTTP-запросов и ответов; Модифицировать и удалять трафик; Блокировать соединения (как это делает межсетевой экран); Перехват зашифрованных данных SLL (возможно даже перехват MITM) (Человек посередине) При разработке ЛСП было много проблем, чтобы не сожалеть о том, что пропало подключение к Интернету и были сбои, лучше для тестов использовать Виртуальную Машину.

Гораздо удобнее откатить образ ВМ к предыдущему состоянию, чем каждый раз использовать систему восстановления Windows. Большинство антивирусных программ также используют эту технологию, поэтому вы можете найти их в цепочке установленных LSP-провайдеров в вашей ОС.

Антивирусы также могут стать для вас проблемой при тестировании вашего LSP-провайдера, поскольку антивирусы также фильтруют трафик.

Вы можете добавить логику, чтобы игнорировать выбранные вами приложения.

Чтобы Наш ЛСП-провайдер не делал ничего, кроме передачи данных, если приложение находится в игнорируемом списке.

Этот инструмент был разработан только для 32-битных приложений.

Но его можно легко портировать и на 64-битные приложения.

Вам просто нужно пересобрать проект на 64-битный и установить флаг LspCatalog64Only во время установки провайдера.

Чтобы увидеть изменения в примере Platform SDK, внесенные при создании этого инструмента, вы можете сравнить текст с исходным примером.

Я также отметил все добавленные блоки кода комментарием //ADDED. Также обратите внимание, что вам необходимо сгенерировать новый GUID для вашего LSP, чтобы избежать конфликтов с другими LSP.

Полезные ссылки
К сожалению, ссылок не так много, но они все же существуют. 0. Оригинальная статья на английском языке 1. MSDN и документация Platform SDK. 2. Также есть информация на сайте разработчиков ЛСП.

.

Сам проект опубликован ЗДЕСЬ Проект также размещен на ГИТХАБ Теги: #информационная безопасность #сниффер #брандмауэр #родительский контроль #C++ #информационная безопасность #C++

Вместе с данным постом часто просматривают: