Vincular aplicativo a uma interface de rede específica

15

Eu tentei o ForceBindIP, mas ele tem uma desvantagem significativa - ele não afeta os filhos do aplicativo que estou tentando vincular, ele afeta apenas o próprio aplicativo. Ele também não pode forçar um aplicativo a sempre executar através de uma interface especificada, ele deve ser executado por forcebindip.exe a cada vez. Torna-se um problema com aplicações como League of Legends, onde a árvore de processos se parece com isso:

O lançador executa o patcher, o patcher executa o cliente, etc. Eu só posso afetar o pai de todos esses processos na árvore, então o jogo real não está ligado à interface que eu quero, tornando todo esse empreendimento sem sentido.

Existe uma alternativa mais moderna ao ForceBindIP para o Windows 7? Há muitas perguntas semelhantes a esta neste site, mas são na maioria antigas. Talvez exista agora uma maneira melhor de resolver esse problema?

Minha ideia atual é fazer o seguinte:

  1. Configure o servidor local 3proxy vinculado à interface desejada.

  2. Execute o jogo por meio do Proxifier ou software semelhante configurado para executar esse proxy local.

Eu não tenho certeza se isso vai funcionar, mas mesmo assim, parece uma solução sub-ótima. Vocês têm alguma ideia melhor?

Edit: Minha ideia não funcionou: (

Editar 2: Basicamente, o que eu estou tentando alcançar é vincular alguns aplicativos a uma interface regular, enquanto a VPN está em execução. O motivo é que eu preciso me conectar através de VPN na maioria das vezes, mas alguns aplicativos (como jogos) não funcionam corretamente dessa forma, devido ao ping mais alto e a outros problemas.

    
por Victor Marchuk 24.11.2015 / 07:31

5 respostas

9

Atualizar

Descobri que o ForceBindIp, na verdade, está passando parâmetros para os executáveis chamados. Apenas omite o primeiro parâmetro . Então modifiquei meu script para usar ForceBindIp.exe em vez de um injetor personalizado e agora parece que todos os problemas com injectory exceções foram eliminados e tudo funciona.

Aqui estão os passos modificados e BindIp.cmd script:

  1. Instale o ForceBindIp como de costume

  2. Coloque BindIp.cmd em qualquer lugar na sua unidade (por exemplo, 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

Em seguida, siga as etapas de 2 a 6 abaixo.

Introdução

O

ForceBindIp não pode injetar BindIp.dll automaticamente nos processos-filhos e não passa os parâmetros para os executáveis chamados . Mas eu fui capaz de contornar isso usando Image Opções de Execução de Arquivos no Registro , script em lote e injetor de dll de terceiros . Detalhes abaixo.

Teoria

Para usar BindIp.dll sem ForceBindIp.exe , precisamos descobrir como eles se comunicam ( ForceBindIp.exe tem que passar o endereço IP para dll de alguma forma).

Eu usei o IDA gratuito e descobri que ForceBindIp.exe cria uma variável de ambiente com o nome FORCEDIP que contém o endereço IP e BindIp.dll lê o endereço IP dessa variável quando é injetado e executado no processo de destino.

Para detectar o lançamento do aplicativo de destino, podemos adicionar uma chave Debugger nas Opções de Execução de Arquivo de Imagem no registro para este executável:

Kernel32!CreateProcess when called without the DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS creation flags, checks the registry to see if IFEO has been set on the executable that it is launching. If yes, then it simply prepends the debugger path to the executable name, effectively getting the executable to launch under the debugger.

O "Depurador", no nosso caso, será um script em lote, que irá definir a variável FORCEDIP e lançar a injectoria dll-injector. O Injector então iniciará o processo, passará os argumentos da linha de comando e injetará BindIp.dll .

Pratique

  1. Crie uma pasta em algum lugar ( C:\BindIp , por exemplo) e coloque esses três arquivos nela:

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. Crie a chave de registro (por exemplo, LolClient.exe ) para o executável de destino em HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
  2. Adicione um valor de string a esta chave:

    • Nome: Debugger
    • Valor: C:\BindIp\BindIp.cmd
  3. Conceder Users Permissões completas nessa chave (o script precisará modificá-lo a cada lançamento). Ele deve ficar assim:

  4. DefinaoendereçoIPobrigatórioemBindIp.cmd

  5. Repitaasetapas3e4paracadaexecutávelquevocêdesejavincular(rad_user_kernel.exe,LolLauncher.exe,LolPatcher.exe,etc.).

Agora,todavezquevocêiniciaroexecutávelquetiveraentradaderegistrocorrespondente,oscriptBindIp.cmdseráiniciadoevinculadoaesseprogramaaoendereçoIPdesejado.

Conclusão

EutesteiissonomeulaptopexecutandooWindows8.1x64efoicapazdevincularcomêxitováriosprogramas( AIMP 2 , BersIRC , Opera 12.4 ) para adaptador Ethernet ou WiFi usando esta técnica. Infelizmente BindIp.dll é de 32 bits, então não funcionaria com processos de 64 bits.

    
por 03.12.2015 / 02:27
4

Posso pensar em duas soluções para o problema:

  1. Crie uma máquina virtual para executar o jogo, que usa apenas o adaptador de rede.

  2. Se você conhece o intervalo de endereços IP que o jogo usa, construir uma rota de rede que direcione esse intervalo em direção ao gateway do adaptador específico.

Posso adicionar mais informações quando souber suas preferências. Por exemplo, no ponto 1, seu produto de máquina virtual preferido.

    
por 01.12.2015 / 20:46
4

Descobri que o cliente HideMyAss! tem Secure IP Bind que permite vincular aplicativos à interface VPN:

Secure IP Bind enables you to force selected applications on your computer to only work once connected to our VPN servers. This ensures selected applications will only work behind a secure encrypted connection. If you open selected applications without being connected to our VPN, they won't be able to access the internet.

Eu olhei para ele e ele é baseado em uma dll Layer Provider Service (LSP) personalizada e na interface COM controlá-lo. E pode ser (ab) usado sem instalar o cliente VPN do HideMyAss.

Instalando o Secure IP Bind do HideMyAss

  1. Obtenha o instalador mais recente do Windows: link
  2. Desembale com 7 zip. Ignore avisos sobre arquivos com o mesmo nome, você pode sobrescrevê-los com segurança.
  3. Ir para a pasta bin no instalador descompactado
  4. Copie esses três arquivos para uma pasta no seu disco ( C:\HMA_Bind )

    • ForceInterfaceCOM.dll
    • ForceInterfaceLSP.dll
    • InstallLSP.exe
  5. Coloque Install.cmd e Uninstall.cmd nessa pasta

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. Executar Install.cmd como administrador . Para verificar se essa instalação foi bem-sucedida, use Autoruns :

  • Para controlar a Ligação IP Segura, você precisa chamar os métodos da interface COM. Isso pode ser feito no PowerShell. Se você está no sistema operacional x64, lembre-se de lançar Windows PowerShell ISE (x86) ou Windows PowerShell (x86) , porque o componente COM é de 32 bits.
  • Primeiro, você precisa criar um novo objeto Secure IP Bind:

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

    E então você pode chamar seus 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()
    

    Desinstalando o 'Secure IP Bind' do HideMyAss

    1. Execute Uninstall.cmd como administrador , verifique se a desinstalação foi bem-sucedida com o Autoruns.

    Exemplos:

    Observe que você precisa criar um objeto COM de ligação IP seguro somente uma vez por sessão do PowerShell. Os exemplos abaixo assumem que você os execute em uma nova sessão do PowerShell, para que eles sempre criem um novo objeto COM.

    • Defina o IP para vincular, adicione firefox aos aplicativos vinculados, ative a vinculação.

      # 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)
      
    • Ativar globalmente a ligação de IP:

      # Create new Secure IP Bind COM object
      $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
      
      # Enable binding
      $HmaFbi.SetEnabled($true)
      
    • Desativar globalmente a ligação de IP:

      # Create new Secure IP Bind COM object
      $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
      
      # Disable binding
      $HmaFbi.SetEnabled($false)
      
    • Remover aplicativo da lista (parar ligação para este aplicativo):

      # 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

    Como o Secure IP Bind foi implementado como uma dll customizada LSP (Layered Service Provider) , essas limitações se aplicam:

    LSPs have been deprecated since Windows Server 2012. Systems that include LSPs will not pass the Windows logo checks. Windows 8 style "metro" apps that use networking will automatically bypass all LSPs.

    Eu testei esse método com vários aplicativos com resultados mistos: aplicativos de 32 bits funcionam, mas não de 64 bits, ou seja, eu consegui vincular o Explorer de 64 bits (provavelmente porque ele é de 32 bits por padrão ), mas não o navegador Waterfox de 64 bits ou outros aplicativos de 64 bits.

        
    por 04.12.2015 / 18:44
    3

    Vamos supor que você tenha duas contas de usuário do Windows:

    • HomeUser
    • VpnUser

    Quando você faz login na conta VpnUser , é possível executar aplicativos (especialmente jogos que você mencionou) como HomeUser (Shift + RMB no arquivo executável - > Executar como outro usuário) e esses aplicativos executam seus processos filhos como HomeUser . Os aplicativos que você executará de maneira padrão (atalhos, clique duas vezes no arquivo executável) pertencerão a VpnUser .

    Ao definir as conexões de rede do Windows, você tem a opção de permitir que outros usuários usem essa conexão. Vamos supor que você definiu:

    • HomeNetwork exclusivamente para HomeUser
    • VpnNetwork exclusivamente para VpnUser

    e para simplificação:

    • Não há outras conexões de rede no seu computador.

    I currently have single Windows machine on which I can't mess up much and I have never checked described setting so I'm not sure if bellow statement is true.

    My guess might be limited to Windows built-in VPN Client - any 3-rd party VPN client requires further investigation.

    Eu acho que os aplicativos:

    • Propriedade de VpnUser deve usar apenas VpnNetwork .
    • Propriedade de HomeUser deve usar apenas HomeNetwork .

    Se minha especulação for verdadeira, quando você fizer login em VpnUser , os aplicativos da conta usarão VpnNetwork , quando os aplicativos forem executados, pois HomeUser da conta VpnUser deve usar HomeNetwork .

        
    por 04.12.2015 / 00:39
    1

    forcebindip.exe pode ser usado, mas você deve codificar um aplicativo auxiliar (nenhuma outra opção).

    1. O aplicativo salva os parâmetros que receberam de sua linha de comando
    2. O aplicativo recebe seu nome, por exemplo, XXXX.EXE
    3. O aplicativo carrega XXX.ini que contém, por exemplo,

      app_to_run = C:\path1\app_to_run.exe
      ForceBindIP = C:\path2\ForceBindIP.exe 
      IP          = 192.168.10.21
      
    4. O aplicativo é executado

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

    5. O aplicativo termina

    PROBLEMA: O ForcebindIP não passa parâmetros para o programa chamado. então, se você precisar passar parâmetros para o app_to_run.exe, precisará de uma abordagem mais evoluída, em que o XXX.exe crie um arquivo de lote, incluindo app_to_run.exe e os parâmetros passados, esse lote será chamado em vez de app_to_run.exe no ponto 4.

    Você também pode dar uma olhada em alguns aplicativos de GUI que envolvem o ForcebindIP. Alguns deles podem trabalhar com mais de um aplicativo, mas não fazem o que você precisa.

    link

        
    por 01.12.2015 / 15:50