Привязать приложение к определенному сетевому интерфейсу

17

Я пробовал ForceBindIP, но у него есть существенный недостаток - он не влияет на дочерние элементы приложения, которое я пытаюсь связать, а только на само приложение. Это также не может заставить приложение всегда запускаться через указанный интерфейс, оно должно выполняться forcebindip.exeкаждый раз. Это становится проблемой для приложений, таких как League of Legends, где дерево процессов выглядит так:

Скриншот

Панель запуска запускает патчер, патчер запускает клиент и т. Д. Я могу влиять только на родителя всех этих процессов в дереве, поэтому настоящая игра не привязана к желаемому интерфейсу, что делает все это бессмысленным.

Есть ли более современная альтернатива ForceBindIP для Windows 7? На этом сайте есть много вопросов, похожих на этот, но они в основном старые. Может быть, теперь есть лучший способ решить эту проблему?

Моя текущая идея заключается в следующем:

  1. Настройте локальный сервер 3proxy, связанный с желаемым интерфейсом.

  2. Запустите игру через Proxifier или аналогичное программное обеспечение, настроенное для запуска через этот локальный прокси.

Я не уверен, что это сработает, но даже если это сработает, это кажется неоптимальным решением. Ребята, у вас есть идеи получше?

Изменить: моя идея не сработала :(

Редактировать 2: По сути, я пытаюсь добиться привязки нескольких приложений к обычному интерфейсу во время работы VPN. Причина в том, что мне нужно подключаться через VPN большую часть времени, но некоторые приложения (например, игры) не работают должным образом из-за более высокого пинга и других проблем.

Виктор Марчук
источник
Вам нужно привязать к IP каждый процесс в дереве или только LolClient.exe? Является ли или ех? Я играю с сторонним DLL-инжектором и, возможно, я могу вам помочь, но мне нужно больше информации. LolClient.exex86x64
битрейкер
Вы пытаетесь привязать процесс к интерфейсу VPN или к обычному интерфейсу?
MariusMatutiae
Есть ли какая-то конкретная цель, которую вы пытаетесь достичь? По умолчанию игра не требует никаких входящих подключений для правильной работы. Вы пытаетесь обмануть или записать / воспроизвести игры?
Марио
Я искал ответ на этот основной вопрос, но для хостов OSX. Мой пример использования - у меня есть LAN и WiFi одновременно. Локальная сеть находится в ограниченной корпоративной сети, Wi-Fi на моем WAP. Иногда мне нужен браузер или приложение, чтобы использовать только Wi-Fi, чтобы я мог д / л файлы заблокированы нашим брандмауэром.
SaxDaddy
1
@VictorMarchuk Да, BindIp.dll32-битный, поэтому он не будет работать с 64-битными процессами.
битрейкер

Ответы:

10

Обновить

Я обнаружил, что ForceBindIp фактически передает параметры вызываемым исполняемым файлам. Он просто пропускает первый параметр . Поэтому я изменил свой сценарий для использования ForceBindIp.exeвместо пользовательского инжектора, и теперь похоже, что все проблемы с injectoryисключениями исчезли и все работает.

Вот модифицированные шаги и BindIp.cmdскрипт:

  1. Установите ForceBindIp как обычно

  2. Поместите в BindIp.cmdлюбое место на вашем диске (например C:\BindIp\BindIp.cmd)

BindIp.cmd сценарий:

setlocal

:: IP to bind to
set IP=192.168.128.85

:: Common variables
set RegIFEO=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\%~nx1
set Injector=ForceBindIp.exe

:: ForceBindIp swallows first parameter passed to target exe,
:: so we inject dummy parameter just before it
set AllParams=%*
set FirstParam=%1
call set TargetParams=%%AllParams:*%FirstParam%=%FirstParam% Dummy%%

:: Delete debugger for the target exe in registry,
:: or we'll end in an endless loop of the batch files
reg delete "%RegIFEO%%" /v Debugger /f

:: Start target exe via ForceBindIp
%Injector% %IP% %TargetParams%

:: Restore this script as debugger for the target exe in registry
reg add "%RegIFEO%" /v Debugger /t REG_SZ /d "%~dpnx0" /f

:: Debug, uncomment if needed
rem pause

endlocal

Затем выполните шаги 2-6 снизу.


Вступление

ForceBindIp не может автоматически внедрять BindIp.dllдочерние процессы и не передает параметры вызываемым исполняемым файлам . Но мне удалось обойти это, используя параметры выполнения файлов изображений в реестре , пакетный скрипт и сторонний DLL-инжектор . Подробности ниже.

теория

Для использования BindIp.dllбез ForceBindIp.exeнас нужно выяснить, как они общаются ( ForceBindIp.exeнужно как-то передать dll-адрес в dll).

Я использовал IDA free и обнаружил, что ForceBindIp.exeсоздает переменную среды с именем, FORCEDIPкоторая содержит IP-адрес и BindIp.dllсчитывает IP-адрес из этой переменной, когда она вводится и выполняется в целевом процессе.

Чтобы обнаружить запуск целевого приложения, мы можем добавить Debuggerключ в опциях исполнения файла образа в реестре для этого исполняемого файла:

Kernel32! CreateProcess, когда вызывается без флагов создания DEBUG_PROCESS или DEBUG_ONLY_THIS_PROCESS, проверяет реестр, чтобы узнать, был ли установлен IFEO в исполняемом файле, который он запускает. Если да, тогда он просто добавляет путь отладчика к имени исполняемого файла, фактически выполняя запуск исполняемого файла под отладчиком.

«Отладчик» в нашем случае будет пакетным скриптом, который установит FORCEDIPпеременную и запустит инъекцию dll-injector. Injectory затем начнется процесс, передать аргументы командной строки и впрыснуть BindIp.dll.

практика

  1. Создайте папку где-нибудь ( C:\BindIpнапример) и поместите эти три файла в нее:

BindIp.cmd сценарий:

setlocal

:: IP to bind to. This env.var is used by BindIp.dll
set FORCEDIP=192.168.1.23

:: Common variables
set RegIFEO=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\%~nx1
set Injector=%~dp0injectory.x86.exe
set BindIpDll=%~dp0BindIp.dll

:: Extract target's parameters, if any
set AllParams=%*
set FirstParam=%1
call set TargetParams=%%AllParams:*%FirstParam% =%%

:: Delete debugger for the target exe in registry,
:: or we'll end in an endless loop of the batch files
reg delete "%RegIFEO%%" /v Debugger /f

:: Start target exe and inject BindIp.dll
if not [%2] == [] (
    :: If there were parameters for target exe, pass them on
    "%Injector%" --launch %1 --inject "%BindIpDll%" --args "%TargetParams%"
) else (
    :: No parameters were specified
    "%Injector%" --launch %1 --inject "%BindIpDll%"
)

:: Restore this script as debugger for the target exe in registry
reg add "%RegIFEO%" /v Debugger /t REG_SZ /d "%~dpnx0" /f

:: Debug, uncomment if needed
rem pause

endlocal
  1. Создать ключ реестра (например LolClient.exe) для целевого исполняемого файла вHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
  2. Добавьте строковое значение к этому ключу:

    • Имя: Debugger
    • Значение: C:\BindIp\BindIp.cmd
  3. Предоставьте Usersполные разрешения для этого ключа (скрипт должен будет изменять его при каждом запуске). Это должно выглядеть так:Раздел реестра IFEO

  4. Установите необходимый IP-адрес в BindIp.cmd

  5. Повторите шаги 3 и 4 для каждого исполняемого файла , который вы хотите , чтобы связать ( rad_user_kernel.exe, LolLauncher.exe, LolPatcher.exeи т.д.).

Теперь каждый раз, когда вы запускаете исполняемый файл с соответствующей записью в реестре, BindIp.cmdвместо этого запускается скрипт и привязывает эту программу к нужному IP-адресу.

Вывод

Я проверил это на своем ноутбуке под управлением Windows 8.1 x64 и смог успешно привязать различные программы ( AIMP 2 , BersIRC , Opera 12.4 ) к адаптеру Ethernet или WiFi, используя эту технику. К сожалению, BindIp.dllэто 32-битный, поэтому он не будет работать с 64-битными процессами.

beatcracker
источник
Большое спасибо за подробное объяснение! К сожалению, я получаю какое-то исключение из инъекций: github.com/blole/injectory/issues/4
Виктор Марчук
@VictorMarchuk Я сделал больше тестов, и действительно, injectoryиногда возникают проблемы с --argsопцией. Не уверен почему.
битрейкер
Я не смог запустить его даже без --argsкакого-либо приложения
Виктор Марчук
@VictorMarchuk У вас есть пример? Я только что протестировал его с Opera 12.14 и командной строкой - он работал нормально.
Биткрекер
@VictorMarchuk Кажется, что на ForceBindIpсамом деле может передавать параметры, см. Мой обновленный ответ.
битрейкер
4

Я нашел это HideMyAss! VPN-клиент имеет функцию Secure IP Bind, которая позволяет привязывать приложения к интерфейсу VPN:

Secure IP Bind позволяет принудительно работать с выбранными приложениями на вашем компьютере только после подключения к нашим VPN-серверам. Это гарантирует, что выбранные приложения будут работать только за защищенным зашифрованным соединением. Если вы откроете выбранные приложения без подключения к нашей VPN, они не смогут получить доступ к Интернету.

Я посмотрел на него, и он основан на пользовательских DLL- сервисе Layered Service Provider (LSP) и COM-интерфейсе для управления им. И его можно (ab) использовать без установки VPN-клиента HideMyAss.

Установка HideMyAss 'Secure IP Bind

  1. Загрузите последнюю версию установщика Windows: https://www.hidemyass.com/downloads
  2. Распакуйте его с 7-почтовым. Игнорируйте предупреждения о файлах с одинаковыми именами, вы можете смело перезаписывать их.
  3. Зайдите в binпапку в распакованном установщике
  4. Скопируйте эти три файла в папку на вашем диске ( C:\HMA_Bind)

    • ForceInterfaceCOM.dll
    • ForceInterfaceLSP.dll
    • InstallLSP.exe
  5. Положите Install.cmdи Uninstall.cmdв эту папку

INSTALL.CMD

%~dp0InstallLSP.exe -i -a -n "HMA_LSP" -d %~dp0ForceInterfaceLSP.dll
regsvr32 /s %~dp0ForceInterfaceCOM.dll

uninstall.cmd

%~dp0InstallLSP.exe -f
regsvr32 /u /s %~dp0ForceInterfaceCOM.dll
  1. Запуск Install.cmd от имени администратора . Чтобы убедиться, что установка прошла успешно, вы можете использовать автозапуск :

Поставщики Winsock в AUtoruns

  1. Для управления Secure IP Bind необходимо вызвать методы интерфейса COM. Это можно сделать в PowerShell. Если вы работаете в 64 -разрядной ОС, обязательно запустите Windows PowerShell ISE (x86)или Windows PowerShell (x86), поскольку COM-компонент является 32-разрядным.

Во-первых, вам нужно создать новый объект Secure IP Bind:

# Create new Secure IP Bind COM object
$HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop

И тогда вы можете назвать его методами:

# Add bound application
# Not sure what second boolean argument does
$HmaFbi.AddApplicationHandled('firefox.exe', $true)

# Delete bound application
$HmaFbi.RemoveApplicationHandled('firefox.exe')

# Save applications to registry (applies bindings)
# Setting are saved to: HKEY_CURRENT_USER\Software\ForceInterfaceCOM
$HmaFbi.SaveToRegistry()

# List all bound applications
0..($HmaFbi.GetApplicationHandledCount() - 1) | ForEach-Object {$HmaFbi.GetApplicationName($_)}

# Set IP to bind to
$HmaFbi.SetInterfaceIP('192.168.1.23')

# Get stored IP
$HmaFbi.GetInterfaceIP()

# Enable binding
$HmaFbi.SetEnabled($true)

# Disable binding
$HmaFbi.SetEnabled($false)

# Show binding status
$HmaFbi.GetEnabled()

Удаление HideMyAss 'Secure IP Bind

  1. Запустите Uninstall.cmd от имени администратора , убедитесь, что удаление прошло успешно с помощью автозапуска.

Примеры:

Обратите внимание, что вы должны создавать защищенный IP Bind COM-объект только один раз за сеанс PowerShell. В приведенных ниже примерах предполагается, что вы выполняете их в новом сеансе PowerShell, поэтому они всегда создают новый COM-объект.

  • Установите IP для привязки, добавления firefoxк связанным приложениям, включения привязки.

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Set IP to bind to
    $HmaFbi.SetInterfaceIP('192.168.1.23')
    
    # Add bound application
    # Not sure what second boolean argument does
    $HmaFbi.AddApplicationHandled('firefox.exe', $true)
    
    # Save applications to registry (applies bindings)
    # Setting are saved to: HKEY_CURRENT_USER\Software\ForceInterfaceCOM
    $HmaFbi.SaveToRegistry()
    
    # Enable binding
    $HmaFbi.SetEnabled($true)
    
  • Глобально включить привязку IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Enable binding
    $HmaFbi.SetEnabled($true)
    
  • Глобально отключить привязку IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Disable binding
    $HmaFbi.SetEnabled($false)
    
  • Удалить приложение из списка (прекратить привязку для этого приложения):

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Delete bound application
    $HmaFbi.RemoveApplicationHandled('firefox.exe')
    
    # Save applications to registry (applies bindings)
    # Setting are saved to: HKEY_CURRENT_USER\Software\ForceInterfaceCOM
    $HmaFbi.SaveToRegistry()
    

Примечания

Поскольку привязка защищенного IP-адреса реализована как dll пользовательского многоуровневого поставщика услуг (LSP) , применяются следующие ограничения:

Начиная с Windows Server 2012 LSP устарели. Системы, которые включают LSP, не будут проходить проверки логотипа Windows. Приложения «метро» в стиле Windows 8, которые используют сеть, автоматически обойдут все LSP.

Я тестировал этот метод с различными приложениями со смешанными результатами: 32-битные приложения работают, но 64-битные нет, т.е. я смог связать 64-битный проводник (вероятно, потому что его процессы вкладок по умолчанию 32-битные), но не 64-битный браузер Waterfox или другие 64-битные приложения.

beatcracker
источник
3

Я могу придумать два решения проблемы:

  1. Создайте виртуальную машину для запуска игры, которая использует только один сетевой адаптер.

  2. Если вам известен диапазон IP-адресов, которые использует игра, создайте сетевой маршрут, который направляет этот диапазон к шлюзу определенного адаптера.

Я могу добавить больше информации, когда узнаю ваши предпочтения. Например, в пункте 1 предпочитаемый вами продукт виртуальной машины.

harrymc
источник
1
Использование ВМ создаст много дополнительных проблем, таких как снижение производительности и постоянное использование нескольких ГБ ОЗУ. Это мой последний вариант, я бы предпочел добиться этого другим способом. Я не знаю точный диапазон IP-адресов, которые мне нужно привязать, потому что он мне нужен для всех видов приложений, включая программное обеспечение для обмена p2p (торренты). Может быть, есть брандмауэр, который позволяет вам создавать маршруты на основе соединений, которые устанавливает каждое приложение?
Виктор Марчук
Производительность: виртуальная машина не приведет к снижению производительности, если не использовать старый Virtual PC. Память: VMware и VirtualBox не выделяют всю память сразу, поэтому выделяется только память, которая действительно нужна виртуальной машине. Они также имеют дополнительное преимущество для игры, заключающееся в возможности приостановить и возобновить ВМ / игру в более позднее время, что намного лучше, чем сохраняющие способности большинства игр. Для диапазонов IP-адресов: если у вас их много, то вышеупомянутое не практично и не является прокси.
Harrymc
1
@harrymc Я сомневаюсь, что можно было бы получить приемлемую производительность 3D от ВМ, используя эмулированный графический процессор. Прямой доступ к графической карте сложен в настройке и требует наличия процессора с поддержкой VT-D (Intel) или AMD-Vi (а это недешево).
битрейкер
Такие процессоры встречаются чаще, чем вы думаете: список аппаратного обеспечения , поддерживающего IOMMU , но для сквозного видео может потребоваться два графических процессора. Однако, если требования к производительности огромны, виртуальная машина в настоящее время дает хорошую производительность видео. Использование виртуальной машины - это мое решение для экшн-игр, в которых возникают проблемы с принятием моего продвинутого графического процессора без заметного отставания. Большинство продуктов VM позволяют контролировать эмулируемую карту, например, объем видеопамяти,
harrymc
2
Ответ - да, и некоторым людям это удалось. Вот одна ссылка: Настройка виртуальной машины Windows с использованием графического процессора , но можно найти и другие.
Harrymc
3

Предположим, у вас есть две учетные записи Windows:

  • HomeUser
  • VpnUser

Когда вы входите в VpnUserучетную запись, вы можете запускать приложения (в частности, упомянутые вами игры) как HomeUser(Shift + RMB для исполняемого файла -> Запускать как другой пользователь), и эти приложения запускают свои дочерние процессы как HomeUser. Приложения, которые вы будете запускать стандартным способом (ярлыки, двойной щелчок на исполняемом файле), будут принадлежать VpnUser.

При определении сетевых подключений Windows у вас есть возможность разрешить другим пользователям использовать это подключение. Давайте предположим, что вы определили:

  • HomeNetwork исключительно для HomeUser
  • VpnNetwork исключительно для VpnUser

и для упрощения:

  • На вашем компьютере нет других сетевых подключений.

В настоящее время у меня есть одна машина Windows, на которой я не могу много испортить, и я никогда не проверял описанную настройку, поэтому я не уверен, верно ли приведенное ниже утверждение.

Мое предположение может быть ограничено встроенным VPN-клиентом Windows - любой сторонний VPN-клиент требует дальнейшего изучения.

Я думаю, что приложения:

  • Владелец VpnUserдолжен использовать только VpnNetwork.
  • Владелец HomeUserдолжен использовать только HomeNetwork.

Если мои предположения верны, то при входе в VpnUserучетную запись приложения будут использовать VpnNetwork, когда приложения будут запускаться как HomeUserиз VpnUserучетной записи, которые следует использовать HomeNetwork.

g2mk
источник
Я не уверен, что вы имеете в виду. Вы предлагаете мне использовать другую учетную запись пользователя Windows? Как это поможет связать конкретные приложения? Кажется, что ваше решение позволит включить / отключить VPN только для всех приложений, но я уже могу это сделать, подключившись к VPN и отключившись от него.
Виктор Марчук
2
@VictorMarchuk Я отредактировал свой ответ - надеюсь, теперь он более понятен ...
g2mk
0

Вы можете использовать forcebindip.exe, но вы должны написать вспомогательное приложение (другого варианта нет).

  1. Приложение сохраняет параметры, полученные из командной строки.
  2. Приложение получает свое имя, т.е. XXXX.EXE
  3. Приложение загружает XXX.ini, который содержит

    app_to_run = C:\path1\app_to_run.exe
    ForceBindIP = C:\path2\ForceBindIP.exe 
    IP          = 192.168.10.21
    
  4. Приложение работает

    C: \ path1 \ app_to_run.exe 192.168.10.21 C: \ path1 \ app_to_run.exe Saved_Command_line

  5. Приложение заканчивается

ПРОБЛЕМА: ForcebindIP не передает параметры вызываемой программе. затем, если вам нужно передать параметры в app_to_run.exe, вам нужен более развитый подход, где XXX.exe создает пакетный файл, включающий app_to_run.exe и переданные параметры, тогда этот пакет вызывается вместо app_to_run.exe в точке 4.

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

https://www.raymond.cc/blog/bind-windows-application-to-specific-network-adapter-with-forcebindip/

похлопывание
источник
Вы имеете в виду, что вспомогательное приложение будет перехватывать попытку создания дочернего процесса и вместо этого запускать его через ForceBindIP? Если да, есть ли у вас какие-либо предложения о том, как подойти к этому?
Виктор Марчук
Вы правы. вспомогательное приложение будет иметь имя каждого упакованного exe-файла и завершит вызов соответствующего исходного exe-файла через ForceBind. Конечно, здесь вам нужно переименовать или каталог игры, чтобы избежать 2 exes с одинаковым именем в одном каталоге. Это вспомогательное приложение может быть легко закодировано, например, в C
Pat