Как Windows хранит информацию о том, что файл загружен из интернета

Многие, наверное, замечали, что если скачивать файлы из интернета при помощи Internet Explorer, то потом такие программы, как Microsoft Word или Excel будут выдавать предупреждение о том, что файл скачан из интернета и является небезопасным. Аналогичное, предупреждение будет получено при попытке установки программ.

Файлы, рассматриваемые Windows как небезопасные, по внутреннему содержимому не отличаются от обычных. Информация о чужеродном происхождении файла записывается в специальные потоки ADS (alternate data stream) файловой системы NTFS

Содержимое потоков ADS можно увидеть с помощью бесплатной утилиты streams из пакета SysInternalsSuite.
Помимо того, сам факт наличия заголовков можно увидеть с помощью стандартной команды dir /r

Информацию в ADS можно добавить самостоятельно. Для этого нужно к имени существующего файла прибавлять через двоеточие имя секретного файла, который не будет виден напрямую в файловой системе. Например, командой notepad.exe file.txt:BigSecret.txt мы запустим блокнот, который запросит создание нового файла file.txt:BigSecret.txt, в который можно ввести любые данные и сохранить как обычный файл. Можно пользоваться стандартными средствами перенаправления потоков ввода-вывода Windows. То есть, чтобы увидеть содержимое файла можно в консоли командой more file.txt:BigSecret.txt

Понятно, что такие данные зависят от основного файла, если удалить файл, то потоковый файл тоже исчезнет

Теперь нам понятно, как повторить поведение windows, для этого нужно просто в файл file.txt:Zone.Identifier записать следующее содержимое:

[ZoneTransfer]
ZoneId=3

Пример bat-файла:

SET OUTNAME=file.msi
echo some data>%OUTNAME%
echo [ZoneTransfer]>"%OUTNAME%:Zone.Identifier"
echo ZoneId=3 >>"%OUTNAME%:Zone.Identifier"

Для быстрого удаления всей информации потоков можно пользоваться ключом -d утилиты streams.

Вдогонку стоит упомянуть о неочевидном факте, обнаруженном в книге The Art of Software Security Assessment. А именно то, что в Windows пробелы и точки в конце имени файла игнорируются. При создании файла c:file.txt…. на диске будет успешно создан(или открыт существующий файл) c:file.txt