Powiąż aplikację z określonym interfejsem sieciowym

17

Próbowałem ForceBindIP, ale ma to znaczącą wadę - nie wpływa na dzieci aplikacji, którą próbuję powiązać, wpływa tylko na samą aplikację. Nie może też wymuszać, aby aplikacja zawsze działała przez określony interfejs, należy ją uruchamiać za forcebindip.exekażdym razem. Staje się to problemem w aplikacjach takich jak League of Legends, w których drzewo procesów wygląda następująco:

zrzut ekranu

Program uruchamiający uruchamia łatkę, łatka uruchamia klienta itp. Mogę wpływać tylko na rodzica wszystkich tych procesów w drzewie, więc rzeczywista gra nie jest związana z interfejsem, który chcę, co sprawia, że ​​to przedsięwzięcie jest bezcelowe.

Czy istnieje bardziej nowoczesna alternatywa dla ForceBindIP dla systemu Windows 7? Na tej stronie jest wiele pytań podobnych do tego, ale są one w większości stare. Może jest teraz lepszy sposób na rozwiązanie tego problemu?

Mój obecny pomysł polega na wykonaniu następujących czynności:

  1. Skonfiguruj lokalny serwer 3proxy powiązany z pożądanym interfejsem.

  2. Uruchom grę za pomocą Proxifier lub podobnego oprogramowania skonfigurowanego do uruchamiania przez lokalny serwer proxy.

Nie jestem pewien, czy to zadziała, ale nawet jeśli tak, wydaje się, że jest to rozwiązanie nieoptymalne. Czy macie jakieś lepsze pomysły?

Edycja: Mój pomysł nie zadziałał :(

Edycja 2: Zasadniczo to, co próbuję osiągnąć, to powiązać kilka aplikacji ze zwykłym interfejsem, gdy VPN jest uruchomiony. Powodem jest to, że przez większość czasu muszę się łączyć przez VPN, ale niektóre aplikacje (takie jak gry) nie działają poprawnie w ten sposób, ze względu na wyższy ping i inne problemy.

Victor Marchuk
źródło
Czy potrzebujesz powiązać z IP każdy proces w drzewie, czy tylko LolClient.exe? Czy lub exe? Zabawiam się aplikatorem DLL innej firmy i może mogę ci pomóc, ale potrzebuję więcej informacji. LolClient.exex86x64
beatcracker
Czy próbujesz powiązać proces z interfejsem VPN, czy zwykłym interfejsem?
MariusMatutiae,
Czy jest jakiś konkretny cel, który próbujesz osiągnąć? Domyślnie gra nie potrzebuje żadnych połączeń przychodzących, aby działać poprawnie. Czy próbujesz oszukiwać lub nagrywać / odtwarzać gry?
Mario,
Szukałem odpowiedzi na to podstawowe pytanie, ale dla hostów OSX. Mój przypadek użycia polega na tym, że mam jednocześnie sieć LAN i WiFi. LAN jest w ograniczonej sieci korporacyjnej, Wi-Fi na moim WAP. Czasami potrzebuję przeglądarki lub aplikacji, aby korzystać tylko z Wi-Fi, aby móc kopiować pliki zablokowane przez naszą zaporę.
SaxDaddy,
1
@VictorMarchuk Tak, BindIp.dlljest 32-bitowy, więc nie będzie działać z procesami 64-bitowymi.
beatcracker

Odpowiedzi:

10

Aktualizacja

Odkryłem, że ForceBindIp faktycznie przekazuje parametry do wywoływanych plików wykonywalnych. Po prostu pomija pierwszy parametr . Zmodyfikowałem więc skrypt, aby używał ForceBindIp.exezamiast niestandardowego wtryskiwacza i teraz wygląda na to, że wszystkie problemy z injectorywyjątkami zniknęły i wszystko działa.

Oto zmodyfikowane kroki i BindIp.cmdskrypt:

  1. Zainstaluj ForceBindIp jak zwykle

  2. Umieść w BindIp.cmddowolnym miejscu na dysku (np. C:\BindIp\BindIp.cmd)

BindIp.cmd scenariusz:

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

Następnie wykonaj kroki 2-6 od dołu.


Wprowadzenie

ForceBindIp nie może automatycznie wstrzykiwać BindIp.dlldo procesów potomnych i nie przekazuje parametrów do wywoływanych plików wykonywalnych . Ale udało mi się to obejść, używając opcji wykonania pliku obrazu w rejestrze , skrypcie wsadowym i aplikatorze DLL innej firmy . Szczegóły są poniżej.

Teoria

Aby korzystać BindIp.dllbez ForceBindIp.exe, musimy dowiedzieć się, w jaki sposób się komunikują ( ForceBindIp.exemusi jakoś przekazać adres IP do dll).

Użyłem IDA za darmo i odkryłem, że ForceBindIp.exetworzy zmienną środowiskową o nazwie, FORCEDIPktóra przechowuje adres IP i BindIp.dllodczytuje adres IP z tej zmiennej po jej wstrzyknięciu i wykonaniu w procesie docelowym.

Aby wykryć uruchomienie aplikacji docelowej, możemy dodać Debuggerklucz w Opcjach wykonania pliku obrazu w rejestrze dla tego pliku wykonywalnego:

Jądro32! CreateProcess, gdy jest wywoływane bez flag tworzenia DEBUG_PROCESS lub DEBUG_ONLY_THIS_PROCESS, sprawdza rejestr, aby sprawdzić, czy IFEO został ustawiony w pliku wykonywalnym, który uruchamia. Jeśli tak, to po prostu przygotowuje ścieżkę debugera do nazwy pliku wykonywalnego, skutecznie uruchamiając plik wykonywalny w debugerze.

„Debugger” w naszym przypadku będzie skryptem wsadowym, który ustawi FORCEDIPzmienną i uruchomi wtryskowy dll-injector. Wtrysk następnie rozpocznie proces, przekaże argumenty wiersza poleceń i wstrzykuje BindIp.dll.

Ćwiczyć

  1. Utwórz folder gdzieś ( C:\BindIpna przykład) i umieść w nim te trzy pliki:

BindIp.cmd scenariusz:

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. Utwórz klucz rejestru (np. LolClient.exe) Dla docelowego pliku wykonywalnego wHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
  2. Dodaj wartość ciągu do tego klucza:

    • Nazwa: Debugger
    • Wartość: C:\BindIp\BindIp.cmd
  3. Przyznaj Userspełne uprawnienia do tego klucza (skrypt będzie musiał go modyfikować przy każdym uruchomieniu). To powinno wyglądać tak:Klucz rejestru IFEO

  4. Ustaw wymagany adres IP w BindIp.cmd

  5. Powtórz kroki 3 i 4 dla każdego pliku wykonywalnego, który chcesz bind ( rad_user_kernel.exe, LolLauncher.exe, LolPatcher.exe, itd.).

Teraz za każdym razem, gdy uruchamiasz plik wykonywalny, który ma odpowiedni wpis rejestru, BindIp.cmdskrypt uruchamia się zamiast tego i wiąże ten program z pożądanym adresem IP.

Wniosek

Przetestowałem to na moim laptopie z systemem Windows 8.1 x64 i byłem w stanie z powodzeniem powiązać różne programy ( AIMP 2 , BersIRC , Opera 12.4 ) z Ethernetem lub kartą WiFi za pomocą tej techniki. Niestety BindIp.dlljest 32-bitowy, więc nie działałby z procesami 64-bitowymi.

beatcracker
źródło
Dziękuję bardzo za szczegółowe wyjaśnienie! Niestety dostaję jakiś wyjątek od iniekcji
Victor Marchuk
@VictorMarchuk Zrobiłem więcej testów i rzeczywiście injectoryczasami mam problemy z --argsopcją. Nie pewny dlaczego.
beatcracker
Nie byłem w stanie uruchomić go nawet bez --argsżadnej aplikacji
Victor Marchuk
@VictorMarchuk Czy masz przykład? Właśnie przetestowałem go z Operą 12.14 i wierszem poleceń - działało dobrze.
beatcracker
@VictorMarchuk Wygląda na to, że ForceBindIpfaktycznie może przekazać parametry, zobacz moją zaktualizowaną odpowiedź.
beatcracker
4

Znalazłem HideMyAss! Klient VPN ma funkcję Secure IP Bind, która pozwala powiązać aplikacje z interfejsem VPN:

Secure IP Bind pozwala zmusić wybrane aplikacje na twoim komputerze do działania tylko po połączeniu z naszymi serwerami VPN. Zapewnia to, że wybrane aplikacje będą działać tylko za bezpiecznym szyfrowanym połączeniem. Jeśli otworzysz wybrane aplikacje bez połączenia z naszą siecią VPN, nie będą one miały dostępu do Internetu.

Patrzyłem na to i jest oparty na niestandardowej bibliotece DLL (LSP) i interfejsie COM do jej kontrolowania. I może być (ab) używany bez instalowania klienta VPN HideMyAss.

Instalowanie bezpiecznego powiązania IP HideMyAss

  1. Pobierz najnowszy instalator Windows: https://www.hidemyass.com/downloads
  2. Rozpakuj go za pomocą 7 suwaków. Zignoruj ​​ostrzeżenia o plikach o tej samej nazwie, możesz je bezpiecznie zastąpić.
  3. Przejdź do binfolderu w rozpakowanym instalatorze
  4. Skopiuj te trzy pliki do folderu na dysku ( C:\HMA_Bind)

    • ForceInterfaceCOM.dll
    • ForceInterfaceLSP.dll
    • InstallLSP.exe
  5. Umieść Install.cmdi Uninstall.cmddo tego folderu

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. Uruchom Install.cmd jako administrator . Aby sprawdzić, czy instalacja się powiodła, możesz użyć Autoruns :

Dostawcy Winsock w AUtoruns

  1. Aby kontrolować Secure IP Bind, musisz wywołać metody interfejsu COM. Można to zrobić w PowerShell. Jeśli korzystasz z systemu operacyjnego x64, uruchom Windows PowerShell ISE (x86)lub Windows PowerShell (x86), ponieważ składnik COM jest 32-bitowy.

Najpierw musisz utworzyć nowy obiekt Secure IP Bind:

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

A potem możesz nazwać to metodami:

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

Odinstalowanie Secure IP Bind HideMyAss

  1. Uruchom Uninstall.cmd jako Administrator , sprawdź, czy deinstalacja powiodła się przy Autorunach.

Przykłady:

Zauważ, że musisz utworzyć bezpieczny obiekt COM Bindowanie IP tylko raz na sesję PowerShell. Poniższe przykłady zakładają, że wykonujesz je w nowej sesji PowerShell, więc zawsze tworzą nowy obiekt COM.

  • Ustaw IP do łączenia, dodaj firefoxdo powiązanych aplikacji, włącz powiązanie.

    # 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)
    
  • Globalnie włącz powiązanie IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Enable binding
    $HmaFbi.SetEnabled($true)
    
  • Globalnie wyłącz powiązanie IP:

    # Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Disable binding
    $HmaFbi.SetEnabled($false)
    
  • Usuń aplikację z listy (zatrzymaj wiązanie dla tej aplikacji):

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

Notatki

Ponieważ Secure IP Bind zaimplementowano jako dll niestandardowego dostawcy usług warstwowych (LSP) , te ograniczenia mają zastosowanie:

LSP są przestarzałe od Windows Server 2012. Systemy zawierające LSP nie przejdą kontroli logo Windows. Aplikacje „metro” w stylu Windows 8, które używają sieci, automatycznie omijają wszystkie LSP.

Przetestowałem tę metodę z różnymi aplikacjami z mieszanymi wynikami: aplikacje 32-bitowe działają, ale nie 64-bitowe, tzn. Byłem w stanie powiązać 64-bitowy Eksplorator (prawdopodobnie dlatego, że procesy tabulacji są domyślnie 32-bitowe), ale nie 64-bitowa przeglądarka Waterfox lub inne 64-bitowe aplikacje.

beatcracker
źródło
3

Mogę wymyślić dwa rozwiązania problemu:

  1. Utwórz maszynę wirtualną do uruchamiania gry, która korzysta tylko z jednej karty sieciowej.

  2. Jeśli znasz zakres adresów IP używanych przez grę, zbuduj trasę sieciową, która kieruje ten zakres w stronę bramy określonego adaptera.

Mogę dodać więcej informacji, gdy poznam twoje preferencje. Na przykład w punkcie 1 preferowany produkt maszyny wirtualnej.

harrymc
źródło
1
Korzystanie z maszyny wirtualnej spowodowałoby wiele dodatkowych problemów, takich jak zmniejszona wydajność i ciągłe użycie kilku GB pamięci RAM. To moja ostatnia opcja, naprawdę wolałbym to osiągnąć w inny sposób. Nie znam dokładnego zakresu adresów IP, które muszę powiązać, ponieważ potrzebuję go do wszystkich rodzajów aplikacji, w tym oprogramowania do udostępniania p2p (torrentów). Może istnieje zapora ogniowa, która pozwala tworzyć trasy na podstawie połączeń nawiązywanych przez każdą aplikację?
Victor Marchuk
Wydajność: maszyna wirtualna nie spowoduje obniżenia wydajności, jeśli nie używa się starego wirtualnego komputera. Pamięć: VMware i VirtualBox nie przydzielają natychmiast całej pamięci, więc przydzielana jest tylko pamięć, której naprawdę potrzebuje VM. Mają też dodatkową zaletę, że w grze można zawiesić i wznowić maszynę wirtualną / grę w późniejszym czasie, co jest znacznie lepsze niż możliwości zapisywania większości gier. W przypadku zakresów adresów IP: jeśli masz ich wiele, powyższe nie jest praktyczne, podobnie jak proxy.
harrymc
1
@harrymc Wątpię, aby można było uzyskać akceptowalną wydajność 3D z VM za pomocą emulowanego GPU. Bezpośredni dostęp do karty graficznej jest trudny w konfiguracji i wymaga procesora obsługującego VT-D (Intel) lub AMD-Vi (a te nie są tanie).
beatcracker
Takie procesory są bardziej powszechne, niż myślisz: Lista sprzętu obsługującego IOMMU , ale przesyłanie wideo może wymagać dwóch procesorów graficznych. Jednak, chyba że wymagania dotyczące wydajności są ogromne, VM zapewnia obecnie dobrą wydajność wideo. Korzystanie z maszyny wirtualnej to moje rozwiązanie dla gier akcji, które mają problemy z zaakceptowaniem mojego zaawansowanego procesora graficznego, bez zauważalnego opóźnienia. Większość produktów VM umożliwia kontrolę nad emulowaną kartą, na przykład ilość pamięci wideo,
harrymc
2
Odpowiedź brzmi „tak” i niektórym ludziom się to udało. Oto jedno odniesienie: Konfigurowanie maszyny wirtualnej z systemem Windows z przekazywaniem GPU , ale można znaleźć więcej.
harrymc
3

Załóżmy, że masz dwa konta użytkowników systemu Windows:

  • HomeUser
  • VpnUser

Po zalogowaniu się na VpnUserkonto możesz uruchamiać aplikacje (szczególnie wspomniane gry) jako HomeUser(Shift + RMB na pliku wykonywalnym -> Uruchom jako inny użytkownik), a aplikacje te uruchamiają procesy potomne jako HomeUser. Aplikacje, które uruchomisz w standardowy sposób (skróty, dwukrotne kliknięcie pliku wykonywalnego) będą własnością VpnUser.

Podczas definiowania połączeń sieciowych systemu Windows istnieje możliwość zezwolenia innym użytkownikom na korzystanie z tego połączenia. Załóżmy, że zdefiniowałeś:

  • HomeNetwork wyłącznie dla HomeUser
  • VpnNetwork wyłącznie dla VpnUser

i dla uproszczenia:

  • Na twoim komputerze nie ma innych połączeń sieciowych.

Obecnie mam pojedynczy komputer z systemem Windows, na którym nie mogę zepsuć zbyt wiele i nigdy nie sprawdziłem opisanego ustawienia, więc nie jestem pewien, czy poniższe oświadczenie jest prawdziwe.

Domyślam się, że może być ograniczony do klienta VPN wbudowanego w system Windows - każdy klient VPN innej firmy wymaga dalszych badań.

I przypuszczam , że wnioski:

  • Posiadany przez VpnUserpowinien używać tylko VpnNetwork.
  • Posiadany przez HomeUserpowinien używać tylko HomeNetwork.

Jeśli moje spekulacje są prawdziwe, to po zalogowaniu się do VpnUserkonta będą korzystać VpnNetworkaplikacje, gdy aplikacje będą uruchamiane HomeUserz VpnUserkonta HomeNetwork.

g2mk
źródło
Nie jestem pewny co masz na myśli. Czy sugerujesz, że powinienem użyć innego konta użytkownika Windows? W jaki sposób pomogłoby to powiązać określone aplikacje? Wygląda na to, że twoje rozwiązanie pozwoli tylko włączyć / wyłączyć VPN dla wszystkich aplikacji, ale już mogę to zrobić, łącząc się z VPN i rozłączając się z nim.
Victor Marchuk,
2
@VictorMarchuk Zredagowałem swoją odpowiedź - mam nadzieję, że teraz jest bardziej przejrzysta ...
g2mk
0

forcebindip.exe może być używany, ale musisz zakodować aplikację pomocniczą (żadna inna opcja).

  1. Aplikacja zapisuje parametry otrzymane z wiersza polecenia
  2. Nazwa aplikacji to XXXX.EXE
  3. Aplikacja ładuje plik XXX.ini, który zawiera np

    app_to_run = C:\path1\app_to_run.exe
    ForceBindIP = C:\path2\ForceBindIP.exe 
    IP          = 192.168.10.21
    
  4. Aplikacja działa

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

  5. Aplikacja kończy się

PROBLEM: ForcebindIP nie przekazuje parametrów do wywoływanego programu. następnie jeśli chcesz przekazać parametry do app_to_run.exe, potrzebujesz bardziej rozwiniętego podejścia, w którym XXX.exe tworzy plik wsadowy, w tym app_to_run.exe i parametry przekazane, ta partia jest następnie wywoływana zamiast app_to_run.exe w punkcie 4.

Możesz także rzucić okiem na niektóre aplikacje GUI zawierające ForcebindIP. Niektóre z nich mogą współpracować z więcej niż jedną aplikacją, ale nie robią tego, czego potrzebujesz.

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

Poklepać
źródło
Czy masz na myśli, że aplikacja pomocnicza przechwyciłaby próbę utworzenia procesu potomnego i zamiast tego uruchomiła go za pomocą ForceBindIP? Jeśli tak, czy masz jakieś sugestie, jak do tego podejść?
Victor Marchuk,
Masz rację. aplikacja pomocnika będzie miała nazwę każdego owiniętego pliku exe i zakończy wywoływanie odpowiedniego oryginalnego pliku exe za pomocą ForceBind. Oczywiście potrzebujesz tutaj zmiany nazwy lub gry katalogowej, aby uniknąć 2 exów o tej samej nazwie w tym samym katalogu. Ta aplikacja pomocnicza może być łatwo zakodowana, np. W C
Pat