web-dev-qa-db-ja.com

アプリケーションを特定のネットワークインターフェイスにバインドする

ForceBindIPを試しましたが、重大な欠点があります。バインドしようとしているアプリケーションの子には影響せず、アプリケーション自体にのみ影響します。また、アプリケーションが常に指定されたインターフェイスを介して実行されるように強制することはできません。毎回forcebindip.exeを介して実行する必要があります。これは、League of Legendsなどのプロセスツリーが次のように見えるアプリケーションで問題になります。

screenshot

ランチャーはパッチャーを実行し、パッチャーはクライアントを実行します。ツリー内のこれらすべてのプロセスの親にのみ影響を与えることができるため、実際のゲームは必要なインターフェイスにバインドされないため、このベンチャー全体は無意味になります。

Windows 7のForceBindIPに代わる最新の代替品はありますかこのサイトにはこれに似た質問がたくさんありますが、それらはほとんど古いものです。たぶんこの問題を解決するより良い方法があるでしょうか?

私の現在の考えは次のことをすることです:

  1. 目的のインターフェースにバインドされたローカル3proxyサーバーをセットアップします。

  2. そのローカルプロキシを介して実行するように構成されたProxifierまたは同様のソフトウェアを介してゲームを実行します。

それがうまくいくかどうかはわかりませんが、うまくいくとしても、次善の解決策のようです。いいアイデアはありますか?

編集:私のアイデアはうまくいきませんでした:(

編集2:基本的に、私が達成しようとしているのは、VPNの実行中に、いくつかのアプリケーションを通常のインターフェイスにバインドすることです。その理由は、ほとんどの場合VPNを介して接続する必要があるが、一部のアプリケーション(ゲームなど)は、pingが高いなどの問題が原因で、このように正しく機能しないためです。

17
Victor Marchuk

更新

ForceBindIpが実際に呼び出された実行可能ファイルにパラメーターを渡していることがわかりました。 最初のパラメータを省略 です。そのため、カスタムインジェクターの代わりにForceBindIp.exeを使用するようにスクリプトを変更しました。これで、injectory例外に関するすべての問題がなくなり、すべてが機能するようになりました。

変更された手順とBindIp.cmdスクリプトは次のとおりです。

  1. 通常どおりForceBindIpをインストールする

  2. ドライブの任意の場所にBindIp.cmdを配置します(例:C:\BindIp\BindIp.cmd

BindIp.cmdスクリプト:

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

次に、下から手順2〜6を実行します。


前書き

ForceBindIp 子プロセスにBindIp.dllを自動的に注入できず、 呼び出された実行可能ファイルにパラメーターを渡さない。しかし、私は レジストリの画像ファイル実行オプション 、バッチスクリプト、および サードパーティdllインジェクター を使用することでこれを回避することができました。詳細は以下の通りです。

理論

BindIp.dllなしでForceBindIp.exeを使用するには、通信方法を見つける必要があります(ForceBindIp.exeはIPアドレスをdllに渡す必要があります)。

私は IDA free を使用しており、ForceBindIp.exeがIPアドレスを保持するFORCEDIPという名前の環境変数を作成し、BindIp.dllがこの変数からIPアドレスを読み取ることがわかりましたターゲットプロセスで挿入および実行されたとき。

ターゲットアプリケーションの起動を検出するために、この実行可能ファイルのレジストリのImage File Execution OptionsにDebuggerキーを追加できます。

Kernel32!Cre​​ateProcessは、DEBUG_PROCESSまたはDEBUG_ONLY_THIS_PROCESS作成フラグなしで呼び出されると、レジストリをチェックして、起動している実行可能ファイルにIFEOが設定されているかどうかを確認します。はいの場合は、デバッガパスを実行可能ファイル名の前に追加するだけで、実行可能ファイルをデバッガの下で効果的に起動できます。

この場合の「デバッガ」は、FORCEDIP変数を設定して injectory dll-injectorを起動するバッチスクリプトになります。 Injectory次に、プロセスを開始し、コマンドライン引数を渡して、BindIp.dllを挿入します。

練習

  1. どこかにフォルダー(C:\BindIpなど)を作成し、その中に3つのファイルを配置します。

BindIp.cmdスクリプト:

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. LolClient.exeにターゲット実行可能ファイルのレジストリキー(例:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\)を作成します
  2. このキーに文字列値を追加します。

    • 名前:Debugger
    • 値:C:\BindIp\BindIp.cmd
  3. このキーに対するUsersフルアクセス権を付与します(スクリプトは、起動するたびに変更する必要があります)。次のようになります。 IFEO registry key

  4. BindIp.cmdに必要なIPアドレスを設定します

  5. バインドするすべての実行可能ファイル(rad_user_kernel.exeLolLauncher.exeLolPatcher.exeなど)について、手順3と4を繰り返します。

これで、対応するレジストリエントリを持つ実行可能ファイルを起動するたびに、代わりにBindIp.cmdスクリプトが起動し、このプログラムを目的のIPアドレスにバインドします。

結論

私はこれをWindows 8.1 x64を実行しているラップトップでテストし、さまざまなプログラムを正常にバインドすることができました( AIMP 2BersIRCOpera 12.4 )この手法を使用してイーサネットまたはWiFiアダプターに接続します。残念ながらBindIp.dllは32ビットなので、64ビットプロセスでは機能しません。

10
beatcracker

HideMyAss! VPNクライアントには、アプリケーションをVPNインターフェイスにバインドできる Secure IP Bind 機能があることがわかりました。

セキュアIPバインドを使用すると、コンピューター上の選択したアプリケーションを、VPNサーバーに接続したときにのみ機能させることができます。これにより、選択したアプリケーションが安全な暗号化接続の背後でのみ機能することが保証されます。 VPNに接続せずに選択したアプリケーションを開くと、それらのアプリケーションはインターネットにアクセスできなくなります。

私はそれを見てきましたが、それはカスタム レイヤードサービスプロバイダー(LSP) dllおよびそれを制御するCOMインターフェイスに基づいています。また、HideMyAssのVPNクライアントをインストールしなくても(ab)使用できます。

HideMyAssのセキュアIPバインドのインストール

  1. 最新のWindowsインストーラーを入手: https://www.hidemyass.com/downloads
  2. 7-Zipで開梱します。同じ名前のファイルに関する警告を無視し、それらを安全に上書きできます。
  3. 解凍したインストーラーのbinフォルダーに移動します
  4. これら3つのファイルをディスク上のフォルダーにコピーします(_C:\HMA_Bind_)

    • ForceInterfaceCOM.dll
    • ForceInterfaceLSP.dll
    • InstallLSP.exe
  5. _Install.cmd_と_Uninstall.cmd_をこのフォルダに入れます

Install.cmd

_%~dp0InstallLSP.exe -i -a -n "HMA_LSP" -d %~dp0ForceInterfaceLSP.dll
regsvr32 /s %~dp0ForceInterfaceCOM.dll
_

ninstall.cmd

_%~dp0InstallLSP.exe -f
regsvr32 /u /s %~dp0ForceInterfaceCOM.dll
_
  1. _Install.cmd_ 管理者としてを実行します。インストールが成功したことを確認するには、 Autoruns を使用できます。

Winsock Providers in AUtoruns

  1. セキュアIPバインドを制御するには、COMインターフェースメソッドを呼び出す必要があります。これはPowerShellで実行できます。 x64 OSを使用している場合は、COMコンポーネントが32ビットであるため、必ずWindows PowerShell ISE (x86)またはWindows PowerShell (x86)を起動してください。

まず、新しいセキュアIPバインドオブジェクトを作成する必要があります。

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

そして、そのメソッドを呼び出すことができます:

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

HideMyAssのセキュアIPバインドのアンインストール

  1. _Uninstall.cmd_ 管理者としてを実行し、アンインストールがAutorunsで成功することを確認します。

例:

安全なIPバインドCOMオブジェクトをPowerShellセッションごとに1回だけ作成する必要があることに注意してください。以下の例では、新しいPowerShellセッションで実行することを想定しているため、常に新しいCOMオブジェクトが作成されます。

  • バインドするIPを設定し、バインドされたアプリケーションにfirefoxを追加して、バインドを有効にします。

    _# 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)
    _
  • IPバインディングをグローバルに有効にします。

    _# Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Enable binding
    $HmaFbi.SetEnabled($true)
    _
  • IPバインディングをグローバルに無効にします。

    _# Create new Secure IP Bind COM object
    $HmaFbi = New-Object -ComObject ForceInterfaceCOM.ForceInterface -ErrorAction Stop
    
    # Disable binding
    $HmaFbi.SetEnabled($false)
    _
  • リストからアプリケーションを削除(このアプリケーションのバインドを停止):

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

ノート

セキュアIPバインドはカスタム レイヤードサービスプロバイダー(LSP) dllとして実装されているため、これらの制限が適用されます。

LSPは、Windows Server 2012以降廃止されました。LSPを含むシステムは、Windowsロゴチェックに合格しません。ネットワークを使用するWindows 8スタイルの「メトロ」アプリは、すべてのLSPを自動的にバイパスします。

私はさまざまなアプリケーションでこの方法をテストしましたが、結果はさまざまです。32ビットアプリケーションは機能しますが、64ビットは機能しません。 64ビットではない Waterfox ブラウザまたはその他の64ビットアプリケーション。

4
beatcracker

次の2つのWindowsユーザーアカウントがあるとします。

  • HomeUser
  • VpnUser

VpnUserアカウントにログインすると、アプリケーション(特に、あなたが言及したゲーム)をHomeUser(Shift + RMB on executable file-> Run as other user)として実行でき、このアプリケーションは子プロセスをHomeUserとして実行します標準の方法で実行するアプリケーション(ショートカット、実行可能ファイルをダブルクリック)は、VpnUserが所有します。

Windowsネットワーク接続を定義する場合、他のユーザーがこの接続を使用できるようにするオプションがあります。あなたが定義したとしましょう:

  • HomeNetwork専用のHomeUser
  • VpnNetwork専用のVpnUser

簡単にするために:

  • コンピューターに他のネットワーク接続がありません。

現在、Windowsマシンを1台使用しているため、めちゃくちゃにすることができず、説明されている設定を確認したことがないので、次のステートメントが真であるかどうかわかりません。

私の推測では、Windowsに組み込まれているVPNクライアントに限定されている可能性があります。サードパーティのVPNクライアントは、さらに調査が必要です。

推測そのアプリケーション:

  • VpnUserが所有するのは、VpnNetworkのみを使用する必要があります。
  • HomeUserが所有するのは、HomeNetworkのみを使用する必要があります。

My speculationがtrueの場合、VpnUserアカウントにログインすると、アプリケーションはVpnNetworkを使用します。HomeUserアカウントからVpnUserとして実行するアプリケーションは、HomeNetworkを使用する必要があります。

3
g2mk

この問題に対する2つの解決策が考えられます。

  1. 1つのネットワークアダプターのみを使用するゲームを実行するための仮想マシンを作成します。

  2. ゲームが使用するIPアドレスの範囲がわかっている場合は、この範囲を特定のアダプターのゲートウェイに向けるネットワークルートを作成します。

あなたの好みがわかったら、さらに情報を追加できます。たとえば、ポイント1で優先仮想マシン製品。

3
harrymc

forcebindip.exeを使用できますが、ヘルパーアプリケーションをコーディングする必要があります(他のオプションはありません)。

  1. アプリケーションは、コマンドラインから受け取ったパラメータを保存します
  2. アプリケーションはその名前、つまりXXXX.EXEを取得します
  3. アプリケーションは、以下を含むXXX.iniをロードします。

    app_to_run = C:\path1\app_to_run.exe
    ForceBindIP = C:\path2\ForceBindIP.exe 
    IP          = 192.168.10.21
    
  4. アプリケーションが実行されます

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

  5. アプリケーションは終了します

問題:ForcebindIPが呼び出されたプログラムにパラメーターを渡さない。次に、app_to_run.exeにパラメータを渡す必要がある場合、XXX.exeがapp_to_run.exeと渡されたパラメータを含むバッチファイルを作成する、より進化したアプローチが必要です。このバッチは、ポイント4でapp_to_run.exeの代わりに呼び出されます。

ForcebindIPをラップするいくつかのGUIアプリを確認することもできます。それらのいくつかは複数のアプリで動作することができますが、あなたが必要とすることをしません。

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

0
Pat