更新资料
我发现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,发现ForceBindIp.exe
使用名称FORCEDIP
保存IP地址和BindIp.dll
并在目标进程中注入并执行该变量时从该变量读取IP地址。
要检测目标应用程序的启动,我们可以Debugger
在注册表的“映像文件执行选项”中为此可执行文件添加一个键:
在没有DEBUG_PROCESS或DEBUG_ONLY_THIS_PROCESS创建标志的情况下调用Kernel32!CreateProcess时,将检查注册表以查看是否在启动的可执行文件上设置了IFEO。如果是,那么它将调试器路径简单地添加到可执行文件名称中,从而有效地使可执行文件在调试器下启动。
在我们的例子中,“调试器”将是一个批处理脚本,它将设置FORCEDIP
变量并启动注入器 dll-injector。然后,Injectory将启动进程,传递命令行参数并注入BindIp.dll
。
实践
在某个位置创建文件夹(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
LolClient.exe
在以下位置为目标可执行文件创建注册表项(例如)HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\
将字符串值添加到此键:
- 名称:
Debugger
- 值:
C:\BindIp\BindIp.cmd
授予Users
对此密钥的完全权限(脚本必须在每次启动时对其进行修改)。它看起来应该像这样:
在中设置所需的IP地址 BindIp.cmd
你希望绑定(每个可执行重复步骤3和4 rad_user_kernel.exe
,LolLauncher.exe
,LolPatcher.exe
,等)。
现在,每次启动具有相应注册表项的可执行文件时, BindIp.cmd
脚本都会启动,并将此程序绑定到所需的IP地址。
结论
我已经在运行Windows 8.1 x64的笔记本电脑上对此进行了测试,并能够使用该技术成功地将各种程序(AIMP 2,BersIRC,Opera 12.4)绑定到以太网或WiFi适配器。不幸的BindIp.dll
是32位,所以它不适用于64位进程。
LolClient.exe
?是LolClient.exe
一个x86
或x64
EXE?我正在与第三方dll注入器一起玩,也许我可以为您提供帮助,但我需要更多信息。