Обновить
Я обнаружил, что 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
создает переменную среды с именем FORCEDIP
которая содержит IP-адрес, а BindIp.dll
считывает IP-адрес из этой переменной, когда она вводится и выполняется в целевом процессе.
Чтобы обнаружить запуск целевого приложения, мы можем добавить ключ Debugger
в опциях исполнения файла образа в реестре для этого исполняемого файла:
Kernel32!CreateProcess, когда вызывается без флагов создания DEBUG_PROCESS или DEBUG_ONLY_THIS_PROCESS, проверяет реестр, чтобы узнать, был ли установлен IFEO в исполняемом файле, который он запускает. Если да, то он просто добавляет путь отладчика к имени исполняемого файла, эффективно выполняя запуск исполняемого файла под отладчиком.
"Debugger" в нашем случае будет пакетный скрипт, который установит переменную FORCEDIP
и запустить injectory DLL-инжектор. Затем 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) к адаптеру Ethernet или WiFi, используя эту технику. К сожалению, BindIp.dll
является 32-разрядным, поэтому он не будет работать с 64-разрядными процессами.