【发布时间】:2018-01-30 17:07:29
【问题描述】:
我在另一个论坛上看到了下面的帕斯卡代码。这段代码怎么可能?
Windows 不允许用户创建带有冒号的文件名吗?
但是,此代码仅在您在驱动器的根目录中创建名称包含冒号的文件时才有效(例如:D:、C:、E: 等)。而且当文件被创建时,它是完全不可见的。
uses crt, sysutils;
var
f, f1: file of char;
c:char;
begin
clrscr;
assign(f, 'D:\src\payload.exe');
reset(f);
assign(f1, 'D:\:malware.exe');
rewrite(f1);
while not eof(f) do
begin
read(f, c);
write(f1, c);
end;
close(f1);
close(f);
executeprocess('D:\:malware.exe', ''); //here
readln;
erase(f1);
end.
上面的代码可以用free pascal编译
fpc [filename].pas
谢谢。
编辑:
更多详情:
您可以从 CreateProcess (WinAPI) 执行 D:\:malware.exe
您不能从命令行、路径等执行D:\:malware.exe
我使用进程资源管理器查找D:\:malware.exe path/contain 文件夹。但是,当我按下探索按钮时,它会将我带到 %UserProfile%
仅适用于D:\:malware.exe、D:\\malware.exe、D:\/malware.exe
【问题讨论】:
-
冒号保留在文件系统命名空间中,用于支持命名流的文件系统,例如 NTFS file streams。冒号 不是 基本文件名的一部分。它将基本名称与流名称分隔开来。您正在根目录上创建一个名为“malware.exe”的 $DATA 流。甚至目录也可以有 $DATA 流,但与常规文件不同,它们不能有默认的匿名 $DATA 流(例如,打开“file.ext”实际上是打开它的匿名“file.ext::$DATA”文件流)。
-
类似地,目录的文件列表存储在 $INDEX_ALLOCATION 流中,通常命名为 $I30。因此,如果您使用的文件系统和 API 都支持流名称,那么您可以将根目录内容引用为“D:\:$I30:$INDEX_ALLOCATION”。
-
设备名称(例如“C:”)位于 NT 对象命名空间中,而不是文件系统命名空间中,因此它们可以包含除路径分隔符、反斜杠之外的任何 Unicode 字符。正斜杠只是对象命名空间中的名称字符。可以通过
DefineDosDevice添加新设备名称,并使用“\\.\”或“\\?\”前缀访问。 “\\.\”前缀仍然需要对斜杠和点字符进行一些路径规范化,但“\\?\”会绕过所有规范化。 -
我现在明白了。非常感谢。对了,你能推荐一些书籍或关键词来了解这个吗?
-
阅读Alternate Data Streams in NTFS。要更深入地研究,请阅读:The Four Stages of NTFS File Growth、NTFS MetaFiles 和 NTFS File Attributes。除此之外,您还需要搜索有关 NTFS 取证分析的文章。那不是我的那杯茶。
标签: windows security pascal internal computer-forensics