如何在可执行文件上设置MOTW

时间:2010-12-10 19:46:39

标签: c++ ntfs

如何在从互联网上下载的可执行文件中设置MOTW(Web标记)?

2 个答案:

答案 0 :(得分:8)

此数据与可执行文件一起存储在NTFS alternative file stream中。该流称为Zone.Identifier

  

Windows®InternetExplorer®使用流名称Zone.Identifier存储URL安全区域   完全限定的表格是sample.txt:Zone.Identifier:$DATA
  流是一个简单的文本流:

   [ZoneTransfer]
   ZoneId=3
     

MSDN-SECZONES解释了安全区域。

(N.B。原件在冒号和“Zone”之间有空格,但我认为这是错误的。)

您可以在SDK中找到UrlMon.h中的ZoneIds;这是一个等同于

的枚举
enum URLZONE {
    URLZONE_LOCAL_MACHINE = 0,
    URLZONE_INTRANET      = 1,
    URLZONE_TRUSTED        = 2,
    URLZONE_INTERNET      = 3,
    URLZONE_RESTRICTED     = 4
};

(原文使用前一个值+ 1而不是绝对值。)

正如汉斯在评论中所说,这些可以使用标准的Win32文件API CreateFileWriteFile编写。 Firefox总是编写Internet区域,区域3 - Firefox code here(MPL / LGPL / GPL三重许可证):

bool SetInternetZoneIdentifier(const FilePath& full_path) {
  const DWORD kShare = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
  std::wstring path = full_path.value() + L":Zone.Identifier";
  HANDLE file = CreateFile(path.c_str(), GENERIC_WRITE, kShare, NULL,
                           OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  if (INVALID_HANDLE_VALUE == file)
    return false;

  const char kIdentifier[] = "[ZoneTransfer]\nZoneId=3";
  DWORD written = 0;
  BOOL result = WriteFile(file, kIdentifier, arraysize(kIdentifier), &written,
                          NULL);
  CloseHandle(file);

  if (!result || written != arraysize(kIdentifier)) {
    DCHECK(FALSE);
    return false;
  }

  return true;
}

或者,您可以使用IE COM API CLSID_PersistentZoneIdentifier为您提取所有内容。

答案 1 :(得分:0)

RFC 3514中没有明确说明,但是今天,由于安全性要求的提高,实现应该在将文件写入磁盘时保留网络传输中是否存在RFC3514位的信息,以及反之亦然,从磁盘读取。