Почему пакетный файл, выполненный из 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 существует.

Другие вопросы по тегам