Associare l'applicazione a un'interfaccia di rete specifica


17

Ho provato ForceBindIP, ma ha un aspetto negativo significativo: non influisce sui figli dell'applicazione che sto cercando di associare, riguarda solo l'applicazione stessa. Inoltre, non può forzare l'esecuzione di un'applicazione sempre attraverso un'interfaccia specifica, deve essere eseguita forcebindip.exeogni volta. Diventa un problema con applicazioni come League of Legends in cui l'albero del processo è simile al seguente:

immagine dello schermo

Il launcher esegue il patcher, il patcher esegue il client, ecc. Posso solo influenzare il genitore di tutti questi processi nella struttura, quindi il gioco effettivo non è legato all'interfaccia che desidero, rendendo inutile l'intera avventura.

Esiste un'alternativa più moderna a ForceBindIP per Windows 7? Ci sono molte domande simili a questa su questo sito, ma sono per lo più vecchie. Forse ora c'è un modo migliore per risolvere questo problema?

La mia idea attuale è di fare quanto segue:

  1. Configurare il server 3proxy locale associato all'interfaccia desiderata.

  2. Esegui il gioco tramite Proxifier o software simile configurato per l'esecuzione attraverso quel proxy locale.

Non sono sicuro che funzionerà, ma anche se lo farà, sembra una soluzione non ottimale. Ragazzi avete idee migliori?

Modifica: la mia idea non ha funzionato :(

Modifica 2: Fondamentalmente, quello che sto cercando di ottenere è associare alcune applicazioni a un'interfaccia normale, mentre la VPN è in esecuzione. Il motivo è che devo collegarmi tramite VPN per la maggior parte del tempo, ma alcune applicazioni (come i giochi) non funzionano correttamente in questo modo, a causa del ping elevato e di altri problemi.


Hai bisogno di associare IP ad ogni processo nella struttura o solo LolClient.exe? È LolClient.exeun x86o x64exe? Sto giocando con iniettore dll di terze parti e forse posso aiutarti, ma ho bisogno di maggiori informazioni.
Beatcracker,

Stai cercando di associare il processo all'interfaccia VPN o all'interfaccia normale?
MariusMatutiae,

C'è qualche obiettivo specifico che stai cercando di raggiungere? Per impostazione predefinita, il gioco non necessita di connessioni in entrata per funzionare correttamente. Stai cercando di imbrogliare o registrare / riprodurre giochi?
Mario,

Ho cercato una risposta a questa domanda di base ma per gli host OSX. Il mio caso d'uso è che ho LAN e WiFi attivi contemporaneamente. La LAN è su una rete aziendale limitata, wi-fi sul mio WAP. A volte ho bisogno di un browser o di un'app per usare solo il wi-fi in modo da poter d / l i file bloccati dal nostro firewall.
SaxDaddy,

1
@VictorMarchuk Sì, BindIp.dllè a 32 bit, quindi non funzionerebbe con i processi a 64 bit.
Beatcracker

Risposte:


10

Aggiornare

Ho scoperto che ForceBindIp in effetti sta passando parametri ai file eseguibili chiamati. Omette solo il primo parametro . Quindi ho modificato il mio script per usarlo al ForceBindIp.exeposto dell'iniettore personalizzato e ora sembra che tutti i problemi con le injectoryeccezioni siano spariti e tutto funzioni .

Ecco passaggi e BindIp.cmdscript modificati :

  1. Installa ForceBindIp come al solito

  2. Metti BindIp.cmdovunque sul tuo disco (ad es. 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

Quindi seguire i passaggi 2-6 dal basso.


introduzione

ForceBindIp non può iniettare automaticamente BindIp.dllnei processi figlio e non passa parametri ai file eseguibili chiamati . Ma sono stato in grado di aggirare questo problema utilizzando le opzioni di esecuzione dei file di immagine nel registro , negli script batch e nell'iniettore di dll di terze parti . I dettagli sono sotto.

Teoria

Per utilizzarlo BindIp.dllsenza, ForceBindIp.exedobbiamo scoprire come comunicano ( ForceBindIp.exedeve in qualche modo passare l'indirizzo IP alla dll).

Ho usato IDA gratuitamente e ho scoperto che ForceBindIp.execrea una variabile di ambiente con nome FORCEDIPche contiene l'indirizzo BindIp.dllIP e legge l'indirizzo IP da questa variabile quando viene iniettato ed eseguito nel processo di destinazione.

Per rilevare l'avvio dell'applicazione di destinazione, è possibile aggiungere una Debuggerchiave nelle Opzioni di esecuzione del file immagine nel registro per questo eseguibile:

Kernel32! CreateProcess quando chiamato senza i flag di creazione DEBUG_PROCESS o DEBUG_ONLY_THIS_PROCESS, controlla il registro per verificare se IFEO è stato impostato sull'eseguibile che sta avviando. In caso affermativo, semplicemente antepone il percorso del debugger al nome dell'eseguibile, facendo in modo che l'eseguibile si avvii sotto il debugger.

Il "Debugger" nel nostro caso sarà uno script batch, che imposterà la FORCEDIPvariabile e lancerà l' iniettore dll-injector. Injectory quindi avvierà il processo, passerà gli argomenti della riga di comando e inietterà BindIp.dll.

Pratica

  1. Crea una cartella da qualche parte ( C:\BindIpad esempio) e inserisci questi tre file:

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. Creare una chiave di registro (ad es. LolClient.exe) Per l'eseguibile di destinazione inHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
  2. Aggiungi valore stringa a questa chiave:

    • Nome: Debugger
    • Valore: C:\BindIp\BindIp.cmd
  3. Concedi le Usersautorizzazioni complete per questa chiave (lo script dovrà modificarlo ad ogni avvio). Dovrebbe sembrare come questo:Chiave di registro IFEO

  4. Impostare l'indirizzo IP richiesto in BindIp.cmd

  5. Ripetere i punti 3 e 4 per ogni file eseguibile che si desidera bind ( rad_user_kernel.exe, LolLauncher.exe, LolPatcher.exe, etc.).

Ora, ogni volta che avvii un file eseguibile con la corrispondente voce di registro, lo BindIp.cmdscript verrà invece avviato e assocerà questo programma all'indirizzo IP desiderato.

Conclusione

Ho provato questo sul mio laptop con Windows 8.1 x64 e sono riuscito a legare con successo vari programmi ( AIMP 2 , BersIRC , Opera 12.4 ) all'adattatore Ethernet o WiFi usando questa tecnica. Purtroppo BindIp.dllè a 32 bit, quindi non funzionerebbe con i processi a 64 bit.


Grazie mille per una spiegazione dettagliata! Sfortunatamente, sto ricevendo una specie di eccezione dall'ingiunzione: github.com/blole/injectory/issues/4
Victor Marchuk,

@VictorMarchuk Ho fatto più test e, in effetti, a injectoryvolte ho problemi con l' --argsopzione. Non so perché.
Beatcracker,

Non sono stato in grado di eseguirlo anche senza --argsalcuna applicazione
Victor Marchuk,

@VictorMarchuk Hai un esempio? L'ho appena provato con Opera 12.14 e la riga di comando - ha funzionato bene.
Beatcracker,

@VictorMarchuk Sembra che in ForceBindIprealtà possa passare parametri, vedi la mia risposta aggiornata.
Beatcracker,

4

Ho scoperto che HideMyAss! Il client VPN dispone della funzione Secure IP Bind che consente di associare le applicazioni all'interfaccia VPN:

Secure IP Bind ti consente di forzare le applicazioni selezionate sul tuo computer a funzionare solo una volta connesso ai nostri server VPN. Ciò garantisce che le applicazioni selezionate funzionino solo dietro una connessione crittografata sicura. Se apri applicazioni selezionate senza essere connessi alla nostra VPN, non potranno accedere a Internet.

L'ho visto ed è basato su una dll Layer Service Provider (LSP) e un'interfaccia COM personalizzate per controllarlo. E può essere (ab) utilizzato senza installare il client VPN di HideMyAss.

Installazione di Secure IP Bind di HideMyAss

  1. Ottieni l'ultimo installer di Windows: https://www.hidemyass.com/downloads
  2. Disimballalo con 7-zip. Ignora gli avvisi sui file con lo stesso nome, puoi sovrascriverli in modo sicuro.
  3. Vai alla bincartella nel programma di installazione decompresso
  4. Copia quei tre file in una cartella sul tuo disco ( C:\HMA_Bind)

    • ForceInterfaceCOM.dll
    • ForceInterfaceLSP.dll
    • InstallLSP.exe
  5. Metti Install.cmde Uninstall.cmdin questa cartella

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. Esegui Install.cmd come amministratore . Per verificare che l'installazione abbia avuto esito positivo, è possibile utilizzare Autoruns :

Provider Winsock in AUtoruns

  1. Per controllare Secure IP Bind, è necessario chiamare i metodi dell'interfaccia COM. Questo può essere fatto in PowerShell. Se utilizzi il sistema operativo x64, assicurati di avviare Windows PowerShell ISE (x86)o Windows PowerShell (x86), poiché il componente COM è a 32 bit.

Innanzitutto, devi creare un nuovo oggetto Bind IP sicuro:

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

E poi puoi chiamarne i metodi:

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

Disinstallazione di Secure IP Bind di HideMyAss

  1. Esegui Uninstall.cmd come amministratore , verifica che la disinstallazione sia riuscita con Autoruns.

Esempi:

Si noti che è necessario creare l'oggetto COM Bind IP sicuro solo una volta per sessione di PowerShell. Gli esempi seguenti presuppongono che vengano eseguiti in una nuova sessione di PowerShell, quindi creano sempre un nuovo oggetto COM.

  • Imposta IP su cui eseguire il binding, aggiungi firefoxalle applicazioni associate, abilita il binding.

    # 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)
    
  • Abilita globalmente l'associazione IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Enable binding
    $HmaFbi.SetEnabled($true)
    
  • Disabilita globalmente l'associazione IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Disable binding
    $HmaFbi.SetEnabled($false)
    
  • Rimuovi l'applicazione dall'elenco (interrompi l'associazione per questa applicazione):

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

Appunti

Poiché Secure IP Bind è stato implementato come DLL LSP (Layered Service Provider) personalizzata , si applicano tali limitazioni:

Gli LSP sono stati deprecati da Windows Server 2012. I sistemi che includono LSP non supereranno i controlli del logo di Windows. Le app "metro" di Windows 8 che utilizzano la rete bypasseranno automaticamente tutti gli LSP.

Ho testato questo metodo con varie applicazioni con risultati misti: le applicazioni a 32 bit funzionano, ma 64 bit no, cioè sono stato in grado di associare Explorer a 64 bit (probabilmente perché i suoi processi di tabulazione sono a 32 bit per impostazione predefinita), ma non un browser Waterfox a 64 bit o altre applicazioni a 64 bit.


3

Posso pensare a due soluzioni al problema:

  1. Crea una macchina virtuale per l'esecuzione del gioco, che utilizza solo una scheda di rete.

  2. Se conosci l'intervallo di indirizzi IP utilizzati dal gioco, costruisci una route di rete che indirizzi questo intervallo verso il gateway dell'adattatore specifico.

Posso aggiungere ulteriori informazioni quando conosco le tue preferenze. Ad esempio, al punto 1 il prodotto della macchina virtuale preferito.


1
L'uso di una VM creerebbe molti altri problemi, come prestazioni ridotte e un uso costante di pochi GB di RAM. È la mia ultima opzione resort, preferirei davvero raggiungerlo in qualche altro modo. Non conosco la gamma esatta di indirizzi IP che dovrò associare, perché ne ho bisogno per tutti i tipi di applicazioni, incluso il software di condivisione p2p (torrent). Forse c'è un firewall che ti consente di creare percorsi in base alle connessioni stabilite da ciascuna applicazione?
Victor Marchuk,

Prestazioni: una macchina virtuale non causerebbe prestazioni ridotte se non si utilizza il vecchio Virtual PC. Memoria: VMware e VirtualBox non allocano immediatamente tutta la memoria, quindi viene allocata solo la memoria di cui la VM ha veramente bisogno. Hanno anche il vantaggio aggiuntivo per un gioco di poter sospendere e riprendere la VM / gioco in un secondo momento, il che è molto meglio delle capacità di salvataggio della maggior parte dei giochi. Per gli intervalli IP: se ne hai molti, allora quanto sopra non è pratico, né è un proxy.
harrymc,

1
@harrymc Dubito che si sarebbe in grado di ottenere prestazioni 3D accettabili dalla VM usando la GPU emulata. E l'accesso diretto alla scheda grafica è difficile da configurare e richiede CPU VT-D (Intel) o AMD-Vi (e quelle non sono economiche).
Beatcracker,

Tali CPU sono più comuni di quanto pensi: Elenco di hardware che supporta IOMMU , ma il video pass-through potrebbe richiedere due GPU. Tuttavia, a meno che i requisiti di prestazione non siano enormi, al giorno d'oggi una VM offre buone prestazioni video. L'uso di una VM è la mia soluzione per i giochi d'azione che hanno difficoltà ad accettare la mia GPU avanzata, senza riscontrare un notevole ritardo. La maggior parte dei prodotti VM consente un certo controllo della scheda emulata, come la quantità di memoria video,
harrymc,

2
La risposta è sì, e alcune persone l'hanno gestita. Ecco un riferimento: Impostazione di una VM Windows con passthrough GPU , ma è possibile trovarne altre.
harrymc,

3

Supponiamo che tu abbia due account utente di Windows:

  • HomeUser
  • VpnUser

Quando accedi VpnUserall'account puoi eseguire le applicazioni (in particolare i giochi che hai citato) come HomeUser(Shift + RMB sul file eseguibile -> Esegui come altro utente) e queste applicazioni eseguono i loro processi figlio come HomeUser. Le applicazioni che eseguirai in modo standard (scorciatoie, fai doppio clic sul file eseguibile) saranno di proprietà VpnUser.

Quando si definiscono le connessioni di rete di Windows, è disponibile un'opzione per consentire ad altri utenti di utilizzare questa connessione. Supponiamo che tu abbia definito:

  • HomeNetwork esclusivamente per HomeUser
  • VpnNetwork esclusivamente per VpnUser

e per semplificazione:

  • Non ci sono altre connessioni di rete sul tuo computer.

Al momento ho un unico computer Windows su cui non posso sbagliare molto e non ho mai controllato l'impostazione descritta, quindi non sono sicuro che la seguente dichiarazione sia vera.

La mia ipotesi potrebbe essere limitata al client VPN incorporato di Windows: qualsiasi client VPN di terze parti richiede ulteriori indagini.

Mi immagino che le applicazioni:

  • Di proprietà di VpnUserdovrebbe usare solo VpnNetwork.
  • Di proprietà di HomeUserdovrebbe usare solo HomeNetwork.

Se la mia speculazione è vera, allora quando si accede alle VpnUserapplicazioni dell'account verranno utilizzate VpnNetwork, quando dovrebbero essere utilizzate le applicazioni eseguite come HomeUserdall'account .VpnUserHomeNetwork


Non sono sicuro di cosa intendi. Stai suggerendo che dovrei usare un altro account utente di Windows? In che modo contribuirebbe a vincolare applicazioni specifiche? Sembra che la tua soluzione consentirebbe solo di abilitare / disabilitare la VPN per tutte le app, ma posso già farlo collegandomi alla VPN e disconnettendola.
Victor Marchuk,

2
@VictorMarchuk Ho modificato la mia risposta - spero che ora sia più chiaro ...
g2mk,

0

È possibile utilizzare forcebindip.exe ma è necessario codificare un'applicazione di supporto (nessuna altra opzione).

  1. L'applicazione salva i parametri che ha ricevuto dalla sua riga di comando
  2. L'applicazione prende il nome cioè XXXX.EXE
  3. L'applicazione carica XXX.ini che contiene ie

    app_to_run = C:\path1\app_to_run.exe
    ForceBindIP = C:\path2\ForceBindIP.exe 
    IP          = 192.168.10.21
    
  4. L'applicazione viene eseguita

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

  5. L'applicazione termina

PROBLEMA: ForcebindIP non passa i parametri al programma chiamato. quindi se è necessario passare i parametri a app_to_run.exe è necessario un approccio più evoluto in cui XXX.exe crea un file batch che include app_to_run.exe e i parametri passati, questo batch viene quindi chiamato invece di app_to_run.exe al punto 4.

Puoi anche dare un'occhiata ad alcune app della GUI che avvolgono ForcebindIP. Alcuni di loro sono in grado di lavorare con più di un'app ma non fanno ciò di cui hai bisogno.

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


Vuoi dire che l'applicazione helper intercetterebbe un tentativo di creare un processo figlio ed eseguirà invece ForceBindIP? In tal caso, hai qualche suggerimento su come affrontarlo?
Victor Marchuk,

Hai ragione. l'applicazione helper avrà il nome di ogni exe con wrapping e terminerà chiamando l'ex originale corrispondente tramite ForceBind. Naturalmente è necessario qui un gioco di ridenominazione o di directory per evitare 2 ex con lo stesso nome nella stessa directory. Questa app di supporto può essere facilmente codificata, ad esempio in C
Pat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.