Почему пакетный файл, выполненный из WinRAR SFX, не работает при доступе к файлу hosts?
Этот пакетный код работает непосредственно при запуске командного файла:
set %windir%\system32\drivers\etc\hosts
attrib -r %hosts%
pause
Но он не работает должным образом при упаковке этого пакетного файла в самораспаковывающийся архив WinRAR и его автоматическом запуске во время извлечения.
1 ответ
Вы создаете 32-битный RAR-самораспаковывающийся архив. Поэтому пакетный файл обрабатывается 32-битным cmd.exe
что приводит к доступу %SystemRoot%\SysWOW64
вместо %SystemRoot%\System32
в соответствии с документацией Microsoft по перенаправлению файловой системы. Вам также следует ознакомиться с подробностями реализации WOW64 и ключами реестра, на которые влияет WOW64.
Каталог %SystemRoot%\SysWOW64
не содержит drivers\etc\hosts
, hosts
файл существует на 64-битной Windows только в подкаталоге System32
для 64-битных приложений.
Sysnative
Перенаправитель, существующий только для 32-разрядных приложений, работающих в 64-разрядной среде Windows, может использоваться для определения среды, в которой выполняется пакетный файл для доступа к hosts
файл, который обычно изменяет только вредоносное ПО, но не устанавливает дружественное приложение с самораспаковывающимся архивом RAR.
@echo off
set "SystemPath=%SystemRoot%\System32"
if exist "%SystemRoot%\Sysnative\cmd.exe" set "SystemPath=%SystemRoot%\Sysnative"
set "HostsFile=%SystemPath%\drivers\etc\hosts"
%SystemPath%\attrib.exe -r %HostsFile%
pause
Обратите внимание, что %SystemRoot%\Sysnative
не является ни каталогом, ни ссылкой в файловой системе. Это редиректор для 32-битных приложений в 64-битной Windows. То есть с 64-разрядным Windows Explorer, который по умолчанию запускается в 64-разрядной Windows или любом другом 64-разрядном приложении. %SystemRoot%\Sysnative
не существует вообще. И 32-битные приложения могут только проверить, есть ли файл в %SystemRoot%\Sysnative
, но не могу проверить, если каталог %SystemRoot%\Sysnative
существует.