Как установить MOTW на исполняемый файл - PullRequest
5 голосов
/ 10 декабря 2010

Как установить MOTW (знак Интернета) на исполняемый файл, загружаемый из Интернета?

Ответы [ 2 ]

8 голосов
/ 12 декабря 2010

Эти данные хранятся в альтернативном файловом потоке NTFS вместе с исполняемым файлом.Поток называется Zone.Identifier :

Windows® Internet Explorer® использует имя потока Zone.Identifier для хранения зон безопасности URL.
Полная формаsample.txt:Zone.Identifier:$DATA
Поток представляет собой простой текстовый поток в форме:

   [ZoneTransfer]
   ZoneId=3

MSDN-SECZONES дает объяснение зон безопасности.

(NB. В оригинале есть пробел между двоеточием и "Зоной", но я думаю, что это ошибочно.)

Вы можете найти ZoneIds в UrlMon.h в SDK;есть перечисление, равное

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

(оригинал использует предыдущее значение + 1, а не абсолютные значения.)

Как говорит Ганс в комментариях, их можно записать с помощью стандартного Win32файловые API CreateFile и WriteFile .Firefox всегда записывает Интернет-зону, зона 3 - Код Firefox здесь (три-лицензия 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 Вы можете использовать это, чтобы абстрагироваться от всего этого для вас.

0 голосов
/ 10 декабря 2010

Это прямо не указано в RFC 3514, но сегодня, из-за повышенных требований безопасности, реализации должны действительно сохранять информацию о наличии или отсутствии бита RFC3514 при сетевой передаче, когда они записывают файлы на диск, инаоборот для чтения с диска.

...