Vincular aplicativo a uma interface de rede específica

17

Eu tentei o ForceBindIP, mas tem uma desvantagem significativa - não afeta os filhos do aplicativo que estou tentando vincular, 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 forcebindip.exesempre. Isso se torna um problema com aplicativos como League of Legends, onde a árvore de processos se parece com isso:

captura de tela

O iniciador executa o patcher, o patcher executa o cliente, etc. Só posso afetar o pai de todos esses processos na árvore, para que o jogo real não esteja vinculado à interface que desejo, tornando todo esse empreendimento inútil.

Existe uma alternativa mais moderna ao ForceBindIP para Windows 7? Existem muitas perguntas semelhantes a essa neste site, mas elas são principalmente antigas. Talvez agora haja uma maneira melhor de resolver esse problema?

Minha idéia atual é fazer o seguinte:

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

  2. Execute o jogo através do Proxifier ou software similar configurado para executar esse proxy local.

Não tenho certeza se isso vai funcionar, mas mesmo que pareça, parece uma solução abaixo do ideal. Vocês têm alguma idéia melhor?

Edit: Minha ideia não funcionou :(

Edit 2: Basicamente, o que 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 da VPN na maioria das vezes, mas alguns aplicativos (como jogos) não funcionam corretamente dessa maneira, devido a ping mais alto e outros problemas.

Victor Marchuk
fonte
Você precisa vincular ao IP todos os processos da árvore ou apenas LolClient.exe? É LolClient.exeum x86ou x64exe? Estou brincando com o injetor de DLL de terceiros e talvez eu possa ajudá-lo, mas preciso de mais informações.
Beatcracker
Você está tentando vincular o processo à interface VPN ou à interface normal?
MariusMatutiae
Existe algum objetivo específico que você está tentando alcançar? Por padrão, o jogo não precisa de nenhuma conexão para funcionar corretamente. Você está tentando trapacear ou gravar / reproduzir jogos?
Mario
Eu estou procurando uma resposta para esta pergunta básica, mas para hosts OSX. Meu caso de uso é que tenho LAN e WiFi simultaneamente. A LAN está em uma rede corporativa restrita, wi-fi no meu WAP. Às vezes, preciso de um navegador ou aplicativo para usar apenas o wi-fi, para que eu possa d / l arquivos bloqueados pelo nosso firewall.
SaxDaddy
11
@VictorMarchuk Sim, BindIp.dllé de 32 bits, portanto não funcionaria com processos de 64 bits.
Beatcracker

Respostas:

10

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 em ForceBindIp.exevez do injetor personalizado e agora parece que todos os problemas com injectoryexceções se foram e tudo funciona.

Aqui estão as etapas e o BindIp.cmdscript modificados :

  1. Instale o ForceBindIp como de costume

  2. Coloque em BindIp.cmdqualquer lugar da sua unidade (por exemplo C:\BindIp\BindIp.cmd)

BindIp.cmd roteiro:

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 2 a 6 abaixo.


Introdução

O ForceBindIp não pode injetar automaticamente BindIp.dllprocessos filho e não passa parâmetros para os executáveis ​​chamados . Mas consegui contornar isso usando as Opções de execução de arquivo de imagem no registro , script em lote e injetor de DLL de terceiros . Os detalhes estão abaixo.

Teoria

Para usar BindIp.dllsem ForceBindIp.exe, precisamos descobrir como eles se comunicam ( ForceBindIp.exetem que passar o endereço IP para a DLL de alguma forma).

Usei o IDA gratuitamente e descobri que ForceBindIp.execria uma variável de ambiente com o nome FORCEDIPque contém o endereço BindIp.dllIP e lê o endereço IP dessa variável quando injetada e executada no processo de destino.

Para detectar o lançamento do aplicativo de destino, podemos adicionar uma Debuggerchave nas Opções de execução do arquivo de imagem no registro para este executável:

O Kernel32! CreateProcess, quando chamado sem os sinalizadores de criação DEBUG_PROCESS ou DEBUG_ONLY_THIS_PROCESS, verifica o registro para ver se o IFEO foi definido no executável que está sendo iniciado. Se sim, simplesmente precede o caminho do depurador ao nome do executável, efetivamente fazendo com que o executável seja iniciado no depurador.

O "Depurador", no nosso caso, será um script em lote, que definirá a FORCEDIPvariável e iniciará o injetor dll-injector. O injetor iniciará o processo, transmitirá argumentos da linha de comando e injetará BindIp.dll.

Prática

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

BindIp.cmd roteiro:

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

    • Nome: Debugger
    • Valor: C:\BindIp\BindIp.cmd
  3. Conceda Userspermissões totais a essa chave (o script precisará modificá-lo a cada inicialização). Deve ficar assim:Chave de registro IFEO

  4. Defina o endereço IP necessário em BindIp.cmd

  5. Repita os passos 3 e 4 para cada arquivo executável que você deseja bind ( rad_user_kernel.exe, LolLauncher.exe, LolPatcher.exe, etc.).

Agora, toda vez que você iniciar o executável com entrada de registro correspondente, o BindIp.cmdscript será iniciado e vinculará esse programa ao endereço IP desejado.

Conclusão

Eu testei isso no meu laptop executando o Windows 8.1 x64 e consegui vincular vários programas ( AIMP 2 , BersIRC , Opera 12.4 ) ao adaptador Ethernet ou WiFi usando esta técnica. Infelizmente, BindIp.dllé de 32 bits, portanto não funcionaria com processos de 64 bits.

beatcracker
fonte
Muito obrigado por uma explicação detalhada! Infelizmente, estou recebendo algum tipo de exceção no injector: github.com/blole/injectory/issues/4
Victor Marchuk
@VictorMarchuk fiz mais testes e, de fato, injectoryàs vezes tem problemas com a --argsopção. Não sei por que.
Beatcracker
Eu não era capaz de executá-lo, mesmo sem --argscom qualquer aplicação
Victor Marchuk
@VictorMarchuk Você tem um exemplo? Acabei de testar com o Opera 12.14 e com a linha de comando - funcionou bem.
Beatcracker
@VictorMarchuk Parece que ForceBindIprealmente pode passar parâmetros, veja minha resposta atualizada.
Beatcracker
4

Eu descobri que HideMyAss! O cliente VPN possui o recurso Secure IP Bind que permite vincular aplicativos à interface VPN:

O Secure IP Bind permite que você force os aplicativos selecionados no seu computador a funcionarem apenas uma vez conectados aos nossos servidores VPN. Isso garante que os aplicativos selecionados funcionem apenas por trás de uma conexão criptografada segura. Se você abrir aplicativos selecionados sem estar conectado à nossa VPN, eles não poderão acessar a Internet.

Eu olhei para ele e é baseado em uma dll personalizada do provedor de serviços em camadas (LSP) e na interface COM para controlá-lo. E pode ser (ab) usado sem instalar o cliente VPN do HideMyAss.

Instalando a ligação IP segura do HideMyAss

  1. Obtenha o instalador mais recente do Windows: https://www.hidemyass.com/downloads
  2. Descompacte-o com 7 zip. Ignore os avisos sobre arquivos com o mesmo nome; você pode substituí-los com segurança.
  3. Vá para a binpasta 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.cmde Uninstall.cmdnesta 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. Execute Install.cmd como administrador . Para verificar se a instalação foi bem-sucedida, você pode usar Autoruns :

Provedores de Winsock em AUtoruns

  1. Para controlar o Secure IP Bind, é necessário chamar os métodos da interface COM. Isso pode ser feito no PowerShell. Se você estiver no sistema operacional x64, inicie Windows PowerShell ISE (x86)ou Windows PowerShell (x86)porque o componente COM é de 32 bits.

Primeiro, você deve criar o 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 de 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 a ligação de IP segura do HideMyAss

  1. Execute Uninstall.cmd como administrador , verifique se a desinstalação foi bem-sucedida com as Execuções automáticas.

Exemplos:

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

  • Configure o IP para vincular, adicione firefoxaos aplicativos vinculados, ative a ligaçã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)
    
  • Ative 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)
    
  • Desative 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)
    
  • Remova o aplicativo da lista (pare de vincular 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 implementado como uma dll LSP (Provedor de Serviços em Camadas) personalizado , essas limitações se aplicam:

Os LSPs estão obsoletos desde o Windows Server 2012. Os sistemas que incluem LSPs não passam nas verificações do logotipo do Windows. Os aplicativos "metro" no estilo Windows 8 que usam rede ignoram automaticamente todos os LSPs.

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

beatcracker
fonte
3

Eu posso pensar em duas soluções para o problema:

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

  2. Se você souber o intervalo de endereços IP que o jogo usa, construa uma rota de rede que direcione esse intervalo para o gateway do adaptador específico.

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

harrymc
fonte
11
O uso de uma VM criaria muitos problemas adicionais, como desempenho reduzido e uso constante de alguns GB de RAM. É a minha última opção de resort, eu realmente preferiria alcançá-la de alguma outra maneira. Não sei o intervalo exato de IPs que precisarei vincular, porque preciso dele para todos os tipos de aplicativos, incluindo o software de compartilhamento p2p (torrents). Talvez haja um firewall que permita criar rotas com base nas conexões que cada aplicativo estabelece?
Victor Marchuk
Desempenho: uma VM não causaria um desempenho reduzido se não se usasse o antigo PC Virtual. Memória: o VMware e o VirtualBox não alocam toda a memória imediatamente, portanto, apenas a memória que a VM realmente precisa é alocada. Eles também têm a vantagem adicional de poder suspender e retomar a VM / jogo posteriormente, o que é muito melhor do que as habilidades de salvamento da maioria dos jogos. Para intervalos de IP: Se você tiver muitos deles, o acima exposto não é prático, nem é um proxy.
harrymc
11
@harrymc Duvido que alguém possa obter um desempenho 3D aceitável da VM usando GPU emulada. E o acesso direto à placa gráfica é difícil de configurar e requer CPU compatível com VT-D (Intel) ou AMD-Vi (e essas não são baratas).
Beatcracker
Essas CPUs são mais comuns do que você pensa: Lista de hardware que suporta o IOMMU , mas o vídeo de passagem pode exigir duas GPUs. No entanto, a menos que os requisitos de desempenho sejam enormes, atualmente uma VM oferece bom desempenho de vídeo. Usar uma VM é minha solução para jogos de ação que têm problemas para aceitar minha GPU avançada, sem encontrar um atraso perceptível. A maioria dos produtos VM permitir algum controle do cartão emulado, tais como a quantidade de memória de vídeo,
harrymc
2
A resposta é sim, e algumas pessoas conseguiram isso. Aqui está uma referência: Configurando uma VM do Windows com passagem GPU , mas mais pode ser encontrado.
harrymc
3

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

  • HomeUser
  • VpnUser

Quando você faz login na VpnUserconta, pode executar aplicativos (principalmente os jogos mencionados) 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) serão de propriedade de 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.

Atualmente, tenho uma única máquina Windows na qual não posso estragar muito e nunca verifiquei a configuração descrita, por isso não tenho certeza se a afirmação abaixo é verdadeira.

Meu palpite pode estar limitado ao cliente VPN interno do Windows - qualquer cliente VPN de terceiros exige uma investigação mais aprofundada.

Eu acho que as aplicações:

  • Possuído por VpnUserdeve usar apenas VpnNetwork.
  • Possuído por HomeUserdeve usar apenas HomeNetwork.

Se minha especulação for verdadeira, quando você fizer login na VpnUserconta, os aplicativos serão usados VpnNetwork, quando os aplicativos executados a partir HomeUserda VpnUserconta deverão ser utilizados HomeNetwork.

g2mk
fonte
Não sei bem o que você quer dizer. Você está sugerindo que eu deveria usar uma conta de usuário diferente do Windows? Como isso ajudaria a vincular aplicativos específicos? Parece que sua solução só permitiria ativar / desativar a VPN para todos os aplicativos, mas eu já posso fazer isso conectando-me à VPN e desconectando-a.
Victor Marchuk
2
@VictorMarchuk editei minha resposta - espero que esteja mais claro agora ...
g2mk
0

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

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

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

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

  5. O aplicativo termina

PROBLEMA: O ForcebindIP não passa parâmetros para o programa chamado. 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 em lotes, 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 da GUI que envolvem o ForcebindIP. Alguns deles podem trabalhar com mais de um aplicativo, mas não fazem o que você precisa.

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

Pat
fonte
Você quer dizer que o aplicativo auxiliar interceptaria uma tentativa de criar um processo filho e o executaria através do ForceBindIP? Em caso afirmativo, você tem alguma sugestão sobre como abordar isso?
Victor Marchuk
Você está certo. o aplicativo auxiliar terá o nome de cada exe agrupado e terminará de chamar o exe original correspondente por meio do ForceBind. É claro que você precisa aqui de algum jogo de renomeação ou diretório para evitar 2 exes com o mesmo nome no mesmo diretório. Este aplicativo auxiliar pode ser facilmente codificado, ou seja, em C
Pat