ForceBindIPを試しましたが、重大な欠点があります。バインドしようとしているアプリケーションの子には影響せず、アプリケーション自体にのみ影響します。また、アプリケーションが常に指定されたインターフェイスを介して実行されるように強制することはできません。毎回forcebindip.exe
を介して実行する必要があります。これは、League of Legendsなどのプロセスツリーが次のように見えるアプリケーションで問題になります。
ランチャーはパッチャーを実行し、パッチャーはクライアントを実行します。ツリー内のこれらすべてのプロセスの親にのみ影響を与えることができるため、実際のゲームは必要なインターフェイスにバインドされないため、このベンチャー全体は無意味になります。
Windows 7のForceBindIPに代わる最新の代替品はありますかこのサイトにはこれに似た質問がたくさんありますが、それらはほとんど古いものです。たぶんこの問題を解決するより良い方法があるでしょうか?
私の現在の考えは次のことをすることです:
目的のインターフェースにバインドされたローカル3proxyサーバーをセットアップします。
そのローカルプロキシを介して実行するように構成されたProxifierまたは同様のソフトウェアを介してゲームを実行します。
それがうまくいくかどうかはわかりませんが、うまくいくとしても、次善の解決策のようです。いいアイデアはありますか?
編集:私のアイデアはうまくいきませんでした:(
編集2:基本的に、私が達成しようとしているのは、VPNの実行中に、いくつかのアプリケーションを通常のインターフェイスにバインドすることです。その理由は、ほとんどの場合VPNを介して接続する必要があるが、一部のアプリケーション(ゲームなど)は、pingが高いなどの問題が原因で、このように正しく機能しないためです。
ForceBindIpが実際に呼び出された実行可能ファイルにパラメーターを渡していることがわかりました。 最初のパラメータを省略 です。そのため、カスタムインジェクターの代わりにForceBindIp.exe
を使用するようにスクリプトを変更しました。これで、injectory
例外に関するすべての問題がなくなり、すべてが機能するようになりました。
変更された手順とBindIp.cmd
スクリプトは次のとおりです。
通常どおりForceBindIpをインストールする
ドライブの任意の場所に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!CreateProcessは、DEBUG_PROCESSまたはDEBUG_ONLY_THIS_PROCESS作成フラグなしで呼び出されると、レジストリをチェックして、起動している実行可能ファイルにIFEOが設定されているかどうかを確認します。はいの場合は、デバッガパスを実行可能ファイル名の前に追加するだけで、実行可能ファイルをデバッガの下で効果的に起動できます。
この場合の「デバッガ」は、FORCEDIP
変数を設定して injectory dll-injectorを起動するバッチスクリプトになります。 Injectory次に、プロセスを開始し、コマンドライン引数を渡して、BindIp.dll
を挿入します。
どこかにフォルダー(C:\BindIp
など)を作成し、その中に3つのファイルを配置します。
BindIp.dll
BindIp.cmd
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
LolClient.exe
にターゲット実行可能ファイルのレジストリキー(例:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
)を作成しますこのキーに文字列値を追加します。
Debugger
C:\BindIp\BindIp.cmd
このキーに対するUsers
フルアクセス権を付与します(スクリプトは、起動するたびに変更する必要があります)。次のようになります。
BindIp.cmd
に必要なIPアドレスを設定します
バインドするすべての実行可能ファイル(rad_user_kernel.exe
、LolLauncher.exe
、LolPatcher.exe
など)について、手順3と4を繰り返します。
これで、対応するレジストリエントリを持つ実行可能ファイルを起動するたびに、代わりにBindIp.cmd
スクリプトが起動し、このプログラムを目的のIPアドレスにバインドします。
私はこれをWindows 8.1 x64を実行しているラップトップでテストし、さまざまなプログラムを正常にバインドすることができました( AIMP 2 、 BersIRC 、 Opera 12.4 )この手法を使用してイーサネットまたはWiFiアダプターに接続します。残念ながらBindIp.dll
は32ビットなので、64ビットプロセスでは機能しません。
HideMyAss! VPNクライアントには、アプリケーションをVPNインターフェイスにバインドできる Secure IP Bind 機能があることがわかりました。
セキュアIPバインドを使用すると、コンピューター上の選択したアプリケーションを、VPNサーバーに接続したときにのみ機能させることができます。これにより、選択したアプリケーションが安全な暗号化接続の背後でのみ機能することが保証されます。 VPNに接続せずに選択したアプリケーションを開くと、それらのアプリケーションはインターネットにアクセスできなくなります。
私はそれを見てきましたが、それはカスタム レイヤードサービスプロバイダー(LSP) dllおよびそれを制御するCOMインターフェイスに基づいています。また、HideMyAssのVPNクライアントをインストールしなくても(ab)使用できます。
bin
フォルダーに移動しますこれら3つのファイルをディスク上のフォルダーにコピーします(_C:\HMA_Bind
_)
_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
_
Install.cmd
_ 管理者としてを実行します。インストールが成功したことを確認するには、 Autoruns を使用できます。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()
_
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ビットアプリケーション。
次の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
を使用する必要があります。
この問題に対する2つの解決策が考えられます。
1つのネットワークアダプターのみを使用するゲームを実行するための仮想マシンを作成します。
ゲームが使用するIPアドレスの範囲がわかっている場合は、この範囲を特定のアダプターのゲートウェイに向けるネットワークルートを作成します。
あなたの好みがわかったら、さらに情報を追加できます。たとえば、ポイント1で優先仮想マシン製品。
forcebindip.exeを使用できますが、ヘルパーアプリケーションをコーディングする必要があります(他のオプションはありません)。
アプリケーションは、以下を含むXXX.iniをロードします。
app_to_run = C:\path1\app_to_run.exe
ForceBindIP = C:\path2\ForceBindIP.exe
IP = 192.168.10.21
アプリケーションが実行されます
C:\ path1\app_to_run.exe 192.168.10.21 C:\ path1\app_to_run.exe Saved_Command_line
アプリケーションは終了します
問題: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/