Создаем свой Сниффер/FireWall/Родительский контроль/SpyWare/Клиент для Компьютерного Клуба.
ЛСП технология
Провайдер).
Недавно знакомый рассказал, что для его электронной комнаты (библиотеки) ему нужна программа, которая бы контролировала доступ к компьютерам и автоматически рассчитывала, кто, что и сколько делает. Так как денег в бюджете на 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.
Во время установки провайдера вы можете указать местоположение в цепочке провайдеров.
И цепочка будет перестроена по новым настройкам.
В нашем случае провайдер устанавливается поверх провайдера [TCP/IP].
Будьте осторожны при установке на реальную машину.
Если установка не удалась, это добавит множество проблем – потерю сети, Интернета и сбой некоторых сетевых приложений.
Чтобы обойти проблемы отладки и создания поставщика LSP, протестируйте его на виртуальной машине.
В поставщике LSP необходимо переопределить все методы библиотеки Winsock. Фактически, в примере Platform SDK логика замены уже включена; остается только добавить логику перехвата, блокировки URL-адресов или сохранения HTTP-трафика.
ПТУ используют как легальные программы, так и SpyWare/AdWare. Например: Юридические программы:
- Сигейтский межсетевой экран
- Персональный межсетевой экран Mcafee
- Электронный сейф
- Dr.Web Security Space 6 использует LSP в качестве модуля Родительского контроля.
- Вебхансер
- Нью.
нет
- НьюДотНет
ЛСП в действии.
Базовая схема
Вот так выглядит базовая схема программного комплекса.
После установки программного пакета многие программы будут использовать наш провайдер (как правило, наш провайдер представляет собой простой 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++
-
Чего Ожидать От Seo-Услуг Bigcommerce
19 Oct, 24 -
Отличные Возможности Планшетов Android
19 Oct, 24 -
Шпионтрек
19 Oct, 24 -
1% Интернета — Это Порно
19 Oct, 24