【问题标题】:How can this code generate a file with a filename containing a colon on Windows?此代码如何在 Windows 上生成文件名包含冒号的文件?
【发布时间】: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.exeD:\\malware.exeD:\/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 GrowthNTFS MetaFilesNTFS File Attributes。除此之外,您还需要搜索有关 NTFS 取证分析的文章。那不是我的那杯茶。

标签: windows security pascal internal computer-forensics


【解决方案1】:

它之所以有效是因为它是可能的*。无论命名约定如何,您都可以为文件命名各种可怕的东西。

*是的,我知道MSDN 将冒号列为“保留”。这与禁止或不可能的情况不同。它只是与“不要这样做”相同。

【讨论】:

  • 这怎么可能呢?这是对 win32 API 的限制。不是“你能做到”那么简单,而是如何你能做到?例如,我只是尝试通过标准的 Windows 手段(资源管理器、命令提示符、Powershell)以及 Python 都无济于事。
  • 我已经用>malware.exe"malware.exe 等进行了测试。但是,只有:malware.exe 在这个例子中有效。我认为:malware.exe 是某种特殊的系统文件。特别是,它只适用于D:\:malware.exeC:\:malware.exe 等。D:\sample_folder\:malware.exe 会抛出错误。
  • 对不起,我的粗心,D:\\malware.exeD:\/malware.exe 也可以。
  • @Thebluefish 我刚刚在 Ruby(irb 交互式环境)中尝试过,在尝试创建和写入名为 :bar.txt 的文件时没有收到错误消息。我怀疑有些 API 没有正确检查。
  • @Thebluefish 我刚刚在命令提示符下在 Windows 10 上尝试了 Python 3.6 4。它让我可以打开、写入和关闭一个名为“:bar.txt”的文件。
猜你喜欢
  • 2016-03-09
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2011-11-18
  • 2017-05-31
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多