.DOC вариант №
Файлы с расширением .doc представляют собой документы, сгенерированные Microsoft Word или другими текстовыми редакторами в двоичном формате. Первоначально расширение использовалось для текстовой документации в нескольких различных операционных системах. Он может содержать несколько различных типов данных, таких как изображения, форматированный, а также обычный текст, графики, диаграммы, встроенные объекты, ссылки, страницы, форматирование страниц, настройки печати и многое другое. Этот формат был популярен для всех видов документации из-за множества вариантов, которые он предлагает пользователям для написания руководств, предложений, спецификаций, резюме, статей или любых подобных документов. Обновленная версия DOC — DOCX основана на Office OpenXML, спецификации которого находятся в открытом доступе.
Краткая история
WordPerfect, продукт Corel, использовал DOC как расширение собственного формата. В 1980-х годах WordPerfect по-прежнему использовался на большинстве компьютеров из-за его легкой доступности, совместимости с большинством компьютеров и операционных систем. Однако WordPerfect потерпел крах в ОС Windows, когда Microsoft представила Microsoft Word в качестве своего продукта для формата файлов документов и выбрала расширение DOC для своего проприетарного формата. Поскольку Microsoft Word становился все более и более популярным, формат файла DOC претерпел несколько изменений по сравнению с Microsoft Word 97 - 2003. Это был 2007 год, когда формат файла DOC по умолчанию был заменен форматом Office Open XML (известным как DOCX) и новыми версиями Microsoft Word теперь использует это новое расширение в качестве формата файла по умолчанию.
Спецификации формата файла DOC — дополнительная информация
Microsoft не выпускала спецификации формата файлов DOC долгое время до 2008 года. В феврале 2008 года спецификации формата были выпущены для формата файлов .doc в рамках Microsoft Open Specification Promise. Хотя спецификация не описывает все функции, используемые форматом DOC, она дает достаточно информации о знаниях, необходимых для работы с этим форматом файлов. Тем не менее, для использования доступной информации требуется обратный инжиниринг. Спецификации обновлялись несколько раз, и последняя редакция — 8.0, обновленная по состоянию на август 2018 г. .
Некоторые основные понятия
Прежде чем мы углубимся в подробности спецификаций формата файлов для DOC, необходимо понять некоторые фундаментальные концепции, чтобы работать с этим форматом файлов.
Информационная база файлов (Fib): Структура Fib содержит информацию о документе и определяет файловые указатели на различные части, составляющие документ. Фибоначчи — это структура переменной длины. За исключением базовой части, размер которой фиксирован, каждому разделу предшествует поле счета, которое определяет размер следующего раздела.
Позиция символа: CP или позиция символа представляет собой 32-разрядное целое число без знака, которое служит отсчитываемым от нуля индексом символа в тексте документа. Расположение и размер каждого символа в файле не могут быть получены напрямую и должны быть вычислены с использованием заранее заданного алгоритма. Персонажи включают:
- Текст документа
- Якоря объектов, таких как сноски или текстовые поля
- Управляющие символы, такие как метки абзаца и метки ячеек таблицы
ПЛК: Структура ПЛК представляет собой массив CP, за которым следует массив элементов данных. Элементы данных для любого ПЛК должны иметь одинаковый размер — ноль или более байтов, и по этой причине количество CP должно быть на единицу больше, чем количество элементов данных. Структуры ПЛК бывают разных типов, каждый из которых указывает, разрешены ли дублирующие CP для этого типа или нет. Структура ПЛК состоит из:
- aCP (переменная длина): Массив элементов CP. Каждый тип структуры PLC определяет значение элементов CP и допустимый диапазон.
- aData (переменная длина): Каждый тип структуры PLC определяет структуру и значение элементов данных, любые ограничения на количество элементов данных и любые ограничения на содержащиеся в них данные. Он также определяет взаимосвязь между элементами данных и соответствующими CP.
Действительный выбор: Конструкции файлов .DOC в основном описываются рядом CP. Существует ряд правил, указанных Microsoft для соблюдения в таком случае.
STTB: STTB — это таблица строк, состоящая из заголовка, за которым следует массив элементов. Значение cData указывает количество элементов, содержащихся в массиве.
Хранение свойств: В текстовом файле могут быть различные элементы, такие как текст, абзацы, таблицы, изображения и разделы, каждый из которых может иметь свои собственные свойства. Их свойства сохраняются в файле Word как отличия от значений по умолчанию. Такие различия определяются PR1, состоящим из модификатора одного свойства (Sprm) и его операнда. Приложение может определить окончательный набор свойств путем применения списков Prls.
Защита паролем. Файлы Word также могут быть защищены паролем, для чего можно использовать один из следующих механизмов.
- Обфускация XOR
- Шифрование двоичных документов Office RC4
- Шифрование двоичного документа Office RC4 CryptoAPI
Если FibBase.fEncrypted и FibBase.fObfuscation равны 1, файл запутывается с помощью запутывания XOR.
Если FibBase.fEncrypted равен 1, а FibBase.fObfuscation равен 0, файл шифруется либо с помощью шифрования Office Binary Document RC4, либо с помощью шифрования Office Binary Document RC4 CryptoAPI, при этом EncryptionHeader хранится в первых байтах FibBase.lKey потока таблицы. EncryptionHeader.EncryptionVersionInfo указывает, какой механизм шифрования использовался для шифрования файла.
Структура файла
Бинарный файл Word по своей оригинальности представляет собой составной OLE-файл, состоящий из нескольких хранилищ и потоков. Эти хранилища и потоки имеют свою структуру и размеры, задающие параметры записи и чтения. Это:
Поток WordDocument
Этот поток содержит текст документа и другую информацию, на которую ссылаются другие части файла. Поток не имеет предопределенной структуры, кроме FIB в начале, который является обязательным и должен иметь смещение 0. Этот поток не должен превышать 2147 МБ.
1TableStream или 0TableStream
Двоичный файл Word может содержать потоки таблиц, известные как поток 1Table или поток 0Table. Хотя бы один из них должен присутствовать в документе. Однако, если документ содержит потоки 1Table и 0Table, используется только поток, на который ссылается base.fWhichTblStm. Поток без ссылки ДОЛЖЕН игнорироваться. Размер Table Stream НЕ ДОЛЖЕН превышать 2147 МБ.
Поток данных
Поток данных не имеет предопределенной структуры. Он содержит данные, на которые ссылается FIB или другие части файла. Этот поток не обязательно должен присутствовать, если на него нет ссылок. Поток данных НЕ ДОЛЖЕН превышать 2147 МБ.
Хранилище пула объектов
Хранилище пула объектов содержит хранилища для встроенных объектов OLE. Это хранилище не обязательно должно присутствовать, если в документе нет встроенных объектов OLE.
Пользовательское хранилище данных XML
Хранилище пользовательских XML-данных — это дополнительное хранилище, имя которого ДОЛЖНО быть «MsoDataStore».
Поток сводной информации
Поток сводной информации — это необязательный поток, имя которого ДОЛЖНО быть «\005SummaryInformation», где \005 — это символ со значением 0x0005, а не строковый литерал «\005».
Поток сводной информации о документе
Поток сводной информации о документе — это необязательный поток, имя которого ДОЛЖНО быть «\005DocumentSummaryInformation», где \005 — символ со значением 0x0005, а не строковый литерал «\005».
Поток шифрования
Поток шифрования — это необязательный поток, имя которого ДОЛЖНО быть «шифрование». Этот поток НЕ ДОЛЖЕН присутствовать, если не выполняются оба следующих условия:
- Документ зашифрован с помощью шифрования Office Binary Document RC4 CryptoAPI.
- Значение fDocProps задается в EncryptionHeader.Flags.
Хранилище макросов
Хранилище макросов — это дополнительное хранилище, содержащее макросы для файла. Если он присутствует, это ДОЛЖНО быть корневым хранилищем проекта.
Хранилище XML-подписей
Хранилище XML-подписей — это необязательное хранилище, имя которого ДОЛЖНО быть «_xmlsignatures».
Поток подписей
Поток подписей является необязательным потоком, имя которого ДОЛЖНО быть «_signatures». Этот поток содержит цифровые подписи.
Хранилище пространства данных для управления правами на доступ к данным
Хранилище пространства данных управления правами на доступ к данным является дополнительным хранилищем, имя которого ДОЛЖНО быть «\006DataSpaces», где \006 — это символ со значением 0x0006, а не строковый литерал «\006». Если это хранилище присутствует, поток защищенного контента также ДОЛЖЕН присутствовать. Если это хранилище присутствует, все указанные потоки и хранилища, кроме этого хранилища и потока защищенного содержимого, ДОЛЖНЫ считываться из потока защищенного содержимого, как указано в [MS-OFFCRYPTO], и если какие-либо из этих потоков и хранилищ существуют за пределами защищенного содержимого. Stream, их ДОЛЖНО игнорировать.
Защищенный поток контента
Поток защищенного содержимого — это необязательный поток, имя которого ДОЛЖНО быть «\009DRMContent», где \009 — это символ со значением 0x0009, а не строковый литерал «\009». Если этот поток присутствует, ДОЛЖНО также присутствовать хранилище пространства данных управления правами на доступ к данным.