将应用程序绑定到特定的网络接口


17

我已经尝试过ForceBindIP,但是它有很大的缺点-它不会影响我要绑定的应用程序的子级,而只会影响应用程序本身。它也不能强制应用程序始终通过指定的接口运行,而必须forcebindip.exe每次都运行。像《英雄联盟》这样的应用程序出现了问题,其中的过程树如下所示:

屏幕截图

启动程序运行修补程序,修补程序运行客户端,等等。我只能影响树中所有这些进程的父级,因此实际的游戏未绑定到我想要的接口,这使整个工作毫无意义。

Windows 7是否可以替代ForceBindIP?在这个站点上有很多与此问题类似的问题,但是它们大多是古老的。也许现在有更好的方法来解决此问题?

我当前的想法是执行以下操作:

  1. 设置绑定到所需接口的本地3proxy服务器。

  2. 通过Proxifier或配置为通过该本地代理运行的类似软件运行游戏。

我不确定这是否行得通,但即使可行,这似乎也不是最优的解决方案。你们有更好的主意吗?

编辑:我的想法不起作用:(

编辑2:基本上,我要实现的是在VPN运行时将一些应用程序绑定到常规接口。原因是我大部分时间都需要通过VPN连接,但是由于更高的ping和其他问题,某些应用程序(例如游戏)无法以这种方式正常工作。


您需要绑定到树中的每个进程还是仅绑定到IP LolClient.exe?是 LolClient.exe一个x86x64EXE?我正在与第三方dll注入器一起玩,也许我可以为您提供帮助,但我需要更多信息。
beatcracker 2015年

您是否要将该过程绑定到VPN接口或常规接口?
MariusMatutiae

您是否要实现某些特定目标?默认情况下,游戏不需要任何传入连接即可正常运行。您是在尝试作弊还是录制/播放游戏?
马里奥

我一直在寻找这个基本问题的答案,但对于OSX主机。我的用例是同时启用LAN和WiFi。局域网位于我的WAP上受限制的公司网络和wi-fi上。有时我需要使用浏览器或应用程序才能使用wi-fi,以便可以对被防火墙阻止的d / l文件进行加密。
SaxDaddy 2015年

1
@VictorMarchuk是的,它BindIp.dll是32位的,因此它不适用于64位进程。
Beatcracker 2015年

Answers:


10

更新资料

我发现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,发现ForceBindIp.exe使用名称FORCEDIP保存IP地址和BindIp.dll并在目标进程中注入并执行该变量时从该变量读取IP地址。

要检测目标应用程序的启动,我们可以Debugger在注册表的“映像文件执行选项”中为此可执行文件添加一个键:

在没有DEBUG_PROCESS或DEBUG_ONLY_THIS_PROCESS创建标志的情况下调用Kernel32!Cre​​ateProcess时,将检查注册表以查看是否在启动的可执行文件上设置了IFEO。如果是,那么它将调试器路径简单地添加到可执行文件名称中,从而有效地使可执行文件在调试器下启动。

在我们的例子中,“调试器”将是一个批处理脚本,它将设置FORCEDIP变量并启动注入器 dll-injector。然后,Injectory将启动进程,传递命令行参数并注入BindIp.dll

实践

  1. 在某个位置创建文件夹(C:\BindIp例如),并将这三个文件放入其中:

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注册表项

  4. 在中设置所需的IP地址 BindIp.cmd

  5. 你希望绑定(每个可执行重复步骤3和4 rad_user_kernel.exeLolLauncher.exeLolPatcher.exe,等)。

现在,每次启动具有相应注册表项的可执行文件时, BindIp.cmd脚本都会启动,并将此程序绑定到所需的IP地址。

结论

我已经在运行Windows 8.1 x64的笔记本电脑上对此进行了测试,并能够使用该技术成功地将各种程序(AIMP 2BersIRCOpera 12.4)绑定到以太网或WiFi适配器。不幸的BindIp.dll是32位,所以它不适用于64位进程。


非常感谢您的详细解释!不幸的是,我从注入器中得到了某种例外:github.com/blole/injectory/issues/4
Victor Marchuk

@VictorMarchuk我做了更多测试,确实,injectory有时候--args选项有问题。不知道为什么。
Beatcracker 2015年

即使没有--args任何应用程序,我也无法运行它
Victor Marchuk 2015年

@VictorMarchuk你有例子吗?我刚刚用Opera 12.14和命令行对其进行了测试-效果很好。
Beatcracker 2015年

@VictorMarchuk似乎ForceBindIp实际上可以传递参数,请参阅我更新的答案。
Beatcracker

4

我发现了HideMyAss!VPN客户端具有安全IP绑定功能,该功能允许将应用程序绑定到VPN接口:

通过安全IP绑定,您可以强制计算机上选定的应用程序仅在连接到我们的VPN服务器后才能运行。这样可以确保选定的应用程序只能在安全的加密连接后运行。如果您在未连接到我们的VPN的情况下打开选定的应用程序,则它们将无法访问互联网。

我已经看过它了,它基于自定义的分层服务提供程序(LSP) dll和COM接口来控制它。无需安装HideMyAss的VPN客户端即可使用它。

安装HideMyAss的安全IP绑定

  1. 获取最新的Windows安装程序:https : //www.hidemyass.com/downloads
  2. 用7-zip解压缩。忽略有关同名文件的警告,您可以放心地覆盖它们。
  3. 转到 bin解压安装程序中文件夹
  4. 将这三个文件复制到磁盘上的文件夹(C:\HMA_Bind

    • ForceInterfaceCOM.dll
    • ForceInterfaceLSP.dll
    • 安装LSP.exe
  5. Install.cmdUninstall.cmd此文件夹

安装.cmd

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

卸载.cmd

%~dp0InstallLSP.exe -f
regsvr32 /u /s %~dp0ForceInterfaceCOM.dll
  1. Install.cmd 以管理员身份运行。要验证安装是否成功,可以使用Autoruns

AUtoruns中的Winsock提供程序

  1. 若要控制安全IP绑定,您必须调用COM接口方法。这可以在PowerShell中完成。如果您使用的是x64操作系统,请确保启动Windows PowerShell ISE (x86)Windows PowerShell (x86),因为COM组件是32位的。

首先,您必须创建新的安全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 以管理员身份运行,确认自动运行成功卸载。

例子:

请注意,每个PowerShell会话只需创建一次安全IP绑定COM对象。下面的示例假定您在新的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,因此存在以下限制:

自Windows Server 2012起不建议使用LSP。包含LSP的系统将无法通过Windows徽标检查。使用网络的Windows 8样式的“地铁”应用程序将自动绕过所有LSP。

我已经在各种结果混合的应用程序中测试了该方法:32位应用程序可以运行,但64位不能运行,即我能够绑定64位资源管理器(可能是因为默认情况下它的制表位进程是32位),但是而不是64位Waterfox浏览器或其他64位应用程序。


3

我可以想到两种解决方案:

  1. 创建一个用于运行游戏的虚拟机,该虚拟机仅使用一个网络适配器。

  2. 如果您知道游戏使用的IP地址范围,请构造一条网络路由,将这个范围引向特定适配器的网关。

了解您的偏好后,我可以添加更多信息。例如,在第1点中,您首选的虚拟机产品。


1
使用VM会带来许多其他问题,例如性能降低和不断使用几GB RAM。这是我的最后选择,我真的很想以其他方式实现它。我不知道需要绑定的IP的确切范围,因为我需要用于各种应用程序,包括p2p共享软件(torrent)。也许有防火墙可以让您根据每个应用程序建立的连接来创建路由?
维克多·马尔库克

性能:如果不使用旧的Virtual PC,则VM不会降低性能。内存:VMware和VirtualBox不会立即分配所有内存,因此仅分配VM真正需要的内存。它们还具有游戏能够在以后暂停和恢复VM /游戏的其他优点,这比大多数游戏的保存能力要好得多。对于IP范围:如果您有许多范围,则以上内容不切实际,也不适用于代理。
harrymc

1
@harrymc我怀疑使用模拟GPU能否从VM获得令人满意的3D性能。要直接访问图形卡,设置起来很麻烦,并且需要具有VT-D(Intel)或AMD-Vi功能的CPU(而且价格不菲)。
Beatcracker 2015年

此类CPU比您想象的要普遍得多:支持IOMMU的硬件列表,但直通视频可能需要两个GPU。但是,除非性能要求很高,否则当今的VM可以提供良好的视频性能。对于无法接受我的高级GPU而又不会遇到明显延迟的动作游戏,使用VM是我的解决方案。大多数VM产品都允许对仿真卡进行某些控制,例如视频存储量,
harrymc 2015年

2
答案是肯定的,有些人已经做到了。这里是一个参考:使用GPU passthrough设置Windows VM,但可以找到更多信息。
harrymc

3

假设您有两个Windows用户帐户:

  • HomeUser
  • VpnUser

当您登录VpnUser帐户时,您可以运行应用程序(尤其是您提到的游戏)为HomeUser(在可执行文件上按Shift + RMB->以其他用户身份运行),并且该应用程序以方式运行其子进程HomeUser。您将以标准方式运行的应用程序(快捷方式,双击可执行文件)将归拥有VpnUser

在定义Windows网络连接时,您可以选择允许其他用户使用此连接。假设您定义了:

  • HomeNetwork 专为 HomeUser
  • VpnNetwork 专为 VpnUser

为了简化:

  • 您的计算机上没有其他网络连接。

我目前只有一台Windows计算机,无法在其中混乱很多,也从未检查过描述的设置,因此不确定波纹管语句是否正确。

我的猜测可能仅限于Windows内置VPN客户端-任何第三方VPN客户端都需要进一步调查。

该应用程序:

  • 拥有者VpnUser只能使用VpnNetwork
  • 拥有者HomeUser只能使用HomeNetwork

如果我的猜测是真的,那么当您登录到VpnUser帐户时,应用程序将使用VpnNetworkHomeUserVpnUser帐户运行时,应用程序将使用HomeNetwork


我不确定你是什么意思。您是否建议我使用其他Windows用户帐户?这将如何帮助绑定特定的应用程序?看来您的解决方案仅允许为所有应用程序启用/禁用VPN,但是我已经可以通过连接到VPN并从中断开连接来做到这一点。
维克多·马尔库克

2
@VictorMarchuk我已经编辑了答案-我希望现在更加清楚...
g2mk 2015年

0

可以使用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/


您是说帮助程序会拦截创建子进程的尝试,而是通过ForceBindIP运行它吗?如果是这样,您对如何解决这个问题有什么建议吗?
维克多·马尔库克

你是对的。帮助程序将使用每个包装的exe的名称,并通过ForceBind结束调用相应的原始exe。当然,这里您需要一些重命名或目录游戏,以避免在同一目录下有两个具有相同名称的exe。此助手应用程序可以在C容易地编码即
专利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.