如何在 Windows 7 的备用数据流中执行批处理文件?

Joe*_*sen 5 windows-7 ntfs batch alternate-data-stream

通常,在创建可执行文件作为备用数据流之后,例如:

type exec_this.bat > C:\blank.txt:exe.bat
Run Code Online (Sandbox Code Playgroud)

可以简单地说

start C:\blank.txt:exe.bat
Run Code Online (Sandbox Code Playgroud)

运行可执行文件。在 Windows 7 中,我似乎得到的只是“访问被拒绝”。或“系统找不到文件 $WHATEVER_THE_FILE_IS。”

如何执行此批处理文件?

Joe*_*sen 5

Windows 7 静默删除了从 ADS执行任何内容的能力。但是,从 DOS 命令行,还有其他选项。对于批处理文件,您可以逐行执行:

for /f "usebackq delims=?" %i in (blank.txt:exe.bat) do %i
Run Code Online (Sandbox Code Playgroud)

(请记住,这实际上并没有将批处理文件执行到自己的进程中,它只是从文件中读取并执行每一行。?键入的符号为alt 代码编号 2541。您希望分隔符是您不会的字符永远不会在代码中使用。)


小智 1

接受的答案仅运行批处理文件的一行。这将中断批处理文件中的任何高级逻辑。但是,如果您使用临时文件,您可以简单地完成此操作:

\n
cat < blank.txt:exe.bat > temp.bat & temp.bat\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以通过类似的命令在备用数据流中执行 PowerShell 脚本:(尽管我确信也有纯 PowerShell 方式。)

\n
cat < blank.txt:exe.ps1 > temp.ps1 & powershell .\\temp.ps1\n
Run Code Online (Sandbox Code Playgroud)\n

例子

\n

在备用数据流中创建批次:notepad blank.txt:exe.bat

\n
if 6==7 then goto pie \necho apple \ngoto end \n:pie \necho pie \n:end \n
Run Code Online (Sandbox Code Playgroud)\n

破碎的:

\n
E:\\broken>for /f "usebackq delims=\xcf\x86" %i in (blank.txt:exe.bat) do %i\n\nE:\\broken>if 6==7 then goto pie\n\'if\' is not recognized as an internal or external command,\noperable program or batch file.\n\nE:\\broken>echo apple\napple\n\nE:\\broken>goto end\n\nE:\\broken>\nThe filename, directory name, or volume label syntax is incorrect.\n\nE:\\broken>echo pie\npie\n\nE:\\broken>\nThe filename, directory name, or volume label syntax is incorrect.\n
Run Code Online (Sandbox Code Playgroud)\n

更好的:

\n
E:\\better>cat < blank.txt:exe.bat > temp.bat & temp.bat\n\nE:\\better>if 6 == 7 then goto pie\n\nE:\\better>echo apple\napple\n\nE:\\better>goto end\n
Run Code Online (Sandbox Code Playgroud)\n