如何在从互联网上下载的可执行文件中设置MOTW(Web标记)?
答案 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 CreateFile和WriteFile编写。 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位的信息,以及反之亦然,从磁盘读取。