Как заставить конкретный процесс использовать прокси для сетевой связи

Есть несколько программ, таких как Proxifier, которые могут заставить exe использовать прокси. Есть и несколько других. Но все сайты выглядят немного тенистыми. Я даже не доверяю Proxifier tbh... Так что я хотел бы знать, как работают эти программы. Как они это делают? Есть ли функция WinAPI, которая может быть использована для этого? Или вам нужно вводить код в процессы?

Мне удалось найти только функции для изменения глобального прокси Windows. Но некоторым программам все равно, что говорит глобальный прокси, они всегда пытаются подключиться напрямую, даже если это невозможно...

Ответ 1

Proxifier основан на LSP (многоуровневый поставщик услуг), но лично мне никогда не нравилась эта технология из-за частого возникновения проблем стабильности. Тем не менее, помимо LSP существуют и другие возможные подходы, подходящие для достижения одинаковой функциональности, здесь вы можете найти краткий охват методов сетевой фильтрации (включая LSP): https://www.ntkernel.com/ndis-hooking-drivers-and-legacy-windows-systems/, однако документ немного устарел, я написал его во времена раннего запуска Windows XP, и он не охватывает WFP (Windows Filtering Platform), который заменил TDI и NDIS Lightweight Filter, который заменил драйверы NDIS Intermediate и NDIS. Обе технологии были внедрены Windows Vista вместе с NDIS 6.0.

Ответ 2

Я думаю, Wininet.dll - это канонический метод доступа к HTTP из пользовательских программ в Windows. (Документация для Windows Networking и поддержки в Интернете здесь. Я не хотел проходить через весь документ, но я уверен Wininet.dll является правильным)

Один из методов для каждого прокси-сервера процесса - это написать DLL, которая работает как Wininet.dll(и находится поверх Windows Wininet.dll). У вашей Wininet будет какой-то механизм (реестр, файл конфигурации и т.д.), Чтобы определить, должен ли быть определенный прокси-сервер или нет. Если процесс не проксирован, все вызовы переходят к оригинальной Wininet, но если процесс проксирован, то ваш Wininet выполняет перенаправление.

Другая, несколько схожая, точка впрыска находится на уровне winsock (ws2_32.dll). (Назад в эпоху Windows 3.1, Win95, было довольно часто заменять winsock.dll(предшественник ws2_32) поставщиками стеков TCP/IP.) Вот случай, когда одна и та же концепция используется для захвата трафика на уровне winsock. В статье по ссылке есть хорошая диаграмма, которая иллюстрирует концепцию, а также детали реализации замены ws2_32.dll.

Ответ 3

Современный способ сделать это - использовать платформу фильтрации Windows.

https://en.wikipedia.org/wiki/Windows_Filtering_Platform

https://docs.microsoft.com/en-us/windows/win32/fwp/windows-filtering-platform-start-page

Платформа фильтрации Windows (WFP) - это набор API и системных служб. которые предоставляют платформу для создания приложений сетевой фильтрации. WFP API позволяет разработчикам писать код, который взаимодействует с обработка пакетов, которая происходит на нескольких уровнях в сети стек операционной системы. Сетевые данные могут быть отфильтрованы, а также изменен до того, как достигнет пункта назначения.