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

17

J'ai essayé ForceBindIP, mais il présente un inconvénient important - il n'affecte pas les enfants de l'application que j'essaie de lier, il affecte uniquement l'application elle-même. Il ne peut pas non plus forcer une application à toujours exécuter une interface spécifiée, elle doit être exécutée à forcebindip.exechaque fois. Cela devient un problème avec des applications comme League of Legends où l'arborescence de processus ressemble à ceci:

capture d'écran

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

Existe-t-il une alternative plus moderne à ForceBindIP pour Windows 7? Il existe de nombreuses questions similaires à celle-ci sur ce site, mais elles sont pour la plupart anciennes. Peut-être existe-t-il maintenant une meilleure façon de résoudre ce problème?

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

  1. Configurez le serveur 3proxy 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 c'est le cas, cela semble être une solution sous-optimale. Avez-vous de meilleures idées?

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

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

Victor Marchuk
la source
Avez-vous besoin de lier à IP tous les processus de l'arborescence ou seulement LolClient.exe? Est LolClient.exeun x86ou x64exe? Je joue avec un injecteur de DLL tiers et je peux peut-être vous aider, mais j'ai besoin de plus d'informations.
beatcracker
Essayez-vous de lier le processus à l'interface VPN ou à l'interface régulière?
MariusMatutiae
Y a-t-il un objectif spécifique que vous essayez d'atteindre? Par défaut, le jeu n'a pas besoin de connexions entrantes pour fonctionner correctement. Essayez-vous de tricher ou d'enregistrer / lire des jeux?
Mario
Je cherchais une réponse à cette question de base, mais pour les hôtes OSX. Mon cas d'utilisation est que j'ai LAN et WiFi simultanément. Le LAN est sur un réseau d'entreprise restreint, wi-fi sur mon WAP. J'ai parfois besoin d'un navigateur ou d'une application pour utiliser uniquement le Wi-Fi afin de pouvoir d / l les fichiers bloqués par notre pare-feu.
SaxDaddy
1
@VictorMarchuk Oui, BindIp.dllest 32 bits, donc cela ne fonctionnerait pas avec les processus 64 bits.
beatcracker

Réponses:

10

Mise à jour

J'ai trouvé que ForceBindIp transmet en fait des paramètres aux exécutables appelés. Il omet simplement le premier paramètre . J'ai donc modifié mon script pour l'utiliser à la ForceBindIp.exeplace de l'injecteur personnalisé et maintenant il semble que tous les problèmes avec les injectoryexceptions ont disparu et que tout fonctionne.

Voici les étapes et le BindIp.cmdscript modifiés :

  1. Installez ForceBindIp comme d'habitude

  2. Mettez BindIp.cmdn'importe où sur votre disque (par exemple C:\BindIp\BindIp.cmd)

BindIp.cmd scénario:

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.dlldans les processus enfants et ne transmet pas de paramètres aux exécutables appelés . Mais j'ai pu contourner cela en utilisant les options d'exécution de fichier image dans le registre , le script de traitement par lots et l' injecteur de DLL tiers . Les détails sont ci-dessous.

Théorie

Pour l'utiliser BindIp.dllsans, ForceBindIp.exenous devons savoir comment ils communiquent ( ForceBindIp.exedoit passer l'adresse IP à la DLL en quelque sorte).

J'ai utilisé IDA gratuitement et j'ai découvert qu'il ForceBindIp.execrée une variable d'environnement avec un nom FORCEDIPqui contient l'adresse BindIp.dllIP et lit l'adresse IP de cette variable lorsqu'elle est injectée et exécutée dans le processus cible.

Pour détecter le lancement de l'application cible, nous pouvons ajouter une Debuggerclé dans les options d'exécution du fichier image dans le 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 le registre pour voir si IFEO a été défini sur l'exécutable qu'il lance. Si oui, il ajoute simplement le chemin du débogueur au nom de l'exécutable, ce qui permet de lancer efficacement l'exécutable sous le débogueur.

Le «débogueur» dans notre cas, sera un script batch, qui définira la FORCEDIPvariable et lancera l' injecteur dll-injector. L' injection démarre alors le processus, passe les arguments de ligne de commande et injecte BindIp.dll.

Entraine toi

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

BindIp.cmd scénario:

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 dansHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
  2. Ajoutez une valeur de chaîne à cette clé:

    • Nom: Debugger
    • Valeur: C:\BindIp\BindIp.cmd
  3. Accordez des Usersautorisations complètes sur cette clé (le script devra la modifier à chaque lancement). Ça devrait ressembler à ça:Clé de registre IFEO

  4. Définissez 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.).

Désormais, à chaque fois que vous lancez un exécutable possédant une entrée de registre correspondante, le BindIp.cmdscript se lance à la place et lie ce programme à l'adresse IP souhaitée.

Conclusion

J'ai testé cela sur mon ordinateur portable exécutant Windows 8.1 x64 et j'ai réussi à lier divers programmes ( AIMP 2 , BersIRC , Opera 12.4 ) à un adaptateur Ethernet ou WiFi en utilisant cette technique. Malheureusement, BindIp.dllc'est 32 bits, donc cela ne fonctionnerait pas avec les processus 64 bits.

beatcracker
la source
Merci beaucoup pour une explication détaillée! Malheureusement, je reçois une sorte d'exception de l'injection: github.com/blole/injectory/issues/4
Victor Marchuk
@VictorMarchuk J'ai fait plus de tests et j'ai injectoryparfois des problèmes avec l' --argsoption. Pas certain de pourquoi.
beatcracker
Je n'ai pas pu l'exécuter même sans --argsaucune application
Victor Marchuk
@VictorMarchuk Avez-vous un exemple? Je viens de le tester avec Opera 12.14 et la ligne de commande - cela a bien fonctionné.
beatcracker
@VictorMarchuk Il semble que ForceBindIpréellement peut passer des paramètres, voir ma réponse mise à jour.
beatcracker
4

J'ai trouvé que HideMyAss! Le client VPN a une fonction Secure IP Bind qui permet de lier des applications à l'interface VPN:

Secure IP Bind vous permet de forcer les applications sélectionnées sur votre ordinateur à fonctionner uniquement 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 regardé et il est basé sur une dll personnalisée LSP (Layered Service Provider) et une interface COM pour le contrôler. Et il peut être (ab) 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 de Windows: https://www.hidemyass.com/downloads
  2. Déballez-le avec 7 zip. Ignorez les avertissements concernant les fichiers portant le même nom, vous pouvez les remplacer en toute sécurité.
  3. Accédez au bindossier dans le programme d'installation décompressé
  4. Copiez ces trois fichiers dans un dossier sur votre disque ( C:\HMA_Bind)

    • ForceInterfaceCOM.dll
    • ForceInterfaceLSP.dll
    • InstallLSP.exe
  5. Mettez Install.cmdet Uninstall.cmddans 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écuter en Install.cmd tant qu'administrateur . Pour vérifier que l'installation a réussi, vous pouvez utiliser les exécutions automatiques :

Fournisseurs de Winsock dans AUtoruns

  1. Pour contrôler Secure IP Bind, vous devez appeler les 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 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 puis 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 la liaison IP sécurisée de HideMyAss

  1. Exécutez en Uninstall.cmd tant qu'administrateur , vérifiez que la désinstallation a réussi avec l'exécution automatique.

Exemples:

Notez que vous ne devez créer un objet COM de liaison IP sécurisé qu'une seule fois par session PowerShell. Les exemples ci-dessous supposent que vous les exécutez dans une nouvelle session PowerShell, afin qu'ils créent toujours un nouvel objet COM.

  • Définissez l'IP à laquelle se lier, ajoutez firefoxaux 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)
    
  • Activez 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ésactivez 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

Étant donné que Secure IP Bind est implémenté en tant que DLL LSP (Layered Service Provider) personnalisée , ces limitations s'appliquent:

Les LSP sont obsolètes depuis Windows Server 2012. Les systèmes qui incluent des LSP ne passeront pas les vérifications du logo Windows. Les applications "Metro" de style Windows 8 qui utilisent la mise en réseau contourneront automatiquement tous les LSP.

J'ai testé cette méthode avec diverses applications avec des résultats mitigés: les applications 32 bits fonctionnent, mais pas 64 bits, c'est-à-dire que j'ai pu lier l'explorateur 64 bits (probablement parce que ses processus de tabulation sont 32 bits par défaut), mais pas le navigateur Waterfox 64 bits ou d'autres applications 64 bits.

beatcracker
la source
3

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 que le jeu utilise, créez une route 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é.

harrymc
la source
1
L'utilisation d'une machine virtuelle créerait de nombreux problèmes supplémentaires, tels que des performances réduites et une utilisation constante de quelques Go de RAM. C'est ma dernière option, je préférerais vraiment y parvenir d'une autre manière. Je ne connais pas la plage exacte d'adresses IP que je devrai lier, car j'en ai besoin pour toutes sortes d'applications, y compris les logiciels de partage p2p (torrents). Peut-être y a-t-il un pare-feu qui vous permet de créer des itinéraires en fonction des connexions que chaque application établit?
Victor Marchuk
Performances: une machine virtuelle n'entraînerait pas une baisse des performances si l'on n'utilisait pas l'ancien PC virtuel. Mémoire: VMware et VirtualBox n'allouent pas immédiatement toute la mémoire, donc seule la mémoire dont la machine virtuelle a vraiment besoin est allouée. Ils ont également l'avantage supplémentaire pour un jeu de pouvoir suspendre et reprendre la VM / jeu à une date ultérieure, ce qui est bien meilleur que les capacités de sauvegarde de la plupart des jeux. Pour les plages IP: si vous en avez plusieurs, ce qui précède n'est pas pratique, ni un proxy.
harrymc
1
@harrymc Je doute que l'on puisse obtenir des performances 3D acceptables à partir de VM en utilisant un GPU émulé. Et l'accès direct à la carte graphique est difficile à configurer et nécessite un processeur compatible VT-D (Intel) ou AMD-Vi (et ceux-ci ne sont pas bon marché).
beatcracker
De tels processeurs sont plus courants que vous ne le pensez: Liste des matériels prenant en charge IOMMU , mais la vidéo pass-through peut nécessiter deux GPU. Cependant, à moins que les exigences de performances ne soient énormes, une machine virtuelle offre aujourd'hui de bonnes performances vidéo. L'utilisation d'une machine virtuelle est ma solution pour les jeux d'action qui ont du mal à accepter mon GPU avancé, sans rencontrer de retard notable. La plupart des produits VM permettent un certain contrôle de la carte émulée, comme la quantité de mémoire vidéo,
harrymc
2
La réponse est oui, et certaines personnes ont réussi. Voici une référence: configurer une machine virtuelle Windows avec passthrough GPU , mais vous pouvez en trouver plus.
harrymc du
3

Supposons que vous ayez deux comptes d'utilisateurs Windows:

  • HomeUser
  • VpnUser

Lorsque vous vous connectez à un VpnUsercompte, vous pouvez exécuter des applications (en particulier les jeux que vous avez mentionnés) en tant que HomeUser(Maj + RMB sur un fichier exécutable -> Exécuter en tant qu'autre utilisateur) et ces applications exécutent leurs processus enfants en tant que HomeUser. Les applications que vous exécuterez de manière standard (raccourcis, double-clic sur le fichier exécutable) seront la propriété deVpnUser .

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

  • HomeNetwork exclusivement pour HomeUser
  • VpnNetwork exclusivement pour VpnUser

et pour simplifier:

  • Il n'y a aucune autre connexion réseau sur votre ordinateur.

J'ai actuellement une seule machine Windows sur laquelle je ne peux pas gâcher beaucoup et je n'ai jamais vérifié le paramètre décrit, donc je ne suis pas sûr si la déclaration ci-dessous est vraie.

Ma supposition pourrait être limitée au client VPN intégré à Windows - tout client VPN tiers nécessite une enquête plus approfondie.

Je suppose que les applications:

  • Possédé par VpnUserdoit utiliser uniquementVpnNetwork.
  • Possédé par HomeUserdoit utiliser uniquement HomeNetwork.

Si ma spéculation est vraie, alors lorsque vous vous connectez au VpnUsercompte, les applications utiliseront VpnNetwork, lorsque les applications exécutées à HomeUserpartir du VpnUsercompte devraient utiliser HomeNetwork.

g2mk
la source
Je ne sais pas ce que tu veux dire. Suggérez-vous que je devrais utiliser un autre compte d'utilisateur Windows? Comment cela aiderait-il à lier des applications spécifiques? Il semble que votre solution ne permette d'activer / désactiver le VPN que pour toutes les applications, mais je peux déjà le faire en me connectant au VPN et en le déconnectant.
Victor Marchuk
2
@VictorMarchuk J'ai édité ma réponse - j'espère que c'est plus clair maintenant ...
g2mk
0

forcebindip.exe peut être utilisé mais vous devez coder une application d'assistance (pas d'autre option).

  1. L'application enregistre les paramètres reçus de sa ligne de commande
  2. L'application obtient son nom, c'est-à-dire XXXX.EXE
  3. L'application charge XXX.ini qui contient ie

    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 avez besoin d'une approche plus évoluée où XXX.exe crée un fichier de commandes comprenant app_to_run.exe et les paramètres transmis, ce lot est alors appelé à la place de app_to_run.exe au point 4.

Vous pouvez également jeter un oeil à certaines applications GUI encapsulant ForcebindIP. Certains d'entre eux sont capables de fonctionner avec plusieurs applications, mais ils ne font pas ce dont vous avez besoin.

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

Tapoter
la source
Voulez-vous dire que l'application d'assistance intercepterait une tentative de création d'un processus enfant et l'exécuterait à la place via ForceBindIP? Si oui, avez-vous des suggestions sur la façon d'aborder cela?
Victor Marchuk
Tu as raison. l'application d'assistance aura le nom de chaque exe encapsulé et finira d'appeler l'exe original correspondant via ForceBind. Bien sûr, vous avez besoin ici d'un jeu de changement de nom ou de répertoire afin d'éviter 2 ex avec le même nom dans le même répertoire. Cette application d'aide peut être facilement codée, c'est-à-dire dans C
Pat