web-dev-qa-db-fra.com

Lier l'application à une interface réseau spécifique

J'ai essayé ForceBindIP, mais il comporte un inconvénient important: cela n'affecte pas les enfants de l'application que je tente de lier, cela affecte uniquement l'application elle-même. En outre, il ne peut pas forcer une application à toujours s'exécuter via une interface spécifiée, il doit être exécuté à travers forcebindip.exe à chaque fois. Cela devient un problème avec des applications telles que League of Legends où l’arborescence des processus ressemble à ceci:

screenshot

Le lanceur exécute le correctif, le correctif exécute le client, etc. Je ne peux affecter que le parent de tous ces processus dans l'arborescence. Le jeu n'est donc pas lié à l'interface que je veux, ce qui rend toute cette aventure inutile.

Existe-t-il une alternative plus moderne à ForceBindIP pour Windows 7? Il y a beaucoup de questions semblables à celle-ci sur ce site, mais elles sont pour la plupart anciennes. Peut-être existe-t-il maintenant un meilleur moyen de résoudre ce problème?

Mon idée actuelle est de faire ce qui suit:

  1. Configurez le serveur 3 proxy local lié à l'interface souhaitée.

  2. Exécutez le jeu via Proxifier ou un logiciel similaire configuré pour s'exécuter via ce proxy local.

Je ne sais pas si cela fonctionnera, mais même si cela fonctionnera, cela semble être une solution sous-optimale. Avez-vous les meilleures idées les gars?

Edit: Mon idée n'a pas fonctionné :(

Edit 2: Fondamentalement, ce que je cherche à faire est de lier quelques applications à une interface normale, alors que le VPN est en cours d’exécution. La raison en est que je dois me connecter via un réseau privé virtuel la plupart du temps, mais certaines applications (telles que les jeux) ne fonctionnent pas correctement de cette façon, en raison de problèmes de ping plus importants et autres.

17
Victor Marchuk

Mettre à jour

J'ai constaté que ForceBindIp passait en fait des paramètres aux exécutables appelés. Il omet juste le premier paramètre . J'ai donc modifié mon script pour utiliser ForceBindIp.exe au lieu d'injecteur personnalisé et maintenant, il semble que tous les problèmes avec les exceptions injectory ont disparu et que tout fonctionne.

Voici les étapes modifiées et le script BindIp.cmd:

  1. Installez ForceBindIp comme d'habitude

  2. Mettez BindIp.cmd n'importe où sur votre lecteur (par exemple, C:\BindIp\BindIp.cmd)

BindIp.cmd script:

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

Suivez ensuite les étapes 2 à 6 ci-dessous.


Introduction

ForceBindIp ne peut pas injecter automatiquement BindIp.dll aux processus enfants et ne passe pas de paramètres aux exécutables appelés. Mais j'ai pu contourner ce problème en utilisant les options d'exécution du fichier image dans le registre , le script de traitement par lots et des dll tierces injecteur . Les détails sont ci-dessous.

Théorie

Pour utiliser BindIp.dll sans ForceBindIp.exe, nous devons savoir comment ils communiquent (ForceBindIp.exe doit en quelque sorte passer l’adresse IP à la dll).

J'ai utilisé IDA libre et constaté que ForceBindIp.exe crée une variable d'environnement avec le nom FORCEDIP qui contient l'adresse IP et que BindIp.dll lit l'adresse IP de cette variable injecté et exécuté dans le processus cible.

Pour détecter le lancement de l'application cible, nous pouvons ajouter une clé Debugger dans les options d'exécution du fichier image du registre pour cet exécutable:

Kernel32! CreateProcess, lorsqu'il est appelé sans les indicateurs de création DEBUG_PROCESS ou DEBUG_ONLY_THIS_PROCESS, vérifie dans le registre si IFEO a été défini sur l'exécutable qu'il lance. Si c'est le cas, alors le chemin du débogueur est préfixé au nom de l'exécutable, ce qui permet à l'exécutable de se lancer sous le débogueur.

Le "débogueur" dans notre cas sera un script batch, qui définira la variable FORCEDIP et lancera l'injectory dll-injector. Injectory lancera ensuite le processus, passera les arguments de la ligne de commande et injectera BindIp.dll.

Entraine toi

  1. Créez un dossier quelque part (C:\BindIp par exemple) et mettez-y ces trois fichiers:

BindIp.cmd script:

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. Créer une clé de registre (par exemple, LolClient.exe) pour l'exécutable cible dans HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
  2. Ajouter une valeur de chaîne à cette clé:

    • Nom: Debugger
    • Valeur: C:\BindIp\BindIp.cmd
  3. Accordez à Users des autorisations complètes sur cette clé (le script devra la modifier à chaque lancement). Cela devrait ressembler à ceci: IFEO registry key

  4. Définir l'adresse IP requise dans BindIp.cmd

  5. Répétez les étapes 3 et 4 pour chaque exécutable que vous souhaitez lier (rad_user_kernel.exe, LolLauncher.exe, LolPatcher.exe, etc.).

Maintenant, chaque fois que vous lancez un fichier exécutable avec l’entrée de registre correspondante, le script BindIp.cmd sera lancé à la place et liera ce programme à l’adresse IP souhaitée.

Conclusion

J'ai testé cela sur mon ordinateur portable fonctionnant sous Windows 8.1 x64 et j'étais capable de lier avec succès divers programmes ( AIMP 2 , BersIRC , Opera 12.4 ) via un adaptateur Ethernet ou WiFi utilisant cette technique. Malheureusement, BindIp.dll étant en 32 bits, cela ne fonctionnerait pas avec les processus 64 bits.

10
beatcracker

J'ai constaté que HideMyAss! / Le client VPN a Secure IP Bind la fonctionnalité qui permet de lier des applications à une interface VPN :

Secure IP Bind vous permet de forcer les applications sélectionnées sur votre ordinateur à ne fonctionner qu'une fois connectées à nos serveurs VPN. Cela garantit que les applications sélectionnées ne fonctionneront que derrière une connexion cryptée sécurisée. Si vous ouvrez des applications sélectionnées sans être connecté à notre VPN, elles ne pourront pas accéder à Internet.

Je l'ai examiné et il est basé sur un fournisseur personnalisé LSP (Layered Service Provider) (LSP) dll et une interface COM pour le contrôler. Et il peut être utilisé sans installer le client VPN de HideMyAss.

Installation de la liaison IP sécurisée de HideMyAss

  1. Obtenez le dernier programme d'installation Windows: https://www.hidemyass.com/downloads
  2. Décompressez-le avec 7-Zip. Ignorer les avertissements concernant les fichiers portant le même nom, vous pouvez les écraser en toute sécurité.
  3. Accédez au dossier bin dans le programme d'installation décompressé.
  4. Copiez ces trois fichiers dans un dossier de votre disque (C:\HMA_Bind)

    • ForceInterfaceCOM.dll
    • ForceInterfaceLSP.dll
    • InstallLSP.exe
  5. Placez Install.cmd et Uninstall.cmd dans ce dossier

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. Exécutez Install.cmd en tant qu'administrateur . Pour vérifier que l'installation a réussi, vous pouvez utiliser Autoruns :

Winsock Providers in AUtoruns

  1. Pour contrôler Secure IP Bind, vous devez appeler des méthodes d'interface COM. Cela peut être fait dans PowerShell. Si vous utilisez un système d'exploitation x64, assurez-vous de lancer Windows PowerShell ISE (x86) ou Windows PowerShell (x86), car le composant COM est en 32 bits.

Tout d'abord, vous devez créer un nouvel objet Secure IP Bind:

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

Et ensuite, vous pouvez appeler ses méthodes:

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

Désinstallation de HideMyAss 'Secure IP Bind

  1. Exécutez Uninstall.cmd en tant qu'administrateur , vérifiez que la désinstallation est réussie avec Autoruns.

Exemples:

Notez que vous devez créer un objet IP Bind COM sécurisé uniquement une fois par session PowerShell. Les exemples ci-dessous supposent que vous les exécutiez dans une nouvelle session PowerShell, ils créent donc toujours un nouvel objet COM.

  • Définissez l'adresse IP de la liaison, ajoutez firefox aux applications liées, activez la liaison.

    # 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)
    
  • Activer globalement la liaison IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Enable binding
    $HmaFbi.SetEnabled($true)
    
  • Désactiver globalement la liaison IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Disable binding
    $HmaFbi.SetEnabled($false)
    
  • Supprimer l'application de la liste (arrêter la liaison pour cette application):

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

Remarques

Etant donné que Secure IP Bind est implémenté en tant que fournisseur de service en couche personnalisé dll, ces limitations s'appliquent:

Les LSP sont obsolètes depuis Windows Server 2012. Les systèmes comprenant des LSP ne passeront pas les contrôles du logo Windows. Les applications "métropolitaines" de style Windows 8 utilisant la mise en réseau contourneront automatiquement tous les LSP.

J'ai testé cette méthode avec différentes applications aux résultats mitigés: les applications 32 bits fonctionnent, mais pas en 64 bits, c’est-à-dire que j’ai pu lier l’Explorateur 64 bits (probablement parce que les processus de tabulation sont 32 bits par défaut), mais pas 64 bits Waterfox browser ou d'autres applications 64 bits.

4
beatcracker

Supposons que vous ayez deux comptes d'utilisateur Windows:

  • HomeUsername__
  • VpnUsername__

Lorsque vous vous connectez au compte VpnUsername__, vous pouvez exécuter des applications (en particulier les jeux que vous avez mentionnés) sous le nom HomeUser(Maj + RMB du fichier exécutable -> Exécuter en tant qu’autre utilisateur). Ces applications exécutent leurs processus enfants sous le nom HomeUsername__. Les applications que vous exécuterez de manière standard (raccourcis, double-clic sur un fichier exécutable) appartiendront à VpnUsername__.

Lorsque vous définissez des connexions réseau Windows, vous avez la possibilité d'autoriser d'autres utilisateurs à utiliser cette connexion. Supposons que vous avez défini:

  • HomeNetworkexclusivement pour HomeUsername__
  • VpnNetworkexclusivement pour VpnUsername__

et pour simplifier:

  • Il n'y a pas d'autres connexions réseau sur votre ordinateur.

Je n'ai actuellement qu'une seule machine Windows sur laquelle je ne peux pas gâcher beaucoup et je n'ai jamais vérifié les paramètres décrits, de sorte que je ne suis pas sûr que l'instruction ci-dessous soit vraie.

Mon hypothèse pourrait être limitée au client VPN intégré à Windows - tout client VPN tiers doit faire l’objet d’une enquête plus approfondie.

Je suppose que les applications:

  • Détenu par VpnUserdoit utiliser uniquement VpnNetworkname__.
  • Détenu par HomeUserdoit utiliser uniquement HomeNetworkname__.

Si ma spéculation est vraie, lorsque vous vous connectez à VpnUsername__, les applications utilisent VpnNetworkname__, lorsque les applications s'exécutent en tant que HomeUserà partir de VpnUsername__, le compte doit utiliser HomeNetworkname__.

3
g2mk

Je peux penser à deux solutions au problème:

  1. Créez une machine virtuelle pour exécuter le jeu, qui utilise uniquement la seule carte réseau.

  2. Si vous connaissez la plage d'adresses IP utilisée par le jeu, créez un itinéraire réseau qui dirige cette plage vers la passerelle de l'adaptateur spécifique.

Je peux ajouter plus d'informations une fois que je connais vos préférences. Par exemple, au point 1, votre produit de machine virtuelle préféré.

3
harrymc

forcebindip.exe peut être utilisé mais vous devez coder une application auxiliaire (aucune autre option).

  1. L'application enregistre les paramètres reçus depuis sa ligne de commande
  2. L’application tire son nom c’est-à-dire XXXX.EXE
  3. L’application charge XXX.ini contenant i.e.

    app_to_run = C:\path1\app_to_run.exe
    ForceBindIP = C:\path2\ForceBindIP.exe 
    IP          = 192.168.10.21
    
  4. L'application s'exécute

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

  5. L'application se termine

PROBLÈME: ForcebindIP ne transmet pas de paramètres au programme appelé. puis, si vous devez passer des paramètres à app_to_run.exe, vous devez adopter une approche plus évoluée, dans laquelle XXX.exe crée un fichier batch comprenant app_to_run.exe et les paramètres transmis. Ce lot est appelé à la place de app_to_run.exe au point 4.

Vous pouvez également jeter un coup d'œil à certaines applications de l'interface graphique qui enveloppent ForcebindIP. Certains d'entre eux sont capables de travailler avec plus d'une application mais ils ne font pas ce dont vous avez besoin.

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

0
Pat