15

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

Скриншот

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

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

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

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

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

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

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

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

5 ответов5

9

Обновить

Я обнаружил, что 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 должен каким-то образом передавать IP-адрес в dll).

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

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

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

"Debugger" в нашем случае будет пакетный скрипт, который установит переменную FORCEDIP и запустить injectory DLL-инжектор. Затем 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-разрядными процессами.

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. Если вы работаете в операционной системе x64, обязательно запустите 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 от имени администратора, убедитесь, что удаление прошло успешно с помощью автозапуска.

Примеры:

Обратите внимание, что вам необходимо создать защищенный COM-объект Bind IP только один раз за сеанс 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-битные приложения.

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 .

3

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

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

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

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

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/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .