gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:17:21 26 4
gpt4 key购买 nike

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

最佳答案

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

Windows® Internet Explorer® uses the stream name Zone.Identifier for storage of URL security zones.
The fully qualified form is sample.txt:Zone.Identifier:$DATA
The stream is a simple text stream of the form:

   [ZoneTransfer]
ZoneId=3

MSDN-SECZONES gives an explanation of security zones.

(注意,原文在冒号和“区域”之间有一个空格,但我认为这是错误的。)

ZoneIds可以在SDK的UrlMon.h中找到;有一个枚举等同于

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

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

正如 Hans 在评论中所说,这些可以用标准的 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你可以用它来为你抽象这一切。

关于c++ - 如何在可执行文件上设置 MOTW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4412669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com