Enlace la aplicación a una interfaz de red específica

17

He intentado ForceBindIP, pero tiene una desventaja significativa: no afecta a los hijos de la aplicación que estoy tratando de vincular, solo afecta a la aplicación misma. Tampoco puede forzar a una aplicación a ejecutarse siempre a través de una interfaz específica, debe ejecutarse forcebindip.exesiempre. Se convierte en un problema con aplicaciones como League of Legends donde el árbol de procesos se ve así:

captura de pantalla

El lanzador ejecuta el parche, el parche ejecuta el cliente, etc. Solo puedo afectar al padre de todos estos procesos en el árbol, por lo que el juego real no está vinculado a la interfaz que quiero, lo que hace que esta aventura no tenga sentido.

¿Existe una alternativa más moderna a ForceBindIP para Windows 7? Hay muchas preguntas similares a esta en este sitio, pero en su mayoría son antiguas. Tal vez ahora hay una mejor manera de resolver este problema?

Mi idea actual es hacer lo siguiente:

  1. Configure el servidor local 3proxy vinculado a la interfaz deseada.

  2. Ejecute el juego a través de Proxifier o un software similar configurado para ejecutarse a través de ese proxy local.

No estoy seguro de si eso funcionará, pero incluso si lo hace, parece una solución subóptima. ¿Ustedes tienen alguna idea mejor?

Editar: Mi idea no funcionó :(

Edición 2: Básicamente, lo que intento lograr es vincular algunas aplicaciones a una interfaz normal, mientras se ejecuta VPN. La razón es que necesito conectarme a través de VPN la mayor parte del tiempo, pero algunas aplicaciones (como los juegos) no funcionan correctamente de esta manera, debido a un mayor ping y otros problemas.

Victor Marchuk
fuente
¿Necesita vincular a IP cada proceso en el árbol o solo LolClient.exe? Es LolClient.exeun x86o x64exe? Estoy jugando con un inyector dll de terceros y tal vez pueda ayudarte, pero necesito más información.
beatcracker
¿Estás tratando de vincular el proceso a la interfaz VPN o a la interfaz normal?
MariusMatutiae
¿Hay algún objetivo específico que intentes alcanzar? Por defecto, el juego no necesita ninguna conexión entrante para funcionar correctamente. ¿Estás tratando de hacer trampa o grabar / reproducir juegos?
Mario
He estado buscando una respuesta a esta pregunta básica, pero para los hosts OSX. Mi caso de uso es que tengo LAN y WiFi simultáneamente. LAN está en una red corporativa restringida, wi-fi en mi WAP. A veces necesito un navegador o una aplicación para usar solo wi-fi para poder d / l archivos bloqueados por nuestro firewall.
SaxDaddy
1
@VictorMarchuk Sí, BindIp.dlles de 32 bits, por lo que no funcionaría con procesos de 64 bits.
beatcracker

Respuestas:

10

Actualizar

Descubrí que ForceBindIp de hecho está pasando parámetros a los ejecutables llamados. Simplemente omite el primer parámetro . Así que modifiqué mi script para usarlo en ForceBindIp.exelugar del inyector personalizado y ahora parece que todos los problemas con injectoryexcepciones han desaparecido y todo funciona.

Aquí hay pasos y BindIp.cmdguiones modificados :

  1. Instale ForceBindIp como de costumbre

  2. Poner en BindIp.cmdcualquier lugar de su disco (por ejemplo C:\BindIp\BindIp.cmd)

BindIp.cmd guión:

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

Luego siga los pasos 2-6 desde abajo.


Introducción

ForceBindIp no puede inyectar automáticamente BindIp.dlla procesos secundarios y no pasa parámetros a los ejecutables llamados . Pero pude evitar esto mediante el uso de las opciones de ejecución de archivos de imagen en el registro , secuencia de comandos por lotes e inyector dll de terceros . Los detalles están abajo.

Teoría

Para usar BindIp.dllsin ForceBindIp.exenecesidad de averiguar cómo se comunican ( ForceBindIp.exetiene que pasar la dirección IP para dll de alguna manera).

Utilicé IDA gratis y descubrí que ForceBindIp.execrea una variable de entorno con un nombre FORCEDIPque contiene la dirección BindIp.dllIP y lee la dirección IP de esta variable cuando se inyecta y ejecuta en el proceso de destino.

Para detectar el inicio de la aplicación de destino, podemos agregar una Debuggerclave en las Opciones de ejecución de archivos de imagen en el registro para este ejecutable:

Kernel32! CreateProcess cuando se llama sin los indicadores de creación DEBUG_PROCESS o DEBUG_ONLY_THIS_PROCESS, comprueba el registro para ver si IFEO se ha configurado en el ejecutable que se está iniciando. En caso afirmativo, simplemente antepone la ruta del depurador al nombre del ejecutable, logrando que el ejecutable se inicie bajo el depurador.

El "depurador" en nuestro caso, será un script por lotes, que establecerá FORCEDIPvariables y lanzará el inyector dll inyector. Inyector comenzará el proceso, pasará los argumentos de la línea de comandos e inyectará BindIp.dll.

Práctica

  1. Cree una carpeta en algún lugar ( C:\BindIppor ejemplo) y ponga esos tres archivos en ella:

BindIp.cmd guión:

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. Crear clave de registro (por ejemplo LolClient.exe) para el ejecutable de destino enHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
  2. Agregue valor de cadena a esta clave:

    • Nombre: Debugger
    • Valor: C:\BindIp\BindIp.cmd
  3. Otorgue Userspermisos completos sobre esta clave (el script deberá modificarla en cada lanzamiento). Debe tener un aspecto como este:Clave de registro IFEO

  4. Establecer la dirección IP requerida en BindIp.cmd

  5. Repita los pasos 3 y 4 para cada archivo ejecutable que desea bind ( rad_user_kernel.exe, LolLauncher.exe, LolPatcher.exe, etc.).

Ahora, cada vez que inicie un ejecutable que tenga la entrada de registro correspondiente, el BindIp.cmdscript se iniciará y vinculará este programa a la dirección IP deseada.

Conclusión

Probé esto en mi computadora portátil con Windows 8.1 x64 y pude vincular con éxito varios programas ( AIMP 2 , BersIRC , Opera 12.4 ) a un adaptador Ethernet o WiFi utilizando esta técnica. Lamentablemente BindIp.dlles de 32 bits, por lo que no funcionaría con procesos de 64 bits.

beatcracker
fuente
¡Muchas gracias por una explicación detallada! Desafortunadamente, recibo algún tipo de excepción con el inyector: github.com/blole/injectory/issues/4
Victor Marchuk
@VictorMarchuk Hice más pruebas, y de hecho, a injectoryveces tiene problemas con la --argsopción. No estoy seguro de por qué.
beatcracker
No pude ejecutarlo incluso sin --argsninguna aplicación
Victor Marchuk
@VictorMarchuk ¿Tienes un ejemplo? Lo acabo de probar con Opera 12.14 y línea de comandos, funcionó bien.
beatcracker
@VictorMarchuk Parece que en ForceBindIprealidad puede pasar parámetros, vea mi respuesta actualizada.
beatcracker
4

¡He encontrado que HideMyAss! El cliente VPN tiene la función Secure IP Bind que permite vincular aplicaciones a la interfaz VPN:

Secure IP Bind le permite forzar a las aplicaciones seleccionadas en su computadora para que solo funcionen una vez conectados a nuestros servidores VPN. Esto garantiza que las aplicaciones seleccionadas solo funcionarán detrás de una conexión cifrada segura. Si abre aplicaciones seleccionadas sin estar conectado a nuestra VPN, no podrán acceder a Internet.

Lo he mirado y se basa en un dll de proveedor de servicios por capas (LSP) personalizado y una interfaz COM para controlarlo. Y se puede (ab) usar sin instalar el cliente VPN de HideMyAss.

Instalación de HideMyAss 'Secure IP Bind

  1. Obtenga el último instalador de Windows: https://www.hidemyass.com/downloads
  2. Desempaquete con 7 cremalleras. Ignore las advertencias sobre los archivos que tienen el mismo nombre, puede sobrescribirlos de forma segura.
  3. Vaya a la bincarpeta en el instalador desempaquetado
  4. Copie esos tres archivos a una carpeta en su disco ( C:\HMA_Bind)

    • ForceInterfaceCOM.dll
    • ForceInterfaceLSP.dll
    • InstallLSP.exe
  5. Poner Install.cmdy Uninstall.cmda esta carpeta

Install.cmd

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

Desinstalar.cmd

%~dp0InstallLSP.exe -f
regsvr32 /u /s %~dp0ForceInterfaceCOM.dll
  1. Ejecutar Install.cmd como administrador . Para verificar que la instalación se realizó correctamente, puede usar Autoruns :

Proveedores de Winsock en AUtoruns

  1. Para controlar Secure IP Bind, debe llamar a los métodos de interfaz COM. Esto se puede hacer en PowerShell. Si está en el sistema operativo x64, asegúrese de iniciar Windows PowerShell ISE (x86)o Windows PowerShell (x86), porque el componente COM es de 32 bits.

Primero, debe crear un nuevo objeto Secure IP Bind:

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

Y luego puedes llamar a sus métodos:

# 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()

Desinstalar el enlace seguro de IP de HideMyAss

  1. Ejecútelo Uninstall.cmd como administrador , verifique que la desinstalación se haya realizado correctamente con Autoruns

Ejemplos:

Tenga en cuenta que debe crear un objeto COM seguro de enlace IP solo una vez por sesión de PowerShell. Los ejemplos a continuación suponen que los ejecuta en una nueva sesión de PowerShell, por lo que siempre crean un nuevo objeto COM.

  • Configure la IP para enlazar, agregar firefoxa aplicaciones enlazadas, habilitar el enlace.

    # 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)
    
  • Habilitar globalmente el enlace de IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Enable binding
    $HmaFbi.SetEnabled($true)
    
  • Desactivar globalmente el enlace de IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Disable binding
    $HmaFbi.SetEnabled($false)
    
  • Eliminar la aplicación de la lista (detener el enlace para esta aplicación):

    # 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()
    

Notas

Debido a que Secure IP Bind se implementó como un proveedor de servicios de capas personalizado (LSP) dll, se aplican esas limitaciones:

Los LSP han quedado en desuso desde Windows Server 2012. Los sistemas que incluyen LSP no pasarán las verificaciones del logotipo de Windows. Las aplicaciones "metro" de estilo Windows 8 que usan redes omitirán automáticamente todos los LSP.

He probado este método con varias aplicaciones con resultados mixtos: las aplicaciones de 32 bits funcionan, pero no de 64 bits, es decir, pude vincular el Explorador de 64 bits (probablemente porque sus procesos de pestañas son de 32 bits por defecto), pero no el navegador Waterfox de 64 bits u otras aplicaciones de 64 bits.

beatcracker
fuente
3

Se me ocurren dos soluciones al problema:

  1. Cree una máquina virtual para ejecutar el juego, que solo usa un adaptador de red.

  2. Si conoce el rango de direcciones IP que usa el juego, construya una ruta de red que dirija este rango hacia la puerta de enlace del adaptador específico.

Puedo agregar más información una vez que conozca sus preferencias. Por ejemplo, en el punto 1, su producto de máquina virtual preferido.

harrymc
fuente
1
El uso de una VM crearía muchos problemas adicionales, como un rendimiento reducido y un uso constante de unos pocos GB de RAM. Es mi opción de último recurso, realmente preferiría lograrlo de alguna otra manera. No sé el rango exacto de IP que necesitaré vincular, porque lo necesito para todo tipo de aplicaciones, incluido el software para compartir p2p (torrents). ¿Quizás haya un firewall que le permita crear rutas basadas en las conexiones que establece cada aplicación?
Victor Marchuk
Rendimiento: una máquina virtual no causaría un rendimiento reducido si no se usa la PC virtual anterior. Memoria: VMware y VirtualBox no asignan toda la memoria inmediatamente, por lo que solo se asigna la memoria que la VM realmente necesita. También tienen la ventaja adicional para un juego de poder suspender y reanudar la VM / juego en un momento posterior, que es mucho mejor que las habilidades de guardar de la mayoría de los juegos. Para rangos de IP: si tiene muchos de ellos, entonces lo anterior no es práctico, ni es un proxy.
harrymc
1
@harrymc Dudo que uno pueda obtener un rendimiento 3D aceptable de VM utilizando una GPU emulada. Y el acceso directo a la tarjeta gráfica es difícil de configurar y requiere CPU compatible con VT-D (Intel) o AMD-Vi (y eso no es barato).
beatcracker
Dichas CPU son más comunes de lo que piensa: Lista de hardware compatible con IOMMU , pero el video de transferencia puede requerir dos GPU. Sin embargo, a menos que los requisitos de rendimiento sean enormes, una VM hoy en día ofrece un buen rendimiento de video. Usar una VM es mi solución para los juegos de acción que tienen problemas para aceptar mi GPU avanzada, sin encontrar un retraso notable. La mayoría de los productos de VM permiten cierto control de la tarjeta emulada, como la cantidad de memoria de video,
harrymc
2
La respuesta es sí, y algunas personas lo han logrado. Aquí hay una referencia: configurar una máquina virtual de Windows con paso a través de GPU , pero se puede encontrar más.
harrymc
3

Supongamos que tiene dos cuentas de usuario de Windows:

  • HomeUser
  • VpnUser

Cuando inicia sesión en la VpnUsercuenta, puede ejecutar aplicaciones (particularmente juegos que mencionó) como HomeUser(Shift + RMB en el archivo ejecutable -> Ejecutar como otro usuario) y esta aplicación ejecuta sus procesos secundarios como HomeUser. Las aplicaciones que ejecutará de forma estándar (accesos directos, doble clic en el archivo ejecutable) serán propiedad de VpnUser.

Al definir las conexiones de red de Windows, tiene una opción para permitir que otros usuarios usen esta conexión. Asumamos que definiste:

  • HomeNetwork exclusivamente para HomeUser
  • VpnNetwork exclusivamente para VpnUser

y para simplificar:

  • No hay otras conexiones de red en su computadora.

Actualmente tengo una sola máquina con Windows en la que no puedo estropear mucho y nunca he verificado la configuración descrita, así que no estoy seguro de si la siguiente declaración es verdadera.

Mi conjetura podría estar limitada al cliente VPN incorporado de Windows: cualquier cliente VPN de terceros requiere una mayor investigación.

Yo supongo que las aplicaciones:

  • Propiedad de VpnUserdebe usar solo VpnNetwork.
  • Propiedad de HomeUserdebe usar solo HomeNetwork.

Si mi especulación es cierta, entonces cuando inicie sesión en la VpnUsercuenta, las aplicaciones usarán VpnNetwork, cuando las aplicaciones ejecutadas HomeUserdesde la VpnUsercuenta deberían usar HomeNetwork.

g2mk
fuente
No estoy seguro de lo que quieres decir. ¿Sugiere que debería usar una cuenta de usuario de Windows diferente? ¿Cómo ayudaría eso a vincular aplicaciones específicas? Parece que su solución solo permitiría habilitar / deshabilitar VPN para todas las aplicaciones, pero ya puedo hacerlo conectándome a VPN y desconectándome.
Victor Marchuk
2
@VictorMarchuk He editado mi respuesta - Espero que ahora esté más claro ...
g2mk
0

Se puede usar forcebindip.exe pero debe codificar una aplicación auxiliar (ninguna otra opción).

  1. La aplicación guarda los parámetros que ha recibido de su línea de comando
  2. La aplicación recibe su nombre, es decir, XXXX.EXE
  3. La aplicación carga XXX.ini que contiene ie

    app_to_run = C:\path1\app_to_run.exe
    ForceBindIP = C:\path2\ForceBindIP.exe 
    IP          = 192.168.10.21
    
  4. La aplicación se ejecuta

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

  5. La aplicación finaliza.

PROBLEMA: ForcebindIP no pasa parámetros al programa llamado. luego, si necesita pasar parámetros a app_to_run.exe, necesita un enfoque más evolucionado donde XXX.exe crea un archivo por lotes que incluye app_to_run.exe y los parámetros pasados, este lote se llama en lugar de app_to_run.exe en el punto 4.

También puede echar un vistazo a algunas aplicaciones GUI que envuelven ForcebindIP. Algunos de ellos pueden trabajar con más de una aplicación, pero no hacen lo que necesita.

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

Palmadita
fuente
¿Quiere decir que la aplicación auxiliar interceptaría un intento de crear un proceso secundario y lo ejecutaría a través de ForceBindIP? Si es así, ¿tiene alguna sugerencia sobre cómo abordar esto?
Victor Marchuk
Tienes razón. la aplicación auxiliar tendrá el nombre de cada exe empaquetado y terminará llamando al exe original correspondiente a través de ForceBind. Por supuesto, necesita aquí un juego de cambio de nombre o directorio para evitar 2 exes con el mismo nombre en el mismo directorio. Esta aplicación auxiliar se puede codificar fácilmente, es decir, en C
Pat