8.2 Настройка Git — Атрибуты Git
Некоторые из настроек могут быть применены к каталогу, поэтому Git применяет их только к подкаталогам или набору файлов. Настройки, зависящие от пути, называются атрибутами и могут быть установлены либо в файле .gitattributes в любом из каталогов проекта (обычно, в корневом каталоге), либо в файле .git/info/attributes , если вы не хотите хранить их в репозитории вместе с вашим проектом.
Используя атрибуты, вы можете настраивать различные стратегии слияния для отдельных файлов или каталогов вашего проекта, указать Git как сравнивать бинарные файлы, настраивать фильтры добавления или извлечения данных из репозитория. В этом разделе вы узнаете о некоторых атрибутах, которые можно установить для заданных путей в вашем проекте и рассмотрите несколько практических примеров.
Бинарные файлы
Интересная возможность атрибутов Git, которая может вам пригодиться, заключается в указании файлов, которые следует считать бинарными (особенно, когда определить это не представляется возможным), и определении инструкций как именно Git должен обрабатывать эти файлы. Например, некоторые текстовые файлы могут генерироваться автоматически и отследить изменения в них невозможно, в то же время, отследить изменения некоторых бинарных файлов вполне возможно. Далее вы увидите как объяснить Git где какой файл.
Идентификация бинарных файлов
Некоторые файлы выглядят как текстовые, но работать с ними нужно как с бинарными данными. Например, проекты Xcode на macOS содержат файл с расширением .pbxproj , который по сути является набором данных JSON (текстовое представление данных JavaScript), сохранённым на диск IDE и содержащим различные настройки проекта. Технически — это текстовый файл (потому как все данные в UTF-8), фактически — легковесная база данных; отслеживание изменений в нём бесполезно, а слияние изменений — сделанных двумя людьми — невозможно, поэтому вы вряд ли захотите обрабатывать его как текстовый файл. Файл предназначен для чтения машиной, а не человеком. Вот почему его следует рассматривать как бинарный.
Чтобы Git начал обрабатывать все pbxproj файлы как бинарные, добавьте в файл .gitattributes следующую строку:
*.pbxproj binary
Теперь, Git не будет конвертировать или исправлять CRLF в этом файле; не будет пытаться определить изменения или выводить их на экран при выполнении команд git show или git diff .
Сравнение бинарных файлов
Возможности атрибутов Git так же можно использовать для эффективного сравнения бинарных файлов. Сделать это можно указав Git каким образом конвертировать бинарные данные в текстовый формат, чтобы затем сравнить их обычным способом.
Этот подход решает одну из самых досадных проблем, известных человечеству: контроль версий документов Microsoft Word. Все уже знают, что Word — самый ужасный редактор из всех, но, как ни странно, продолжают его использовать. Если вы хотите контролировать версии документов Word, то поместите их в Git репозиторий и периодически делайте коммиты; но как это решает проблему? Если вы просто выполните команду git diff , то увидите следующее:
$ git diff diff --git a/chapter1.docx b/chapter1.docx index 88839c4..4afcb7c 100644 Binary files a/chapter1.docx and b/chapter1.docx differ
Нельзя просто взять и сравнить два файла не читая их и не сравнивая вручную, так? Это становится возможным при использовании атрибутов Git. Добавьте в файл .gitattributes следующую строку:
*.docx diff=word
Это говорит Git, что нужно использовать фильтр «word» при просмотре изменений файлов, соответствующих шаблону .docx . Что такое «word» фильтр? Вам следует его настроить. Нужно сконфигурировать Git на использование программы docx2txt для конвертации документов Word в текстовые, которые можно корректно сравнивать.
Для начала, нужно установить программу docx2txt ; вы можете скачать её здесь https://sourceforge.net/projects/docx2txt. Следуйте инструкциям из файла INSTALL для её установки и настройки запуска из командной строки. Затем следует написать скрипт обёртку для конвертации вывода программы в формат, понятный Git. Создайте файл docx2txt в любом доступном для запуска месте и добавьте в него следующее содержимое (прим. пер.: применимо для Linux и Mac):
#!/bin/bash docx2txt.pl "$1" -
Не забудьте добавить права запуска для созданного файла. Наконец, настройте Git на использование созданного скрипта:
$ git config diff.word.textconv docx2txt
Теперь Git знает, что при сравнении двух коммитов, имена файлов в которых заканчиваются на .docx , он должен обработать эти файлы с помощью фильтра «word», который определён как программа docx2txt . Это позволяет автоматически генерировать текстовые версии файлов Word и только потом их сравнивать.
Для примера, первый раздел этой книги был сохранен в формате Word и добавлен в Git репозиторий. Затем был добавлен новый абзац. Вот что покажет команда git diff :
$ git diff diff --git a/chapter1.docx b/chapter1.docx index 0b013ca..ba25db5 100644 --- a/chapter1.docx +++ b/chapter1.docx @@ -2,6 +2,7 @@ This chapter will be about getting started with Git. We will begin at the beginning by explaining some background on version control tools, then move on to how to get Git running on your system and finally how to get it setup to start working with. At the end of this chapter you should understand why Git is around, why you should use it and you should be all setup to do so. 1.1. About Version Control What is "version control", and why should you care? Version control is a system that records changes to a file or set of files over time so that you can recall specific versions later. For the examples in this book you will use software source code as the files being version controlled, though in reality you can do this with nearly any type of file on a computer. +Testing: 1, 2, 3. If you are a graphic or web designer and want to keep every version of an image or layout (which you would most certainly want to), a Version Control System (VCS) is a very wise thing to use. It allows you to revert files back to a previous state, revert the entire project back to a previous state, compare changes over time, see who last modified something that might be causing a problem, who introduced an issue and when, and more. Using a VCS also generally means that if you screw things up or lose files, you can easily recover. In addition, you get all this for very little overhead. 1.1.1. Local Version Control Systems Many people's version-control method of choice is to copy files into another directory (perhaps a time-stamped directory, if they're clever). This approach is very common because it is so simple, but it is also incredibly error prone. It is easy to forget which directory you're in and accidentally write to the wrong file or copy over files you don't mean to.
Git кратко сообщает нам, что была добавлена строка «Testing: 1, 2, 3.». Решение не идеальное — изменения форматирования не отображаются — но это работает.
Проблему сравнения файлов изображений можно решить аналогичным образом. Один из способов реализации заключается в передаче изображения на фильтр для извлечения EXIF информации — метаданных, которые сохраняются для большинства форматов изображений. Скачав и установив программу exiftool , вы сможете использовать её для конвертации изображений в текстовые метаданные, изменение которых будет являться текстовым представлением изменений изображений. Добавьте следующую строку в ваш файл .gitattributes :
*.png diff=exif
Настройте Git на использование этой программы:
Декларативный язык FlexT — инструмент анализа и документирования бинарных форматов данных Текст научной статьи по специальности «Компьютерные и информационные науки»
СПЕЦИФИКАЦИЯ БИНАРНЫХ ФОРМАТОВ ДАННЫХ / СПЕЦИФИКАЦИЯ КОДИРОВАНИЯ МАШИННЫХ КОМАНД / ДЕКЛАРАТИВНЫЙ ЯЗЫК / ДИЗАССЕМБЛЕР / SPECIFICATIONS OF BINARY DATA FORMATS / SPECIFICATION OF ENCODING OF MACHINE INSTRUCTIONS / DECLARATIVE LANGUAGE / DISASSEMBLER
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Хмельнов А.Е., Бычков И.В., Михайлов А.А.
Язык FlexT разработан для спецификации бинарных форматов данных . Язык является декларативным, рассчитанным на хорошее восприятие человеком, его основными конструкциями являются определения типов данных, которые напоминают определения типов в императивных языках программирования, но являются более гибкими. В работе сделан обзор возможностей современных проектов, направленных на спецификацию бинарных форматов файлов. Далее рассматриваются особенности языка FlexT, отдельно описываются возможности языка, позволяющие работать с форматами кодирования машинных команд. Кратко описаны реализованные программные системы, использующие интерпретатор FlexT и некоторые новые возможности поиска информации в бинарных файлах, которые даёт использование спецификаций.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Хмельнов А.Е., Бычков И.В., Михайлов А.А.
Проведение динамического анализа исполняемого кода формата Arm elf на основе статического бинарного инструментирования
Восстановление формата данных
Интегрированная среда описания системы команд встраиваемых процессоров
Методы и программные средства, поддерживающие комбинированный анализ бинарного кода
Восстановление структуры бинарных данных по трассам программ
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.
A declarative language FlexT for analysis and documenting of binary data formats
The language FlexT (Flexible Types) is intended for specification of binary data formats. The language is declarative and designed to be well understood for human readers. Its main elements are the data type declarations, which look very much like the usual type declarations of the imperative programming languages, but are more flexible. In the article we first give a review of the capabilities of the modern projects oriented to specification of binary file formats. Then we consider the main features of the FlexT language and, in particular, the features that help to describe the formats of encoding of machine instructions. Finally we briefly describe the software developed, which is based upon the FlexT interpreter and some new capabilities of information search, which makes possible the use of the specifications.
Текст научной работы на тему «Декларативный язык FlexT — инструмент анализа и документирования бинарных форматов данных»
Декларативный язык FlexT — инструмент анализа и документирования бинарных форматов данных
А.Е. Хмельное И.В. Бычков A.A. Михайлов Институт динамики систем и теории управления имени Матросова СО РАН, 664033, Россия, г. Иркутск, ул. Лермонтова, д. 134
Аннотация. Язык FlexT разработан для спецификации бинарных форматов данных. Язык является декларативным, рассчитанным на хорошее восприятие человеком, его основными конструкциями являются определения типов данных, которые напоминают определения типов в императивных языках программирования, но являются более гибкими. В работе сделан обзор возможностей современных проектов, направленных на спецификацию бинарных форматов файлов. Далее рассматриваются особенности языка FlexT, отдельно описываются возможности языка, позволяющие работать с форматами кодирования машинных команд. Кратко описаны реализованные программные системы, использующие интерпретатор FlexT и некоторые новые возможности поиска информации в бинарных файлах, которые даёт использование спецификаций.
Ключевые слова: спецификация бинарных форматов данных, спецификация кодирования машинных команд, декларативный язык, дизассемблер
Для цитирования: А.Е. Хмельнов, И.В. Бычков, A.A. Михайлов. Декларативный язык FlexT — инструмент анализа и документирования бинарных форматов данных. Труды ИСП РАН, том 28, вып. 5, 2016 г., стр. 239-268. DOI: 10.1551MSPRAS-2016-28(5)-15
При выборе существующих или разработке собственных форматов файлов для сохранения информации на диске, а также при необходимости организовать файловый обмен данными между различными приложениями, разработчики программного обеспечения встают перед выбором между бинарными и текстовыми форматами представления информации. Бинарные форматы в большинстве случаев являются более компактными, программный код для работы с бинарными данными также может быть значительно более простым
по сравнению с кодом для обработки текста (например, одной командой можно прочитать из бинарного файла запись, содержащую сразу несколько десятков полей). Однако, текстовые файлы являются более прозрачными: для их просмотра можно воспользоваться любым текстовым редактором. Поэтому, в настоящее время разработчики часто жертвуют эффективностью ради упрощения контроля правильности структуры файла, и выбирают текстовые форматы. Часто такие форматы основываются на синтаксисе XML, поскольку для этого синтаксиса существуют готовые библиотеки и инструментальные средства, облегчающие разработку алгоритмов чтения/записи информации, и автоматизирующие контроль правильности структуры файла. Для поддержки использования нового формата данных в разрабатываемой программе можно подключить библиотеку для работы с этим форматом или написать собственный код с использованием спецификации формата. Любая библиотека навязывает разработчику свои структуры данных, которые, если программа пишется не с нуля, скорее всего, будут отличаться от уже используемых. В результате потребуется написать дополнительный программный код для конвертации данных, что скажется на скорости работы программы. Кроме того, подходящие библиотеки могут и отсутствовать. При отсутствии готовых библиотек, а также при желании получить более эффективную реализацию, придётся написать код для работы с форматом данных по его спецификации. Используемая спецификация может быть написана на естественном языке, кроме того, для изучения формата данных могут служить исходные тексты программ работающих с этим форматом и даже примеры относящихся к формату файлов. Рассмотрим особенности каждого из этих источников информации о формате более подробно:
• Спецификации на естественном языке практически всегда содержат неточности и неоднозначности толкования. То, что было очевидно автору спецификации, может быть непонятно читателю, или, может быть понято им превратно. Содержащаяся в такой спецификации информация не была верифицирована путём её использования для реальной работы с данными, поэтому очень часто она является ненадёжной.
• С другой стороны, исходные тексты программ для работы с рассматриваемыми файлами, прошли проверку на реальных данных и, скорее всего, не содержат подобных ошибок. Однако, в этих исходных текстах информация о структурах данных файла разбросана по коду, предназначенному для конкретного способа работы с этими данными, поэтому изучение такого кода в качестве документации по формату является очень непростой задачей.
• Ещё более сложной является задача восстановления недокументированного формата данных по примерам файлов этого формата. Она требует выполнения многочисленных попыток разбора файлов при некоторых предположениях об их структуре с выводом
всей извлекаемой информации для анализа. Программа, выполняющая такую работу, будет существенно сложнее программы, просто считывающей информацию во внутреннее представление. Кроме того, при разработке программы, записывающей данные в бинарный формат, часто очень остро встаёт проблема её отладки: сложно понять, что требуется исправить, когда используемое для проверки правильности полученного файла приложение выдаёт неинформативное сообщение, рассчитанное на конечного пользователя, например, просто пишет: «Ошибка в формате файла» (без указания места и других подробностей). Таким образом, является целесообразной разработка специальных инструментов для задачи анализа содержимого бинарных файлов с использованием спецификаций форматов данных. В статье рассматривается разработанный авторами язык FlexT, предназначенный для описания бинарных форматов данных, и реализованные с использованием интерпретатора этого языка инструменты, предназначенные для анализа бинарных файлов. Преимуществами использования формальных спецификаций являются:
• компактность, отсутствие не относящихся к способам хранения данных сведений, что облегчает их восприятие человеком;
• верифицируемость посредством их применения для анализа относящихся к формату корректных данных;
• возможность использования спецификаций для локализации ошибок в сгенерированных файлах.
Далее в главе 2 будет сделан обзор существующих средств спецификации бинарных форматов данных, в главе 3 будут рассмотрены особенности и основные конструкции языка FlexT. В главе 4 будут описаны типы данных языка FlexT, ориентированные на спецификацию кодирования машинных команд. В главе 5 будут рассмотрены разработанные программы, использующие спецификации для исследования бинарных файлов и ряд возможностей инструментов, использующих интерпретатор FlexT.
2. Обзор средств спецификации бинарных форматов данных
К моменту создания языка FlexT (конец 1990-х) задачей спецификации бинарных форматов данных почти никто не занимался. В качестве обзора литературы тогда удалось найти только одну хоть немного действующую ссылку на проект BFF (Binary File Format Definition), сейчас страница проекта существует и находится по адресу [1]. Первоочередной задачей разработки языка BFF являлось обратное проектирование формата AutoCAD DWG. Автор использовал термин «грамматика», т.е. отталкивался от концепции формальных грамматик при проектировании языка спецификаций. Другие бинарные форматы, помимо DWG, описаны не были, уровень описания формата DWG также не удаётся оценить.
За прошедшее время уровень понимания необходимости использования спецификаций для работы с бинарными данными существенно вырос. Рассмотрим появившиеся проекты, в основном в порядке их упоминания в выдаче поисковой системы.
Стандарт DFDL (Data Format Description Language) [2][3] разрабатывается для описания текстовых и бинарных данных, используемых в GRID-системах, судя по приводимым примерам, в основном табличных (на уровне возможностей формата CSV). Стандарт DFDL был опубликован, как рекомендованные предложения форума Open Grid в 2011 г. Целью разработки стандарта является унификация обработки (чтения и записи) из текстовых (XML, CSV) и бинарных данных содержащегося в них «набора информации» (information set). Описания форматов кодируются на XML. Имеется коммерческая реализация парсера DFDL в составе продукта IBM Integration Bus [4], а также открытая реализация [5]. Сами описания бинарных данных являются достаточно примитивными (на уровне записей с полями постоянного размера в терминах FlexT), в силу ограничений стандарта, а также потому, что существующий парсер поддерживает не все предусмотренные этим стандартом возможности [6]. Тем не менее, эта реализация позволяет, например, использовать для обмена данными простой бинарный формат, сопроводив его спецификацией на DFDL. Никакие описания настоящих форматов данных, таких как DBF, на DFDL найти не удалось. Популярность DFDL объясняется большим объёмом подготовленной документации по формату и участием в его разработке гиганта IBM.
Аналогичную задачу решает язык MFL (Message Format Language) в составе продукта WebLogic Integration фирмы Oracle [7]. В данном случае обмен информацией с использованием специальных бинарных форматов выполняется между приложениями, использующими эту платформу. Язык также основан на XML и позволяет описывать форматы с последовательной формой хранения информации (без указателей в терминах FlexT). Допускается использование повторяющихся элементов, а также необязательных полей. Для построения спецификации формата используется специальный интерактивный редактор Format Builder. Так же, как и DFDL, MFL не предназначен для спецификации произвольных бинарных форматов, а лишь тех, которые укладываются в рамки его возможностей, с учётом которых и должен проектироваться формат. Существует ряд проектов, направленных на описание сетевых протоколов, например, NetPDL [8] и BinPAC [9]. Язык NetPDL предназначен для документирования форматов пакетов сетевых протоколов и основан на синтаксисе XML. Язык BinPAC направлен на генерацию кода для чтения пакетов с использованием генератора синтаксических анализаторов Bison. Поскольку сама природа сетевых протоколов предполагает последовательное чтение данных, такие языки также позволяют описать лишь форматы с последовательной формой хранения информации (без указателей в терминах FlexT). Поддерживаются все основные конструкции, предназначенные для
описания потоков данных (массивы, записи, варианты в терминах Flext), параметризация типов. В языке NetPDL имеются простые битовые типы, в языке BinPAC битовых типов нет.
В ходе выполнения ранее упоминавшегося обзора в конце 1990-х годов остался незамеченным язык EAST (Enhanced Ada SubseT) [10], часть информации о котором была опубликована ещё в 1997. Язык разработан консультативным комитетом систем космических данных (CCSDS), в котором участвует и Российское космическое агентство, для облегчения обмена информацией, передаваемой космическими системами. В основу языка положена подсистема определения типов данных языка Ada. В языке EAST поддерживаются поля записей переменного размера, массивы с задаваемой в некотором поле длиной, а также со стоп-маркером; вариантные части, содержимое которых определяется некоторым внешним полем (выбор по внутреннему содержимому не предусмотрен). Более сложные, чем значение некоторого поля, выражения для параметров типов не поддерживаются. Большое внимание уделяется битовым типам данным и учёту порядка байтов. Отсутствуют указатели, как нехарактерные для данных, передаваемых последовательно. Используемый способ передачи параметров типов данных не слишком гибок и не очень удобен.
Язык HUDDL [11] разработан для описания форматов представления гидрографических данных. Язык также основан на синтаксисе XML и ориентирован на описание потоков бинарных данных (уровень записей и массивов в терминах FlexT). Спецификации используются для генерации кода для работы с данными на различных языках программирования. Авторам известен проект DFDL, но они предпочитают разработать свой язык, ориентированный на особенности гидрографических данных. В проекте «Advanced Language Processing Technology Applied to Digital Records» [12] сотрудники военного НИИ из США рассматривают задачу интеграции разнородной цифровой информации, используемой для принятия военных решений. Предлагается использовать аппарат атрибутивных грамматик для описания бинарных форматов данных [13]. Далее используется генератор синтаксических анализаторов (парсеров) ANTLR [14] для автоматического построения по спецификации-грамматике кода чтения бинарного файла. Все приведённые примеры имеют дело с форматами с последовательной записью данных (в терминах FlexT: без использования указателей). Такой подход позволяет частично ускорить разработку модулей чтения информации для ряда форматов.
В проекте DataScript [15] спецификации форматов данных используются для генерации библиотек для чтения данных на языке Java. Вместе с исходными текстами [16] опубликованы два описания форматов: файла класса Java (без описания машинных команд) и DVI (оба формата являются последовательными, без указателей в терминах FlexT). Кроме того, в статье [15] приводятся фрагменты спецификации формата ELF, для описания которого
требуются указатели. Вместо указателей в DataScript используются метки, содержащие выражения с адресом фрагмента файла. С 2003 г. исходные тексты проекта не обновлялись. Спецификация рассматривается, как набор определений типов данных, этот подход наиболее близок используемому в языке FlexT. При этом для работы с битовыми типами определены отдельные (отличные от байтовых) типы данных (битовые поля), в полном объёме битовые типы не поддерживаются. Для описания вариантных блоков используется конструкция union, в которой происходит выбор того варианта, заданные для которого ограничения выполняются, сами ограничения могут задаваться в виде ожидаемых значений отдельных полей. Этот подход не позволяет описать выбор вариантов по задаваемому извне значению, например, когда тип блока задаётся в той записи, где находится указатель на блок.
Целью проекта Miraplacid Binary DOM (Binary Document Object Model) [17] является реализация универсальной библиотеки для доступа к бинарным и текстовым данным в стиле DOM, используемой для HTML-документов. В спецификациях бинарных данных (файлы с расширением bdd) используются массивы записи и указатели (в терминах FlexT), но не удалось найти никакой поддержки вариантных блоков. Также заметно отсутствие битовых типов данных. Спецификация представляет собой набор типов данных. На сайте [18] описан 21 формат, некоторые из них — текстовые (INI, RTF, XML). Реализована программа для просмотра содержимого бинарного файла по спецификации (отображается дерево обнаруженных структур данных и шестнадцатеричный дамп, в котором выделяется блок памяти, соответствующий выбранному узлу дерева)
Проект Kaitai Struct [19] ориентирован на создание парсеров бинарных данных по спецификациям. Спецификация в файле с расширением ksi по своей структуре напоминает формат JSON, в котором отступы используются вместо скобок. Основной структурой данных является последовательность (запись в терминах FlexT), которая может иметь повторяющиеся элементы (массивы в терминах FlexT). Поддерживаются указатели, а вместо вариантных типов данных могут использоваться условия вхождения полей в записи, что может иногда оказаться не слишком удобным, в особенности при задании условия для поля, соответствующего ветви варианта ELSE (там необходимо записать конкатенацию отрицаний условий всех остальных ветвей). Также не поддерживаются битовые типы данных.
Программа Synalyze It! [20] является средством просмотра/шестнадцатеричным редактором бинарных файлов. Эта программа предназначена для работы под macOS (распространяется платно), существует её бесплатная версия для других платформ под названием Hexinator [21]. Программа может использовать спецификации бинарных форматов для формирования дерева найденных в файле структур данных и выделения цветом соответствующих им фрагментов файла. Спецификации форматов данных называются грамматиками и хранятся в основанном на XML представлении. Для разработки спецификаций
реализован интерактивный редактор. В списке имеющихся описаний [22] в основном представлены специфичные для macOS форматы, но есть и более распространённые, такие как DBF, Shape или РЕ ЕХЕ. Используемый язык спецификаций нельзя считать полностью декларативным, поскольку описания форматов содержат достаточно большие вставки на языке Python. Таким образом, к настоящему времени во многих предметных областях осознана необходимость использования спецификаций форматов данных. При этом иногда ставится задача не описания произвольных форматов, а лишь облегчения работы с некоторым их подмножеством. В некоторых случаях задача описания произвольных форматов ставится, но реализуются не все конструкции, необходимые для её решения. Часто для спецификаций выбирается представление XML, что затрудняет восприятие текста спецификации человеком и требует использования специальных средств просмотра и интерактивных редакторов, которые, хотя и облегчают выполнение ряда операций редактирования, но затрудняют выполнение некоторых других действий, например, не позволяют одновременно увидеть и изменить характеристики сразу нескольких узлов. В некоторых проектах о спецификации бинарного формата думают, как о грамматике, а в других спецификация рассматривается, как набор типов данных. Многие языки спецификаций были созданы для облегчения написания кода для работы с данными, поэтому эту задачу можно считать востребованной. Также очень заметно, что в статьях по тематике очень редко встречаются ссылки на аналоги, упоминались как аналоги лишь нескольких проектов: EAST, DFDL и DataScript.
3. Особенности языка FlexT
Большая часть информации о формате данных на языке FlexT задаётся при помощи набора определений типов данных. При этом, по сравнению с типами данных в императивных языках программирования, типы данных FlexT могут содержать составляющие, размер которых определяется конкретными данными, представленными в этом формате. Т.е. можно сказать, что типы гибко подстраиваются под данные, этим объясняется название языка FlexT (от англ. Flexible Types). После определения типов данных необходимо задать размещение в памяти некоторых элементов данных, относящихся к каким-то из этих типов. Такие элементы данных по аналогии с императивными языками программирования будем называть переменными (хотя они и описывают неизменяемые данные).
Синтаксис языка выбран так, чтобы он хорошо воспринимался человеком. При проектировании некоторых из рассмотренных в обзоре языков, например, языка EAST, такая задача явно формулировалась в требованиях к разработке. Рассмотрим основные особенности и принципы создания языка FlexT, которые делают его применимым для описания широкого круга форматов.
3.1 Уровни языков спецификации форматов данных
По возможностям работы с описываемыми данными можно различать два уровня языков спецификации данных: спецификация интерпретации и спецификация редактирования. Язык спецификации интерпретации должен позволять легко описывать интерпретацию произвольного (в рамках определённых ограничений) класса данных. Под интерпретацией здесь понимается не преобразование всех данных в некоторый конкретный формат, а наличие в спецификации информации о способах извлечения из описанных данных значений свойств рассматриваемого класса данных. Например, спецификация формата файла растровой графики должна позволять извлечь из такого файла информацию о размерах изображения (ширина, высота) и цвете каждого пикселя, расположенного в границах изображения. Язык спецификации редактирования должен кроме определения функций-наблюдателей для считывания информации давать определения конструкторов, позволяющих создавать по заданным свойствам новые экземпляры данных. При этом приходится учитывать дополнительные детали, например, распределение памяти, порядок порождения элементов данных, соглашения по их выравниванию, способ заполнения пропусков, алгоритм генерации идентификаторов новых объектов, и т.д. В текущей версии язык FlexT не поддерживает описание таких спецификаций.
Слова «легко», «простота» и т.п. часто употребляется при определении понятия «спецификация». Подразумевается, что запись некоторой информации на языке спецификации должна быть проще, чем на обычном языке программирования. Более существенным здесь является не субъективное понятие простоты, а отсутствие в спецификации избыточной информации. Язык спецификации должен быть как можно более декларативным: он должен описывать то, как размещаются данные, а не то, как их надо читать.
Одни и те же данные могут интерпретироваться разными способами. Например, файл одноканального растрового формата может отображаться, как изображение в тонах серого, или как матрица высот, или как двумерная таблица. В качестве базовой интерпретации, пригодной для описания любого формата данных, можно предложить такую, которая приписывает тип каждому элементу данных — выполняет идентификацию типов данных. Такая интерпретация является базовой и минимальной, поскольку при использовании некоторого элемента данных в интерпретации более высокого уровня всё равно придётся определить, к какому типу этот элемент относится. В качестве класса данных, в который они отображаются при идентификации типов, используется набор взаимосвязанных элементов данных. Каждый элемент данных характеризуется своим размещением (адресом и размером) и типом, и может содержать ссылки на другие элементы данных, а также необходимую для полного описания других элементов данных информацию. Размер элемента данных определяется его типом. Элементы данных могут быть составными — в этом случае внутри них можно выделить элементы меньшего размера.
Элемент данных можно сравнить с термом, а идентификацию типов данных — с эрбрановой интерпретацией в логике первого порядка. Интерпретация типов данных может быть неполной. В этом случае она содержит элементы данных, которым не сопоставлен тип или, точнее, в этом случае можно считать, что им сопоставлен примитивный тип — сырые данные.
Рассматриваемый в данной работе язык спецификации форматов данных FlexT позволяет описывать интерпретацию статических данных, в первую очередь — в виде идентификации типов. Данный язык применяется для описания форматов данных в программах просмотра/дизассемблере бинарных файлов, а также в программе ExeXpl, предназначенной для исследования кода и структур данных в исполняемых файлах Windows.
3.2 Динамические и статические типы данных
Под статическими типами данных здесь мы будем понимать аналоги большинства традиционных типов данных, реализованных в процедурных языках программирования. Их отличительной особенностью является то, что размер элемента данных такого типа и внутреннее размещение составляющих его элементов определены в момент компиляции и не зависят от конкретных данных. В процедурных языках программирования, по крайней мере, в тех, которые реально используются в настоящее время, составные типы данных могут содержать только статические составляющие.
Размер элемента данных динамического типа и внутреннее размещение его составляющих могут зависеть от конкретных данных. Далее слово «динамический» будет использоваться именно в этом смысле. Примером динамических типов в традиционных процедурных языках являются строковые константы. Например, для ASCIIZ строк, чтобы определить занимаемый ими размер, нужно просмотреть всю строку в поисках нулевого символа. Динамические типы данных непригодны в качестве типов переменных, по крайней мере, если этот тип изменяемый (в терминах [23]), поскольку присваивание новых значений элементам таких данных может означать изменение размера, а такие операции ни один компилятор не сможет эффективно поддержать. Для полей типов данных, содержащих те же строки или записи с вариантами, память сразу выделяется по максимуму. Примером поддержки компилятором динамического перераспределения памяти, занимаемой значением переменной, являются huge-строки Delphi, память под которые автоматически запрашивается в куче, при этом сами переменные такого типа фактически являются указателями и всегда занимают 4 байта. В то же время, если рассматривать статические данные, которые программа может только читать, то здесь иногда используются весьма изощрённые способы их кодировки. В качестве примера статических данных в коде программы можно привести RTTI Delphi — способ представления метаинформации о типах данных:
PTypelnfo = ^TTypelnfo; TTypelnfo = record Kind: TTypeKind; Name: ShortString; end;
function AfterString(Str: PShortString): Pointer; inline; begin
Result := PByte(Str) + Length(Str^) + 1; end;
function GetTypeData(Typelnfo: PTypelnfo): PTypeData; begin
Result := AfterString(STypelnfo».Name); end;
Листинг 1. Фрагменты файла Typelnfo.pas
Listing 1. Excerpts from the file Typelnfo.pas
Информация о типе данных закодирована в записи типа TTypelnfo, в которой за кодом вида типа данных и его именем следует запись TypeData с остальной информацией о типе. Определение поля TypeData заключено в комментарий, т.к. на самом деле эти данные находятся непосредственно после последнего символа строкового поля Name, размер которого зависит от длины имени конкретного типа. Поскольку смещение поля TypeData зависит от конкретных данных — имени типа, такую структуру нельзя непосредственно представить на Паскале. Приходится писать специальный код для доступа к этому полю -функцию GetTypeData.
Подобные трудности испытывают все авторы книг по форматам файлов данных при попытке описать эти данные, например, на языке С. Причина всех этих проблем — в использовании для спецификации форматов данных языка, предназначенного для описания типов переменных. В то же время, если отвлечься от необходимости придерживаться ограничений на типы переменных, то можно естественным образом поддержать в языке описание достаточно сложных зависимостей между элементами данных. Именно этот подход использован при проектировании языка FlexT.
3.3 Использование механизма определения типов данных
Таким образом, в качестве основного элемента языка спецификации форматов данных мы будем рассматривать механизм определения типов. В процедурных языках программирования механизм определения типов можно считать отдельным вложенным языком, т.к. типы данных влияют, например, на
семантику и синтаксис процедур для работы с данными этих типов, но не наоборот. Если в процедурных языках программирования основная информация программы содержится в коде процедур, то при описании способов хранения информации основная нагрузка ляжет именно на механизм определения типов. Рассмотрим, какими возможностями должен обладать такой механизм.
При идентификации типов данных любые физические данные будем рассматривать как набор элементов данных. Каждый такой элемент характеризуется своим адресом, размером и интерпретацией (типом). Составные элементы данных разбиваются на более мелкие элементы. Всю информацию, которую должна предоставить спецификация идентификации типов данных о каждом элементе данных, можно разбить на набор утверждений о том:
1. На какие составляющие, каких типов этот элемент разбивается;
2. Где находятся эти составляющие (каковы их адреса);
3. Сколько места они занимают.
При этом из того, что в рассматриваемых данных содержится некоторый элемент составного типа, выводится информация о типах и размещении его составляющих (из которой, в свою очередь, может выводиться информация о размере этого составного элемента).
Составляющие элемента данных могут размещаться либо на некотором фиксированном смещении от его начала, либо на некотором смещении от конца другой составляющей. Составной элемент некоторого типа может содержать либо фиксированное число составляющих, либо это число может определяться динамически, т.е. отличаться у разных экземпляров одного типа. Если число составляющих фиксировано, то их можно поименовать, в этом случае элемент данных можно описать как запись с полями — составляющими. При динамическом определении набора составляющих можно рассмотреть два основных случая: 1) когда содержание части полей определяет, какие ещё поля входят в состав записи — этот случай описывается при помощи вариантных типов данных; 2) когда число составляющих определяется динамически — при этом, т.к. размер спецификации конечен, она должна содержать итеративные элементы. Эти итеративные элементы можно выделить в массив. Более сложные случаи могут быть описаны при помощи комбинации массивов и вариантов. Т.е. можно рассчитывать, что для описания произвольных структурированных составных элементов данных достаточно использовать конструкторы записи, массива и варианта (в широком смысле). Кроме механизма описания структуры отдельного элемента данных нужны ещё механизмы для описания зависимостей между различными элементами. Наиболее важным случаем такой зависимости является указатель — элемент данных, в котором закодирована информация об адресе и типе другого
элемента данных. Также следует учесть, что для правильной интерпретации одних элементов данных может потребоваться информация, содержащаяся в других элементах. Например, запись может содержать поля Счётчик и Таблица, где поле Таблица является массивом, число элементов которого записано в поле Счётчик. Для описания подобных случаев используется механизм параметризации типов данных.
3.4 Краткое описание языка FlexT
В текущей реализации интерпретатора FlexT программа компилируется после загрузки разбираемых данных. Это создаёт некоторые сложности при попытке использования спецификаций для других целей, например, для генерации кода чтения. С другой стороны, при таком подходе упрощается написание спецификаций за счёт возможности использования динамических выражений, например, в директивах условной компиляции, а именно максимальная простота написания спецификаций и является целью создания языка. Дадим несколько пояснений, необходимых для понимания следующих далее фрагментов кода. Язык FlexT является нечувствительным к регистру. Перевод строки может быть разделителем, если он происходит в месте возможного окончания конструкции (величина отступа при этом значения не имеет). Вложенные определения типов можно брать в круглые скобки, тем самым решается вопрос о принадлежности блоков дополнительной информации о типе.
3.4.1 Выражения, параметры и свойства типов
Типы данных могут иметь ряд свойств, набор которых зависит от конструктора этого типа, например, размер и число элементов у массива, или номер случая у варианта. Каждый тип имеет свойство Size (Размер). Свойства могут задаваться конкретным значением при определении типа, либо некоторым выражением, которое вычисляет значение данного свойства через значения и/или свойства вложенных элементов данных сложного типа, а также, м.б. через значения параметров типа. Некоторые правила для вычисления свойства Размер могут автоматически добавляться компилятором, если они не указаны явно, это касается, например, случая, когда известен размер всей записи и всех её полей, кроме последнего. Параметры в объявлении типа представляют ту информацию, которую необходимо указать дополнительно при использовании (вызове) данного типа.
Выражения для значений параметров и свойств типов оцениваются интерпретатором в ленивом режиме [24], т.е. они вычисляются только при необходимости использования такого значения. В некоторых случаях это позволяет избежать переполнения стека.
3.4.2 Ссылки на свойства в выражениях
Выражения вычисляются в контексте элемента данных некоторого типа, ссылка на этот элемент обозначается символом ‘ @ ‘, при этом ‘ @ ‘ ‘ : ‘ означает ссылку на параметр или свойство данного элемента. Также в выражениях могут использоваться специальные конструкции: ‘ @ ‘ — ссылка на родительский элемент, т.е. на элемент данных того типа, в контексте которого данный тип определён. Пример: Т1 struc int Cntl int Cnt2
array[@.Cntl] of (array[@@.Cnt2] of word) Tbl ends
Выражения для параметра конструктора типа вычисляются в контексте вызова этого конструктора, поэтому значение свойства Count конструктора главного массива ТЫ вычисляется в контексте типа Т1, а для вложенного массива — в контексте типа массива ТЫ, поэтому требуется написать @@.Cnt2, чтобы сослаться на поле Cnt2 в записи — родителе главного массива. ‘ : ‘ ‘ @ ‘ — ссылка на элемент даных-хозяин, т.е. на элемента данных, в который вложен рассматриваемый элемент. Т.к. некоторый тип может использоваться в разных составных типах, чтобы воспользоваться этой конструкцией, необходим оператор приведения к типу с проверкой: ‘AS’ .
‘ @ ‘ ‘ : ‘ ‘ # ‘ — номер вложенного элемента данных в содержащем его элементе, например, индекс массива.
3.4.3 Блоки с дополнительной информацией о типе
Для определения различных типов данных в языке существуют конструкторы (массива, записи, варианта, и т.д.), синтаксис записи которых существенно различается. В то же время есть ряд задач, которые требуется решать для любых типов, независимо от того, при помощи каких конструкторов они определяются. Для этих целей используются блоки с дополнительной информацией о типе, которые могут быть записаны через ‘ : ‘ после любого определения типа. К этим блокам относятся:
Табл. 1. Блоки с дополнительной информацией о типе
Table 1. The blocks of data type additional information
Блок Пример Описание
утверждений : [@ : Size=@.Len, @ . offset :Cnt=@.count] Позволяет задать значения свойств типа данных или параметров его составляющих с использованием параметров типа или информации о его составляющих
условий корректности : assert[@.Op>=Ox8 0] Задаёт логическое условие, которое должно выполняться для данных, относящихся к этому типу
отображения :displ=(‘#’,HEX(2*@)) Позволяет переопределить способ отображения значений типа
именования :autoname=(‘sec ‘,@.tag) Аналогичен сИзр1, но служит для задания имён переменных
дополнительного свойства типа : let Val=(@.0)exc(@.1) Позволяет задать способ вычисления свойств типа, которые далее могут использоваться в выражениях
Блок утверждений можно использовать, чтобы связать параметры типа со значениями его свойств в том случае, когда конструктор типа не позволяет это сделать. Например, конструктор массива позволяет задать количество элементов, но не суммарный размер массива. Также этот блок используется, чтобы задать свойства определяемого типа по значениям его составляющих. Т.к. компилятор FlexT является однопроходным, в выражениях для параметров типа нельзя сослаться на ещё не прочитанные составляющие, поэтому, чтобы, например, задать значение параметра поля записи по значению следующего за ним другого поля следует использовать блок утверждений записи. 252
Блок именования может использоваться для переменных, положение которых в памяти было найдено при помощи указателей. По умолчанию в этом случае переменная обозначается квалификатором доступа к ней через цепочку указателей, который может оказаться очень длинным и не слишком информативным. При наличии блока именования вместо этого квалификатора будет использоваться сформированная этим блоком строка. Эту возможность удобно использовать, например, когда в состав данных типа входит информация о некотором имени объекта, который эти данные описывают. Блок дополнительного свойства типа позволяет описать способ вычисления некоторого значения, закодированного этим типом данных. Например, во многих бинарных форматах используется приём, когда целое число может быть представлено различным количеством байтов в зависимости от его значения. Выражение, описывающее декодирование такого числа, может быть задано, как дополнительное свойства этого типа данных. При работе с данными значение этого свойства так же, как и остальных свойств, вычисляется в ленивом режиме: при первом обращении с последующим запоминанием.
3.5 Типы данных языка FlexT
Основные конструкторы типов данных языка FlexT приведены в следующей таблице:
Табл. 2. Типы данных языка FlexT
Table 2. The FlexT language data types
Тип Пример Описание
Целые числа num- ( 6 ) Характеризуются размером и наличием знака, для знаковых чисел используется дополнительный код.
Пустой Void Тип с размером 0, позволяет пометить место в памяти.
Символьные char, wchar, wcharr В выбранной кодировке или Unicode с разными порядками байтов
Перечислимый enum byte (A=1,B,C) Задаёт наименования константам базового типа данных
Перечисление термов enum TBit8 fields ( R0 : TReg @0.3, . . . ) of( rts(R0) = 000020 , . . . ) Облегчает описание кодирования машинных команд, т.к. в основном для них используется этот приём: в составе целого числа выделяются битовые поля, использование которых определяется остальными битами числа
Множество set 8 of ( OLD Л 0x02, . . . ) Даёт наименование битам, биты могут задаваться своим номером (символ ‘ =’ после имени) или маской (символ ‘ А ‘)
Запись struc Byte Len array[@.Len]of Char S ends Последовательное размещение именованных и, возможно, разнотипных составляющих в памяти
Вариант case @.Kind of vkByte: Byte else ulong endc Выбор типа содержимого по заданной в параметрах (внешней) информации
Проверка try FN: TFntNum Op: TDVIOp Endt Выбор типа содержимого по внутренней информации: выбирается первый тип, для которого выполняется условие корректности
Массив array[@.Len]of str array of str ?@ [ 0] = 0 ! byte; Последовательное размещение однотипных составляющих в памяти (размеры которых могут различаться). Может задаваться количество элементов, общий размер массива, или стоп-условие.
Сырые данные raw[@.S] Неинтерпретируемые данные, отображаются как Ьех-дамп
Выравнивание align 16 at &@; Пропуск неиспользуемых данных для выхода на кратное заданному значению смещение относительно базового адреса
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
Указатель ATTable near=DWORD, ref=@:Base+@; Использует значение базового типа, для задания адреса (для файлов -смещения от начала) данных указанного типа в памяти.
Предварительное объявление Forward Используется при циклических зависимостях между типами данных
Машинные команды codes of TOpPDP ?(@.Op >=TWOpCode.br)and. ; Используется для дизассемблирования машинных команд
Помимо рассмотренных конструкторов типов данных вызов типа с подстановкой фактических параметров на место формальных рассматривается как специальный конструктор типа и может сопровождаться своими блоками дополнительной информации, например, блоком отображения. Синтаксически вызов типа отличается от ссылки на тип по наличию круглых скобок после его имени (даже когда у типа нет параметров). При вызове типа параметры могут указываться либо позиционно, либо по имени (как при вызове методов интерфейсов СОМ). Таким образом, часть параметров вызова типа может задаваться при его определении, а другая часть — в блоке утверждений. Все типы данных могут иметь как байтовое, так и битовое размещение, в зависимости от настроек блока типов. Кроме того, при определении нового типа учитывается установленный порядок байтов. Порядок байтов влияет на вновь определяемые типы, но не на их вызовы. В большинстве форматов используется конкретный порядок байтов, поэтому его достаточно установить один раз в начале спецификации, если это — MSB, a LSB не требует и этих действий, т.к. он установлен по умолчанию. Существуют такие форматы, как TIFF, где порядок байтов выбирается для всего файла в зависимости от его сигнатуры. Однако пример формата Shape показывает, что существуют и форматы со смешенным использованием разных порядков байтов.
3.6 Блоки определений
Программа на FlexT состоит из нескольких видов блоков определений, в которых определения разделяются переводом строки. Основные блоки определений:
1) Блок констант ‘const’ ni
‘=’ ‘;’, ni>* В выражениях для вычисления значений констант могут использоваться переменные из блока данных, поэтому значения некоторые из констант могут быть динамическими, т.е. зависящими от обрабатываемых данных.
, ni>* содержит определения типов. Признак bit указывает на то, что все определяемые в этом блоке типы будут иметь битовое, а не байтовое размещение.
[‘;’] , ni>* содержит определения переменных описываемого формата. задаёт адрес переменной в гдавном адресном пространстве, если имя блока не указано, или смещение в блоке памяти . Так же, как и при определении констант, выражение для адреса может содержать обращения к другим переменным, так что адрес переменной может определяться динамически. должно задавать тип без свободных параметров, т.е. должны быть определены все свойства базового конструктора этого типа и типов его составляющих, если таковые имеются. После выражения для адреса можно ставить признак его окончания ‘;’■ Это необходимо делать лишь в том случае, если начало может быть воспринято, как продолжение выражения.
содержит начальные адреса и названия частей кода в блоке памяти или в главном адресном пространстве, если имя блока не указано. При указании имени типа кода память, начиная с указанных точек входа, разбирается в соответствии с этим типом данных. Тип кода должен быть задан конструктором CODES и быть полностью
определённым, при этом он описывает кодирование машинных инструкций и признаки команд, завершающих код (таких как RET или JMP). Если тип кода не задан, то используется код процессоров Intel 80×86.
Специальное имя ‘ — ‘ означает, что указанный адрес задаёт не начало, а конец части кода. Эта возможность оказывается полезной в тех случаях, когда дизассемблер не может самостоятельно правильно определить окончание последовательности команд. Это может произойти, например, в следующем случае: CALL Terminate
Здесь процедура Terminate всегда вызывает функцию API для завершения работы программы.
3.7 Условная компиляция
Для описания форматов данных, которые могут иметь вариации, зависящие от версии формата или других его особенностей удобно использовать условную компиляцию. В условиях для выбора вариантов кода могут использоваться выражения, зависящие от обрабатываемых данных, поэтому версии структур данных автоматически определяются по уже прочитанным переменным. Этот механизм является очень эффективным при использовании спецификаций на FlexT для описания сложных форматов с долгой историей. Он не увеличивает сложность структур данных интерпретатора в отличие от использования вариантных типов данных. Однако, если в спецификации используется условная компиляция, то её очень неудобно обрабатывать в отсутствии примера данных. Таким образом, роль условной компиляции для FlexT можно сравнить с ролью препроцессора для языка С: позволяет получить эффективный конечный результат, но усложняет анализ кода. Для описания большинства форматов данных условная компиляция не требуется, но в некоторых случаях её нечем заменить. Возможно, что для получения универсального кода чтения данных по спецификации, содержащей условную компиляцию, должны быть разработаны более сложные алгоритмы трансляции, добавляющие вариантные элементы в структуры данных и модифицирующие выражения со ссылками на такие вариантные составляющие.
Ident:Size TEHdr Hdr
%$IF Hdr.e machine=TEMachine. EM _3S( ;
include elf 3 8 6.rfi
%$ELSIF Hdr.e machine=TEMachine EM SPARC;
%$ELSIF Hdr.e machine=TEMachine EM M32 ;
include elf M32.rfi
%$ELSIF Hdr.e machine=TEMachine EM PPC;
include elf ppc.rfi
TE Machine Flags EWord
Рис. 1. Пример использования условной компиляции
Fig. 1. An example of usage of conditional compilation
На врезке приведён пример использования условной компиляции (выдержка из описания формата ELF — загрузочных и объектных модулей Unix). Здесь в зависимости от типа процессора подключается соответствующая спецификация перечислимого типа TE_R_TYPE и множества TE_Machine_Flags, используемых в описании таблицы перемещений.
3.8 Алгоритм работы интерпретатора
Процесс разбора содержимого бинарного файла по спецификации интерпретатором FlexT состоит из следующих шагов:
1) Отображение (file mapping) бинарного файла в память.
2) Чтение спецификации, в ходе которого создаются объявленные в блоках data переменные и запоминаются адреса кода из блоков code (создаются части кода с нулевой длиной). Ранее объявленные переменные могут использоваться в зависящих от данных выражениях спецификации. Если в этих выражениях используется разыменование указателей, то на процесс чтения могут влиять и отличные от объявленных переменных элементы данных, доступные через эти указатели.
3) Обход элементов данных в поисках указателей. Выполняется только для элементов данных тех типов, в состав которых указатели входят. При обнаружении указателя создаётся переменная того типа, на который ссылается этот указатель, если такая переменная не была
создана раньше. После этого выполняется обход составляющих новой переменной. Кроме того, если структуры данных содержат указатели на код, то обнаруженные адреса добавляются в список частей кода.
4) Статическое дизассемблирование кода. Для каждой ещё не обработанной части кода выполняется обход её команд. Обход заканчивается по достижении, либо команды с выполненным стоп-условием (например, ret или jmp), либо следующей части кода. При обходе команды проверяются на наличие переходов и ссылок на данные. Для обнаруженных переходов (ссылок на код) также создаются новые части кода, если они не попадают внутрь существующих, иначе существующая часть кода разбивается на две. В результате формируется список частей кода, каждая из которых содержит непрерывную последовательность команд без внутренних точек входа.
5) Вывод результатов. Выполняется обход с распечаткой содержимого обнаруженных переменных и частей кода в порядке их адресов. Оставшиеся неразобранными блоки памяти между последовательными переменными и частями кода распечатываются в виде шестнадцатеричного дампа (при желании отображение этих фрагментов памяти можно отключить).
4. Использование спецификаций для анализа машинного кода
В предшествующих главах уже упоминались типы данных и шаги алгоритма разбора, предназначенные для работы с машинными командами. Рассмотрим эти возможности языка FlexT в одном месте и более подробно. Машинные команды используются не только для файлов с исполняемым кодом для реальных процессоров (таких, как Intel 80×86, ARM), но и для виртуальных машин (Java VM, .NET MSIL). Кроме того, некоторые форматы, например, шрифты TTF или файлы инсталляторов, могут содержать байт-код для бинарного представления используемых там сценариев. Таким образом, исследование файлов многих форматов будет неполным без отображения содержащихся там машинных инструкций.
В большинстве случаев представление машинной команды состоит из постоянной части, задающей вид команды и переменной части, задающей её аргументы, если таковые имеются. В качестве описания постоянной части для байт-кодов виртуальных машин, как правило, достаточно использовать перечислимый тип данных, поскольку там просто содержится целочисленный код команды (формат TTF является исключением из этого правила), при этом переменную часть удобно описать при помощи вариантного типа по коду команды.
Для машинных команд реальных процессоров используется более плотное кодирование, поэтому в постоянной части для некоторых команд выделяются битовые поля, содержащие часть аргументов, например, номера регистров. Будем называть сочетания таких полей с кодом инструкции термами. Описать кодирование термов можно было бы при помощи типа данных «проверка» и ряда вспомогательных битовых типов, но такое описание будет очень громоздким и неэффективным (при попытке сделать это на практике терпения хватило лишь на описание десятка команд). Поэтому, под влиянием проекта [25] [26] в язык FlexT включён специальный тип данных «перечисление термов». В определении такого типа сначала задаётся список всех битовых полей, применяемых для кодирования команд (каждое поле характеризуется битовыми смещением, размером и типом), а затем описываются сами термы с указанием того, какие из этих полей они используют. Вместе с термом указывается его база — число, задающее значения не входящих в поля битов. В записи базы терма допускается использовать подчерки для обозначения переменной части — битов, входящих в состав полей (такая маска проверяется на соответствие упоминаемым в терме полям). В реализации типа данных «перечисление термов» используется дерево решений, позволяющее быстро найти терм по его коду. В выражениях можно обращаться к любым полям перечисления термов, как к полям записи, однако, если у выбранного терма это поле не используется, то такое обращение вызывает ошибку вычисления этой части выражения.
Если системы команд RISC-процессоров состоят только из постоянной части, то для описания команд CISC-процессоров требуется задавать кодирование переменной части в зависимости от терма, выбранного в перечислении термов. Для этих целей реализована разновидность типа данных «вариант» с выбором содержимого по значению перечисления термов. В определении такого типа база терма в списке выбора обозначает все соответствующие этому терму значения постоянной части. Для выбора варианта в этом случае также строится дерево решений, но лишь по тем термам, которые упоминаются в определении типа.
После описания кодирования отдельной команды необходимо определить кодовый тип. В интерпретаторе FlexT кодовый тип реализуется на базе массива со стоп-условием и записывается аналогичным образом, за исключением использования идентификатора codes вместо array. При этом стоп-условие используется для выделения команд, завершающих последовательность, например, команд безусловного перехода или выхода из процедуры. В описаниях команд, вызывающих переход, должны использоваться указатели на определяемый кодовый тип, которые будут отслеживаться дизассемблером для обнаружения других частей кода. Кроме того, у типа команд может быть определено, как в приведённом примере, вычисляемое свойство iscaii, которое в этом случае используется дизассемблером для различения команд перехода и вызовов процедур (влияет на префиксы генерируемых меток).
type bit TBit num+(1) TBit2 num+ (2)
TRN enum TBit4 (R0,R1. R12 , SP , LR, PC)
TShiftOp enum TBit2 (SHL,SHR,ASR,ROR) TBrOfs2 4 ATOpARMSeq NIL- =TsBit24 REF=
TARMOpCode enum TBit32 fields (
Cond: TCond 028.4, //Op.execution condition Rn: TRN 016.4, //Source register Rd: TRN 012.4, //Destination register Shift: TShiftOp 05.2,
SM: TBit 020.1 ) of (
//Data processing rotate right with extend _DPRRX(cond,ArOp,S,Rn,Rd,Rm) =
Ob_00 0_I___I__0 0 001 0110__,
//Move status register to register MSR(cond,R,Rd) =
Ob_0001I0_001111I__00 001 000 000 00,
//Branch and Branch with link Branch(cond,BL,BrOfs) =
//Software interrupts SWI(cond,SWIOfs) =
TCond.AL)) exc 0 );:let isCall=((0.BL=1) exc 0); TOpARMSeq codes of TARMOpCode ?0:isStop;:
displ=(‘(‘, ShowArray(0,(NL,HEX(£0,4),’: ‘, 0) ) ,NL, ‘) ‘ )
Pue. 2. Фрагменты спецификации кодирования команд процессора ARM
Fig. 2. Excerpts from the instruction encoding spécification of the ARMprocessor
На врезке приведены фрагменты спецификации кодирования команд процессора ARM. Многоточием обозначены пропущенные фрагменты, аналогичные оставшимся соседним. Сначала определяются битовые типы данных, используемых в командах полей, включая перечислимые типы для декодирования значений тех из этих полей, которые задают регистры, конкретные операции из семейства однотипных, условия перехода и т.д. Также на базе типа 24-битных знаковых чисел определяется тип указателя TBrOfs2 4, используемый в командах перехода. В выражении для вычислении адреса, на который ссылается указатель, в качестве базы используется адрес владельца
(s (@ : @)), т.е. перечисления термов, в состав которого входит указатель. Далее определяются перечисление термов TARMOpCode, описывающее кодирование отдельной команды и кодовый тип данных TOpARMSeq на базе этих команд. Описания кодирования машинных команд позволяют использовать разработанные инструменты анализа бинарных файлов для новых процессоров. Использование описаний кодирования машинных команд, унифицированных с описаниями остальных типов данных, позволяет применять для исследования команд все средства, разработанные для анализа данных. Например, можно воспользоваться механизмами поиска структур данных для обнаружения фрагментов кода заданного вида и получения отчёта по найденным адресам. Имеется опыт применения этого подхода для получения описаний типов данных интерпретатора посредством поиска всех вызовов процедуры регистрации типа в коде исполняемого файла интерпретатора. В некоторых случаях непосредственные аргументы команд могут интерпретироваться, как указатели, что позволяет выделять в памяти соответствующие переменные. С использованием блока отображения для типа данных команды можно при необходимости довести способ отображения команды до принятого в дизассемблерах, а можно добавить вывод дополнительных сведений о её свойствах или составляющих.
С другой стороны, во многих исполняемых файлах присутствуют структуры данных, например RTTI или таблицы виртуальных методов, содержащие адреса кода. Описание таких элементов данных на FlexT как указателей на код позволяет обнаружить этот код и пометить его как относящийся к определённым данным, что существенно облегчает дальнейшее понимание программы.
5. Применение основанных на FlexT инструментов для анализа бинарных файлов
Для работы с бинарными данными реализован ряд инструментов, основанных на использовании написанных на FlexT спецификаций: BinView, BinExpl, ExeXpl, а также Web-приложение, доступное по ссылке [27]. Консольная программа BinView позволяет получить результат разбора бинарного файла в одном из текстовых форматов: просто текст, HTML, RTF, TeX. Формат обрабатываемого файла определяется автоматически по его расширению и содержимому. Для автоматического поиска спецификации формата используется следующая логика: проверяется файл с именем . rfh, если таковой имеется в текущем каталоге или в каталоге библиотеки спецификаций. Далее проверяются все описания форматов, сопоставленные расширению в файле ref.cfg из библиотечного каталога. Для проверки соответствия обрабатываемого файла некоторой спецификации используются блоки утверждений assert из файла спецификации: заданные в этих блоках логические выражения оцениваются сразу после чтения и, если они
оказываются ложными или ошибочными, то попытка применить спецификацию прекращается. Таким образом, если, например, блок утверждения находится сразу после объявления переменной для сигнатуры файла и значение этой переменной не соответствует ожидаемому, то на этом чтение спецификации заканчивается. В результате выбирается первая спецификация, для которой все утверждения выполняются. После чтения спецификации формата выполняется поиск дополнительной спецификации структур данных обрабатываемого файла, которая может находиться в файле .ге:£. Таким образом, при необходимости можно описать структуры данных, обнаруженные в конкретном файле, но не отражённые в общей спецификации формата.
Сгенерированный программой BinView листинг может оказаться очень большим. В результате, например, браузер будет очень долго открывать полученный HTML файл. Программа BinExpl служит для интерактивного отображения результатов разбора бинарных файлов, по тем же спецификациям, что и BinView. При этом динамически генерируются фрагменты листинга, что позволяет просматривать содержимое очень больших файлов (основное ограничение на размер: файл должен целиком помещаться в 32-разрядное пространство адресов при использовании FileMapping).
iöi Binary file expiorer — E:\PRG\Java\ExprTree\ExprTreeZ.cl3ss — □ X
| File Show Refs Aux Help
descr index:■LExprTree2;1; index:0000)т л|
1: (srait pc:0000; len:000£; neilje index: «V» (001B); descr index: ■ LExprltem; ■ ;
3: (accessflags:[ACC_PUBLIC,ACC_STATIC]; naraeNdx:■main’;
info: (max stack: ооф; max locals: 0003; CodeLen: 00000031; code: (
0000 newiBB> ‘java/awt/Frame’
0004 ldc (Tag:С String; info:’Test expression editor»>
0006 invokespecial 1 ‘
00 OA newiBB> ‘ExprTree21
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
00 OE invokespecial ‘iinit^ v
Рис. 3. Окно программы BinExpl при разборе файпа класса Java
Fig. 3. The main form of the program BinExpl when parsing a Java class file
Программа ExeXpl служит для интерактивного исследования исполняемых файлов Windows. При этом спецификации на FlexT используются для описания структур данных исследуемых программ и, в том числе, структур данных, характерных для конкретного компилятора (RTTI, таблиц виртуальных методов, обработчиков ошибок и т.д.). В ходе изучения программы пользователь может добавлять в спецификацию наименования для
исследованных частей кода, что облегчает понимание тех фрагментов кода, которые используют уже описанные. Т.к. код выделяется по результатам статического анализа, не могут быть автоматически обнаружены, например, фрагменты, на которые ссылаются таблицы перехода, сгенерированные для операторов выбора (switch/case). Но такие таблицы могут быть описаны, как содержащие указатели на код структуры данных, что позволяет обнаружить оставшиеся неразобранными фрагменты кода.
С использованием спецификаций на FlexT реализован ряд механизмов поиска, которые невозможно выполнить другим способом: поиск структур данных, генерация кода по сценариям поиска данных, поиск элементов данных в файлах.
Поиск структур данных позволяет обнаружить фрагменты памяти, соответствующие заданному условию на выбранный пользователем тип данных. В ходе такого поиска алгоритм проверяет каждый адрес на возможность разместить в этом месте указанную структуру данных так, чтобы она отвечала заданному критерию, например, условию корректности assert искомого типа данных. Таким образом можно, например, найти все таблицы виртуальных методов классов. Этот процесс поиска можно оформить в виде сценария генерации отчётов об обнаруженных структурах данных. Для применения таких сценариев необходимо подключить к спецификации модули с определениями используемых при поиске типов данных, после чего в процессе поиска будет сформирован текстовый отчёт обо всех обнаруженных адресах в заданной в сценарии поиска форме (для этого применяется синтаксис блоков отображения типов). Этот механизм может использоваться для генерации фрагмента спецификации с описаниями найденных данных, например, на базе информации о генерируемых конкретным компилятором структурах данных. Также приходилось использовать этот механизм для получения информации о реализованных в интерпретаторе языка сценариев классах с информацией об их членах.
Механизм поиска элементов данных в файлах позволяет найти среди файлов с указанным расширением те, которые содержат данные указанного типа, отвечающие заданному условию. Здесь поиск идёт не по всей памяти, а среди составляющих переменных, найденных в файле при помощи спецификации. Этот механизма позволяет, например, найти метафайлы, в которых содержатся команды рисования окружности определённого размера.
В данной работе рассмотрен язык спецификации интерпретации данных FlexT, который позволяет описывать достаточно широкий набор форматов данных при помощи простых синтаксических конструкций, являющихся расширением характерного для традиционных процедурных языков программирования набора конструкторов типов данных. Возможно также его использование для
спецификации кодирования машинных команд. Реализованный интерпретатор использует спецификации для идентификации типов данных. На языке FlexT с различной степенью завершённости было описано около сотни форматов данных, в том числе, исполняемых и объектных файлов, содержащих программный код. Приведём расширения некоторых из этих форматов: EXE (MZ,NE,LE), ELF, CLA, TPU, OBJ, Mach-o, TTF, HLP, SHP, DBF. Также конструкции языка использовались при декодировании различных программ и описании характерных для конкретных компиляторов форматов данных, например, RTTI Delphi и Visual Studio. Многие форматы удавалось описать практически с одного прохода, т.е. по мере чтения документации получалось сразу переводить содержащиеся там сведения в конструкции языка FlexT. При работе с описаниями форматов в редком из них не были обнаружены ошибки. Т.е. переход от описания для человека к описанию для машины, которое можно сразу же проверить на настоящих данных, приводит к существенному повышению достоверности информации, и в этом может состоять один из наиболее важных результатов применения рассматриваемого языка. Возможность интерпретации результатов разбора в качестве теста на соответствие спецификации и реальных данных, может применяться, как для проверки корректности данных по уже отлаженной спецификации, так и для проверки спецификации на соответствие примерам данных и, в том числе, для обратного проектирования недокументированных форматов. Наиболее существенным ограничением для текущей версии языка является невозможность полного описания таких форматов, при интерпретации которых необходимо строить сложные вспомогательные структуры данных, непосредственно не представленные в файле. Например, такая необходимость часто возникает при описании сжатых данных, при декомпрессии которых используется динамическое построение словарей (как LZW), дерева Хаффмана, моделей контекстов (РРМ) и других подобных структур. Более подробную информацию о языке FlexT можно найти по адресу [27].
[1]. Faase F.J. BFF: A grammar for Binary File Formats [Электронный ресурс] URL: http://www.iwriteiam.nl/Ha_BFF.html
[2]. Data Format Description Language (DFDL) [Электронный ресурс] URL: https://www.ogf.org/ogf/doku.php/standards/dfdl/dfdl
[3]. IBM Knowledge Center [Электронный ресурс] Data Format Description Language (DFDL) URL: http://www.ibm.com/support/knowledgecenter/SSMKIJH 10.0.0/com.ibm.etools.mft.do c/df20060_.htm
[4]. IBM Integration Bus [Электронный ресурс] URL: http://www-03.ibm.com/software/products/en/ibm-integration-bus/
[5]. Daffodil: Open Source DFDL [Электронный ресурс] URL: https://opensource.ncsa.illinois.edu/confluence/display/DFDL
[6]. IBM Knowledge Center [Электронный ресурс] Unsupported features URL: http://www.ibm.conVsupport/knowledgecenter/SSMKHH_10.0.0/com.ibm.etools.mft.do c/dfflO 150_.htm
[7]. WebLogic Integration 7.0 [Электронный ресурс] Building Format Definitions. URL: https://docs.oracle.com/cd/E13214_01/wli/docs70/diuser/fmtdef.htm
[8]. NetPDL Language Specification. http://www.nbee.org/doku.php?id=netpdl:index
[9]. BinPAC. https://www.bro.org/sphinx/components/binpac/README.html
[10]. The data description language EAST specification (CCSD0010). [Электронный ресурс] URL: http://mtc-ml6c.sid.inpe.br/col/sid.inpe.br/mtc-ml8@80/2009/07.21.13.31/doc/CCSDS%20644.0-B-2.pdf
[11]. Calder B.R., Masetti G. Huddler: a multi-language compiler for automatically generated format-specific data drivers. U.S. Hydrographic Conference (US HYDRO) 2015 Доступно по ссылке: http://www.hypack.com/ushydro/2015/papers/pdf/Calder_Huddler_for_automatic_data_ drivers.pdf
[12]. Georgia Tech Research Institute [Электронный ресурс] Digital Archives Research URL: http://perpos.gtri.gatech.edu/
[13]. Underwood W. Grammar-Based Specification and Parsing of Binary File Formats. The International Journal of Digital Curation Vol. 7, No. 1, 2012, pp. 95-106 Доступно no ссылке: http://www.ijdc.net/index.php/ijdc/article/viewFile/207/276
[14]. Parr T. ANTLR (ANother Tool for Language Recognition) [Электронный ресурс] URL: http://www.antlr.org/
[15]. Godmar Back. 2002. DataScript — A Specification and Scripting Language for Binary Data. In Proceedings of the 1st ACM SIGPLAN/SIGSOFT conference on Generative Programming and Component Engineering (GPCE ’02), Don S. Batory, Charles Consel, and Walid Taha (Eds.). Springer-Verlag, London, UK, UK, 66-77.
[16]. DataScript [Электронный ресурс] URL: http://datascript.sourceforge.net/
[17]. Binary data definition language [Электронный ресурс] URL: http ://www.binarydom.com/sdk/doc/bddl. shtml
[18]. Binopedia [Электронный ресурс] URL: http://binopedia.org/
[19]. Kaitai Struct [Электронный ресурс] URL: http://kaitai.io/
[20]. Synalyze It! [Электронный ресурс] URL: https://www.svnalvsis.net/
[21]. Hexinator [Электронный ресурс] URL: https://hexinator.com/hexinator-windows/
[22]. Synalyze It! [Электронный ресурс] The Grammar Page. https://www.synalysis.net/formats.xml
[23]. Дисков Б., Гатэг Дж. Использование абстракций и спецификаций при разработке программ: Пер. с англ. — М.:Мир, 1989.
[24]. Филд А., Харрисон П. Функциональное программирование: Пер. с англ. — М.:Мир, 1993
[25]. Ramsey N., Fernandez M.F. 1995. The New Jersey machine-code toolkit. In Proceedings of the USENIX 1995 Technical Conference Proceedings (TCON’95). USENIX Association, Berkeley, CA, USA, 24-24.
[26]. Ramsey N., Fernandez M.F. The New Jersey Machine-Code Toolkit [Электронный ресурс] URL: http://www.cs.tufts.edu/~nr/toolkit/
[27]. Хмельнов A.E. Главная страница по языку FlexT. http://hmelnov.icc.ru/FlexT/
A declarative language FlexT for analysis and documenting of binary data formats
A.Y. Hmelnov I.V. Bychkov A.A. Mikhailov Matrosov Institute for System Dynamics and Control Theory of the Siberian Branch of the Russian Academy of Sciences, 134, Lermontova St., Irkutsk, 664033, Russia
Abstract. The language FlexT (Flexible Types) is intended for specification of binary data formats. The language is declarative and designed to be well understood for human readers. Its main elements are the data type declarations, which look very much like the usual type declarations of the imperative programming languages, but are more flexible. In the article we first give a review of the capabilities of the modern projects oriented to specification of binary file formats. Then we consider the main features of the FlexT language and, in particular, the features that help to describe the formats of encoding of machine instructions. Finally we briefly describe the software developed, which is based upon the FlexT interpreter and some new capabilities of information search, which makes possible the use of the specifications.
Keywords: specifications of binary data formats, specification of encoding of machine instructions, declarative language, disassembler
For citation: A.Y. Hmelnov, I.V. Bychkov, A.A. Mikhailov. A declarative language FlexT for analysis and documenting of binary data formats. Trudy ISP RAN/Proc. ISP PAS, vol. 28, issue 5,2016. pp. 239-268 (in Russian). DOI: 10.15514/ISPRAS-2016-28(5)-15
[1]. Faase F.J. BFF: A grammar for Binary File Formats. http://www.iwriteiam.nl/Ha BFF.html
[2]. Data Format Description Language (DFDL). https://www.ogf.org/ogf/doku.php/standards/dfdl/dfdl
[3]. IBM Knowledge Center. Data Format Description Language (DFDL). http://www.ibm.eom/support/knowledgecenter/SSMKHH_10.0.0/com.ibm.etools.mft.do c/df20060_.htm
[4]. IBM Integration Bus. http://www-03.ibm.com/software/products/en/ibm-integration-bus/
[5]. Daffodil: Open Source DFDL. https://opensource.ncsa.illinois.edu/confluence/displav/DFDL
[6]. IBM Knowledge Center. Unsupported features. http://www.ibm.eom/support/knowledgecenter/SSMKHH_10.0.0/com.ibm.etools.mft.do c/df00150 .htm
[7]. WebLogic Integration 7.0. Building Format Definitions. https://docs.oracle.com/cd/E13214_01/wli/docs70/diuser/fmtdef.htm
[8]. NetPDL Language Specification. http://www.nbee.org/doku.php?id=netpdl:index
[9]. BinPAC. https://www.bro.org/sphinx/components/binpac/README.html
[10]. The data description language EAST specification (CCSD0010). http://mtc-ml 6c. sid.inpe.br/col/sid.inpe.br/mtc-ml 8@80/2009/07.21.13.3 l/doc/CCSDS%20644.0-B-2.pdf
[11]. Calder B.R., Masetti G. Huddler: a multi-language compiler for automatically generated format-specific data drivers. U.S. Hydrographic Conference (US HYDRO) 2015 Available at URL: http://www.hypack.com/ushydro/2015/papers/pdf/Calder_Huddler_for_automatic_data_ drivers.pdf
[12]. Georgia Tech Research Institute. Digital Archives Research, http://perpos.gtri.gatech.edu/
[13]. Underwood W. Grammar-Based Specification and Parsing of Binary File Formats. The International Journal of Digital Curation Vol. 7, No. 1, 2012, pp. 95-106 Available at URL: http://www.ijdc.net/index.php/ijdc/article/viewFile/207/276
[14]. Parr T. ANTLR (ANother Tool for Language Recognition), http://www.antlr.org/
[15]. Godmar Back. 2002. DataScript — A Specification and Scripting Language for Binary Data. In Proceedings of the 1st ACM SIGPLAN/SIGSOFT conference on Generative Programming and Component Engineering (GPCE ’02), Don S. Batory, Charles Consel, and Walid Taha (Eds.). Springer-Verlag, London, UK, UK, 66-77.
[16]. DataScript. http://datascript.sourceforge.net/
[17]. Binary data definition language, http://www.binarydom.com/sdk/doc/bddl.shtml
[18]. Binopedia. http://binopedia.org/
[19]. Kaitai Struct, http://kaitai.io/
[20]. Synalyze It!. https://www.svnalvsis.net/
[21]. Hexinator. https://hexinator.com/hexinator-windows/
[22]. Synalyze It! The Grammar Page, https://www.synalysis.net/formats.xml
[23]. B. Liskov, J. Guttag, Abstraction and Specification in Program Development, The MIT Press, 1986.
[24]. Field A.J., Harrison P.G. Functional Programming, Addison-Wesley, Wokingham, UK, 1988
[25]. Ramsey N., Fernandez M.F. 1995. The New Jersey machine-code toolkit. In Proceedings of the USENIX 1995 Technical Conference Proceedings (TCON’95). USENIX Association, Berkeley, CA, USA, 24-24.
Информация Банка России от 30 октября 2017 г. «Состав, форматы и структура электронных документов, предусмотренных Указанием Банка России от 15 июля 2015 года N 3733-У «О порядке представления уполномоченным банком сведений в единую информационную систему государственного оборонного заказа»
Уполномоченные банки передают в Минобороны России (далее — МО РФ) электронные сообщения, содержащие сведения об операциях, осуществленных в предшествующий рабочий день, определяемый в порядке, установленном трудовым законодательством Российской Федерации, и (или) осуществленных в выходной и нерабочий праздничный день (далее — обрабатываемый период), и (или) содержащие сведения об исправленных и (или) корректирующих операциях (далее при совместном упоминании — сообщения обмена), ежедневно по рабочим дням. При наличии у уполномоченного банка технической возможности передача сообщений обмена, может осуществляться в выходные и нерабочие праздничные дни. Совокупность всех сообщений обмена, подлежащих передаче в рамках одного сеанса обмена, называется пакетом данных.
1. Уполномоченный банк формирует контейнеры данных:
I. Уполномоченный банк формирует в установленном формате сообщения обмена, содержащие структурированные сведения о следующих операциях:
— Об открытии, о закрытии, об изменении реквизитов отдельных счетов;
— Об исполненных распоряжениях по отдельным счетам;
II. Признаком группировки операций в сообщение обмена служит идентификатор государственного контракта, в рамках выполнения которого осуществлялись операции, сведения о которых включены в сообщение обмена (далее — идентификатор государственного контракта), т.е. одно сообщение обмена включает в себя все операции по всем отдельным счетам, открытым в рамках контрактов, заключенных для выполнения соответствующего государственного оборонного заказа (далее — контракты по ГОЗ). Сообщение обмена содержит только данные обрабатываемого периода. К сообщению обмена прикладываются сформированные в установленном формате файловые вложения в виде скан-образов документов, подтверждающих открытие, закрытие, изменение реквизитов отдельных счётов, исполнение распоряжений. Сведения о файловых вложениях включаются в сообщение обмена.
III. Каждое сообщение обмена и прилагаемые к нему файловые вложения помещаются в отдельный архив zip (без сжатия) (далее — контейнер). Каждое сообщение обмена подписывается электронной подписью, которая помещается в файл data.sign, который включается в состав контейнера.
IV. Результатом этапа формирования сообщений обмена является набор контейнеров (zip-архивов), каждый из которых содержит сообщения обмена по контрактам по ГОЗ, заключенным в рамках одного государственного контракта, и прилагаемых к нему файловых вложений. Дополнительно к пакету данных формируется контрольный файл control.xml, содержащий контрольные сведения обо всех контейнерах пакета данных (контрольный файл подписывается в порядке, аналогичном установленному для сообщения обмена, и включается вместе с ним в zip-архив без сжатия control.zip).
2. Контейнеры передаются в единую информационную систему государственного оборонного заказа (информационный контур МО РФ) либо автоматически путём межсистемного взаимодействия (SOAP-интерфейс и SFTP-ресурс), либо вручную на отчуждаемом информационном носителе, в соответствии с пунктами 3 и 4 Указания Банка России от 15.07.2015 N 3733-У «О порядке представления уполномоченным банком сведений в единую информационную систему государственного оборонного заказа».
3. По окончании приёма и обработки пакета данных МО РФ формирует в установленном формате файл-ответ (файл-ответ подписывается в порядке, аналогичном установленному для сообщения обмена, и включается вместе с ним в zip-архив без сжатия), содержащий статус обработки каждого переданного контейнера и статус обработки каждого сообщения обмена. Файл-ответ передаётся в уполномоченный банк автоматически, путём межсистемного взаимодействия.
4. В случае получения уполномоченным банком файла-ответа о непринятии одного или нескольких контейнеров либо пакета данных целиком, уполномоченный банк устраняет причину непринятия контейнера (контейнеров), вновь формирует контейнер (контейнеры) и направляет его (их) в МО РФ.
До устранения уполномоченным банком причин непринятия контейнера, содержащего информацию за обрабатываемый период, и получения от МО РФ файла-ответа о его принятии, контейнеры, содержащие информацию по соответствующему государственному контракту, сформированные уполномоченным банком за период, следующий за обрабатываемым периодом, независимо от наличия или отсутствия в них ошибок МО РФ не принимаются.
Передача файловых вложений
Файловые вложения составляют основную часть информационного потока, передаваемого в МО РФ. Для сокращения продолжительности сеансов обмена, а также для оптимизации использования канала связи передача уполномоченным банком файловых вложений может*(1) осуществляться следующим образом:
1. При первой передаче файлового вложения уполномоченный банк присваивает такому вложению его уникальный идентификатор и включает информацию о таком идентификаторе в сообщение обмена.
2. При получении от МО РФ файла-ответа об успешном принятии контейнера, все включенные в такой контейнер файловые вложения считаются принятыми МО РФ.
3. При необходимости повторной передачи файлового вложения (например, когда по отдельному счёту совершено несколько операций на основании одного и того же комплекта документов, являющихся основанием для составления распоряжений), передаётся только его уникальный идентификатор, что считается выполнением уполномоченным банком требований статьи 8.2 Федерального закона N 275-ФЗ*(2) (при условии принятия МО РФ ранее направленного уполномоченным банком контейнера, содержащего соответствующие файловые вложения).
В связи с самостоятельным обнаружением в ранее направленных сведениях об операции ошибки, которая подлежит исправлению, или ошибки, требующей корректировки сведений об операции, в том числе аннулирования операции, уполномоченным банком могут направляться в МО РФ сведения о корректирующих операциях.
Целью предусмотренных форматом механизмов версионирования исправленных (скорректированных) операций является получение следующих сведений:
— Факт корректировки и её дата;
— Номер корректирующей операции (в случае осуществления новой операции, влекущей корректировку исходной операции);
— Конечное состояние исходной операции после исправления либо корректировки.
В сообщение обмена всегда включается актуальная информация об операции с учётом всех исправлений и корректировок. Для связи с исходной операцией используются поля OpUID (идентификатор текущей операции), CorrectedOpUID (идентификатор корректируемой (исходной) операции, совпадает с OpUID в случае исправления данных) и CorrectionDate (дата последнего исправления (корректировки), совпадает с датой текущей операции, в случае корректировки данных). Эти элементы присутствуют в сообщениях обмена, содержащих сведения обо всех операциях, версионирование которых необходимо обеспечить.
В случае удаления исходной операции в соответствующем корректирующем сообщении обмена указывается нулевая сумма операции.
Примеры операций исправления и корректировки
Банк сообщил об операции перевода между отдельными счетами (первая операция по счету, дата — 01.09.2015, сумма — 100 руб.). В МО будет передан элемент данных, описанный в разделе «9. Перевод между отдельными счетами», со следующими значениями атрибутов*(3):
03.09.2015 банк скорректировал сумму операции до 80 руб. В зависимости от используемого в банке способа корректировки, возможны следующие операции:
— Банк исправил непосредственно исходное сообщение обмена (без использования дополнительных документов корректировки). В МО РФ должен быть предоставлен элемент данных «9. Перевод между отдельными счетами», со следующими значениями атрибутов:
— CorrectionDate: 03.09.2015 (с указанием времени)
— Банк создал корректирующую операцию N 2, на сумму -20 руб. В МО РФ должен быть предоставлен элемент данных «9. Перевод между отдельными счетами», со следующими значениями атрибутов:
— CorrectionDate: 03.09.2015 (с указанием времени)
— Банк создал сторнирующую операцию N 2, и операцию N 3 на корректную сумму. В МО РФ должны быть предоставлены два элемента данных «9. Перевод между отдельными счетами», со следующими значениями атрибутов:
— CorrectionDate: 03.09.2015 (с указанием времени)
— CorrectionDate: 03.09.2015 (с указанием времени)
Для обеспечения корректной последовательности обработки нескольких корректировок одной и той же исходной операции, передаваемых в одном сообщении обмена, атрибут «CorrectionDate» обязательно должен содержать время корректировки.
Подписание сообщения обмена электронной подписью
Каждое сообщение обмена, направляемое уполномоченным банком в МО РФ, каждый файл-ответ МО РФ, направляемый в уполномоченный банк, подписывается электронной подписью (далее — ЭП) с помощью средства криптографической защиты информации (далее — СКЗИ) «КриптоПро CSP» версии 3.6 и выше. Используется detached подпись, функция хеширования 1.2.643.2.2.9 (Функция хэширования ГОСТ Р34.11-94), алгоритм подписи 1.2.643.2.2.19 (алгоритм ГОСТ Р34.10-2001, используемый при экспорте/импорте ключей), без атрибутов подписи.
Результат подписания сохраняется в бинарный файл по форме СAdES-BES. Для совместимости содержимого подписи и XML-формата, применяется Base64-кодирование, с использованием URL-safe таблицы кодирования. При формировании ЭП использование меток времени не требуется. Сертификат X.509, содержащий закрытый ключ для подписания, а также сервисы TSP и OCSP, предоставляются удостоверяющим центром МО РФ (http://uc.mil.ru/tsp/tsp.srf, http://uc.mil.ru/ocsp/ocsp.srf).
Формат данных, передаваемых в МО РФ
Сообщения обмена формируются в формате XML, кодировка UTF-8. Сведения об операциях группируются по номеру государственного контракта и включаются в сообщение обмена , которое записывается в файл data.xml.
Файловым вложениям, прилагаемым к сообщению обмена и относящимся к операциям, сведения о которых включены в сообщение, уполномоченным банком присваивается порядковый номер. Допустимые форматы файловых вложений (скан-копий): jpg, pdf, tiff, pcx, png; разрешение от 200 до 600 dpi.
Контейнеру, сформированному из сообщения обмена и файловых вложений, уполномоченным банком присваивается порядковый номер с префиксом data_.
Порядок присвоения порядковых номеров файловым вложениям и контейнерам определяется уполномоченным банком самостоятельно.
Контрольные сведения обо всех контейнерах пакета данных включаются в файл control.xml.
Контейнер data_x.zip, x[0; n]
Вложение scan_x.jpg, x[0; n]
Файл подтверждения control.zip
Нотация обязательности и множественности атрибутов
Атрибуты элементов данных могут быть простыми (не содержать вложенных атрибутов) и составными (иметь вложенные атрибуты). Все простые атрибуты являются предписанными, т.е. их теги должны присутствовать в файле обмена независимо от наличия или отсутствия значения атрибута. У пустых составных атрибутов предписанным является только головной тег, т.е. в случае отсутствия значения у составного атрибута, в файл обмена записывается пустой головной тег. Вложенные атрибуты непустых составных тегов (в части предписания атрибута) подчиняются логике атрибутов элементов данных.
Обязательность заполнения атрибута определяется исходя из следующих показателей таблиц описания элементов данных:
— Первая цифра определения множественности (колонка «Мн.»);
— Условия, описанного в колонке «Комментарий».
Первая цифра множественности
Атрибут является предписанным
Не имеет значения
Не имеет значения
Признак множественного показателя
Признак множественности атрибута определяется второй цифрой выражения множественности по следующим правилам:
Вторая цифра множественности
Атрибут указывается в элементе данных (либо составном атрибуте) один раз.
Атрибут указывается в элементе данных (либо составном атрибуте) один или несколько раз.
Структура сообщения обмена уполномоченного банка (файл data.xml)
Сообщение обмена состоит из разделов (элементов данных), каждый из которых представляет собой совокупность элементов (сведений), характеризующих соответствующий информационный блок. Разделы записываются в сообщение обмена в порядке, приведённом ниже. В случае если формирование сообщения обмена не обусловлено наличием конкретного информационного блока (в том числе в случае отсутствие события, с наличием которого связано включение соответствующего информационного блока в сообщение обмена) и (или) установленными форматами не предусмотрена обязательность заполнения раздела, то соответствующий раздел в сообщение обмена не включается.
В случае если при формировании одного раздела сообщения обмена необходимо сослаться на другой раздел, то используется сокращённое наименование соответствующего раздела (ссылочный тип), а также все включенные в него элементы (атрибуты). Ссылочные типы приведены в соответствующих разделах настоящего документа.
Формат не предусматривает отдельного типа сообщения обмена либо отдельного раздела в нем для государственного контракта. Все ссылки на государственный контракт в разделах настоящего документа (атрибуты с наименованием «GOZUID») подразумевают указание идентификатора государственного контракта (25 символов).
Все суммы, используемые в формате, указываются в копейках.
Сообщение подписывается согласно разделу «Подписание сообщения обмена электронной подписью». Подпись сохраняется в файл data.sign.
1. Служебная область
— Сведения о контейнере, условиях его формирования и передачи;
— Информация о периоде, за который сформированы сообщения обмена, включенные в контейнер;
— Идентификатор государственного контракта;
— Сведения об уполномоченном банке — отправителе сообщения обмена, включенного в контейнер;
— Технические сведения, необходимые для проверки неизменности (контейнер не был изменен при передаче) и аутентичности (контейнер передан именно из уполномоченного банка) контейнера.
Метаинформация о структуре сообщения
Уникальный идентификатор контейнера
Дата и время создания контейнера
По местному времени системы-отправителя, с указанием часового пояса.
Дата и время выгрузки контейнера из уполномоченного банка
Идентификатор государственного контракта
По местному времени системы-отправителя, с указанием часового пояса.
Информация об уполномоченном банке-отправителе сообщения обмена
Наименование уполномоченного банка
ИНН уполномоченного банка
КПП уполномоченного банка по месту его нахождения
Корреспондентский счет уполномоченного банка
2. Владелец отдельного счёта
Раздел содержит актуальные сведения обо всех владельцах отдельных счетов, операции по которым включены в контейнер.
Сведения о владельце отдельного счёта — участнике расчетов (исполнителе/головном исполнителе)
Сведения о контрагенте, участвующем в операциях, сведения о которых передаются в данном контейнере (владельцы счетов, получатели по счетам).
Уникальный идентификатор владельца отдельного счёта, присвоенный уполномоченным банком
Сокращенное наименование (если имеется)
Для индивидуального предпринимателя атрибут не заполняется.
Наименование на иностранном языке (если имеется)
Указывается значение по ОКОПФ. Заполняется при наличии у уполномоченного банка информации, в противном случае обязательно заполняется атрибут OPFName.
Организационно-правовая форма прописью
Не заполняется в случае заполнения атрибута OPF.
Указывается КПП по месту нахождения организации согласно свидетельству о постановке на учет в налоговом органе (свидетельству об учете в налоговом органе). При открытии счета обособленному подразделению организации указывается КПП по месту нахождения обособленного подразделения организации согласно уведомлению о постановке на учет в налоговом органе. Для иностранной организации атрибут может не заполняться. Для индивидуального предпринимателя атрибут не заполняется.
Указываются сведения о величине зарегистрированного и оплаченного уставного (складочного) капитала или величине уставного фонда имущества. Для индивидуального предпринимателя атрибут не заполняется.
Обязательно заполняется один из атрибутов. Указывается относительно адреса (места нахождения) юридического лица, внесенного в Единый государственный реестр юридических лиц, адреса места жительства (регистрации) или места пребывания физического лица — индивидуального предпринимателя.
Должность уполномоченного лица
Обязательно при наличии.
Заполняется при наличии сведений у уполномоченного банка.
Тип документа (идентификатор)
Указывается идентификатор согласно классификатору, установленному настоящим документом.
Указывается прописью, если атрибут Type согласно классификатору, установленному настоящим документом, принимает значение .
Если есть номер и серия, разделяются пробелом.
Атрибуты заполняются при наличии в документе соответствующих реквизитов.
Указывается адрес (место нахождения) юридического лица, внесенный в Единый государственный реестр юридических лиц, адрес места жительства (регистрации) или места пребывания физического лица. Иные адреса юридического лица или индивидуального предпринимателя указываются при наличии информации о них у уполномоченного банка.
Указывается идентификатор согласно классификатору, установленному настоящим документом.
Адрес всегда указывается текстовым представлением. В случае использования уполномоченным банком форматов КЛАДР или ФИАС, адрес дополнительно указывается в структурированном виде. В этом случае заполняются соответствующие атрибуты раздела. Поскольку адрес может не содержать части элементов унифицированного классификатора, часть атрибутов может остаться не заполненной.
Улица на доп. Территории
Заполняется при наличии сведений у уполномоченного банка.
Указывается идентификатор согласно классификатору, установленному настоящим документом
Указывается номер телефона, адрес электронной почты и тому подобное согласно идентификатору типа контактной информации
Сведения о выданной юридическому лицу или физическому лицу-индивидуальному предпринимателю лицензии на право осуществления деятельности, подлежащей лицензированию
Заполняется при наличии сведений у уполномоченного банка.
Дата выдачи лицензии
Вид лицензируемой деятельности
Код лицензируемой деятельности по ОКВЭД
3. Файловое вложение (элемент данных)
В раздел включается информация обо всех файловых вложениях (скан-образах документов, являющихся основанием для составления распоряжений, и иных документов), включенных в контейнер, а именно:
— Уникальный идентификатор вложения;
— Наименование файлового вложения в контейнере;
— Параметр, необходимый для проверки неизменности файлового вложения (контрольная сумма);
— Параметр, определяющий тип документа во вложении;
— Ссылка на владельца счета, предоставившего документ в уполномоченный банк.
Уникальный идентификатор вложения
Уникальный идентификатор вложения, присвоенный уполномоченным банком.
После первой отправки на уникальный идентификатор вложения можно ссылаться по id (см. раздел «передача файловых вложений»).
В случае предоставления файла в контейнере (при первичной передаче файла) — совпадает с наименованием файла в контейнере. В случае если файл был передан ранее, не заполняется.
Размер файла, байт.
Контрольная сумма (CRC32)
Контрольная сумма файла (алгоритм CRC32).
Тип документа во вложении
Указывается идентификатор согласно классификатору «Типы файловых вложений».
Заполняется, если атрибут DocType принимает значение < 0>(иной документ).
Идентификатор владельца счета, предоставившего документ в уполномоченный банк
4. Сведения о контракте по ГОЗ
Сведения о контракте по ГОЗ
Сведения предоставляются в случае наличия в обрабатываемом периоде операций по списанию денежных средств с отдельного счета на другой отдельный счет, совершенных в рамках соответствующего контракта по ГОЗ
Уникальный идентификатор контракта по ГОЗ, присвоенный уполномоченным банком
Необходим для обновления сведений о контракте в случае предоставления соисполнителем дополнительных соглашений.
Получатель (поставщик, подрядчик, исполнитель)
Идентификатор государственного контракта
Дата представления контракта в уполномоченный банк
Дата последнего изменения в контракт
Дата последнего предоставленного дополнительного соглашения. При отсутствии — совпадает с датой представления контракта в уполномоченный банк.
Текущая цена контракта (с учётом дополнительных соглашений).
Сумма аванса, предусмотренная условиями контракта
Указывается при наличии в контракте суммы аванса.
Согласованный размер прибыли по контракту
Указывается при наличии в контракте суммы согласованной прибыли (согласно статье 8.3 Федерального закона N 275-ФЗ).
Размер предварительно понесённых расходов за счёт собственных средств, указанный в контракте
Указывается при наличии в контракте суммы подобных расходов (согласно статье 8.3 Федерального закона N 275-ФЗ).
Скан-образы контракта и дополнительных соглашений
Предоставляются при наличии в уполномоченном банке.
Дата заключения контракта
5. Отдельный счёт
В раздел включаются сведения обо всех отдельных счетах, сведения об операциях по которым включены в контейнер.
Сведения об отдельном счёте передаются в случае наличия в обрабатываемом периоде операций по нему.
Идентификатор счёта, присвоенный уполномоченным банком
БИК уполномоченного банка (его филиала, иного подразделения), в котором открыт счёт
Передаются реквизиты уполномоченного банка (его филиала, иного подразделения), в котором открыт отдельный счёт. Для филиалов и иных подразделений уполномоченного банка указывается субкорреспондентский счет.
Дата открытия счёта
Дата закрытия счёта
Заполняется только для закрытых счетов.
Статус организации в рамках исполнения государственного контракта
1 — головной исполнитель;
Идентификатор государственного контракта
Сумма остатка на начало периода
Сумма остатка на счёте до осуществления операций, сведения о которых содержатся в сообщении обмена, включенном в контейнер (входящее сальдо).
Сумма остатка на конец периода
Сумма остатка на счёте после осуществления операций сведения о которых содержатся в сообщении обмена, включенном в контейнер (исходящее сальдо).
Сведения о филиале или ином подразделении уполномоченного банка, в котором открыт отдельный счет
Сведения предоставляются в случае осуществления операций филиалом или иным подразделением уполномоченного банка. Указываются наименование филиала или иного подразделения уполномоченного банка и код, присвоенный такому филиалу (подразделению) уполномоченным банком.
Код филиала или иного подразделения уполномоченного банка, в котором открыт отдельный счет, присвоенный уполномоченным банком
6. Акт приёма-передачи
Акт приема-передачи товаров (работ, услуг)
Передаются все акты приема-передачи товаров (работ, услуг), служащие основаниями для расчёта между головным исполнителем и исполнителем, между исполнителями.
Уникальный идентификатор акта приема-передачи товаров (работ, услуг), присвоенный уполномоченным банком
Получатель (поставщик, подрядчик, исполнитель)
Идентификатор государственного контракта
Контракт по ГОЗ, в рамках которого составлен акт приёма-передачи товаров (работ, услуг)
Номер акта приема-передачи товаров (работ, услуг)
Заполняется при наличии у уполномоченного банка сведений о номере и дате акта приема-передачи товаров (работ, услуг).
Дата акта приема-передачи товаров (работ, услуг)
Сумма по акту приема-передачи товаров (работ, услуг)
Скан-образы акта приёма-передачи товаров (работ, услуг)
7. Открытие отдельного счёта
Операция открытия отдельного счета
Указываются сведения обо всех открытых отдельных счетах в обрабатываемом периоде.
Идентификатор текущей операции, присвоенный уполномоченным банком
Идентификатор корректируемой (исходной) операции
Указывается в случае корректировки ранее переданных сведений об операции, при использовании уполномоченным банком транзакционной модели корректировок. В случае использования уполномоченным банком версионной модели — совпадает с полем OpUID.
Передаются документы, служащие основанием открытия отдельного счета. Договор банковского счета и карточка с образцами подписей и оттиска печати передаются всегда, иные документы — при наличии.
8. Изменение данных об отдельном счёте
В раздел включается информация об изменении сведений об отдельном счёте, а именно:
— Информация о закрытии отдельного счёта (в атрибуте Acc передаётся ссылка на счёт, содержащий дату закрытия. Атрибут AccPrev не заполняется);
— Информация об изменении сведений об отдельном счёте*(4) (в атрибуте Acc передаётся ссылка на уже изменённый элемент данных «Отдельный счёт» (раздел 5), в атрибуте AccPrev — на исходный, т.е. до изменения сведений о нем);
— Информация о замене или внесении изменений и исправлений в карточку с образцами подписей и оттиска печати (в атрибуте Acc указывается номер отдельного счета, к которому оформлена новая карточка либо в поля карточки внесены изменения и исправления, в атрибуте FileAttach — новая или измененная/исправленная карточка).
Информация об изменении сведений об отдельном счёте
Идентификатор текущей операции, присвоенный уполномоченным банком
Идентификатор корректируемой (исходной) операции
Указывается в случае корректировки ранее переданных сведений об операции, при использовании уполномоченным банком транзакционной модели корректировок. В случае использования уполномоченным банком версионной модели — совпадает с полем OpUID.
Ссылка на элемент, описывающий состояние счёта до внесения изменений
Указывается только при изменении реквизитов счёта.
Дата закрытия отдельного счета / изменения реквизитов отдельного счета
Передаются документы, служащие основанием изменения сведений об отдельном счёте. В случае замены или внесения изменений и исправлений в карточку с образцами подписей и оттиска печати, новая или исправленная карточка передается всегда.
В случае изменения реквизитов счета в связи с реорганизацией юридических лиц выписка из единого государственного реестра юридических лиц передается всегда.
Иные документы передаются при их наличии.
9. Перевод между отдельными счетами
Сведения о переводе между отдельными счетами передаются посредством информирования об операции плательщика. Информация об операции зачисления денежных средств на отдельный счёт получателя (в случае, когда средства были получены с другого отдельного счёта) в МО РФ не предоставляется.
Списание денежных средств с отдельного счета на другой отдельный счет
Указываются все операции по списанию денежных средств с отдельного счета на другой отдельный счет в обрабатываемом периоде.
Идентификатор текущей операции, присвоенный уполномоченным банком
Идентификатор корректируемой (исходной) операции
Указывается в случае корректировки (исправления) ранее переданных сведений об операции, при использовании уполномоченным банком транзакционной модели корректировок. В случае использования уполномоченным банком версионной модели — совпадает с полем OpUID.
Дата и время предоставляемой корректировки
Указывается в случае корректировки (исправления) ранее переданных сведений о переводе между отдельными счетами.
Отдельный счет плательщика
Отдельный счет получателя
Дата и время исполнения распоряжения
Идентификатор государственного контракта
Контракт по ГОЗ
Указывается в случае осуществления (либо возврата ранее полученного) авансового платежа.
Акт приёма-передачи товаров (работ, услуг), в рамках которого осуществляется перевод
Указывается в случае осуществления расчётов по актам приёма-передачи товаров (работ, услуг).
Передаются документы, служащие основанием перевода между отдельными счетами.
10. Зачисление денежных средств на отдельный счёт
Зачисление денежных средств на отдельный счёт
Указываются все операции по зачислению денежных средств на отдельный счет, за исключением осуществляемых в рамках перевода, предусмотренного разделом 9 настоящего документа.
Идентификатор текущей операции, присвоенный уполномоченным банком
Идентификатор корректируемой (исправленной) операции
Указывается в случае корректировки (исправления) ранее переданных сведений об операции, при использовании уполномоченным банком транзакционной модели корректировок.
В случае использования уполномоченным банком версионной модели — совпадает с полем OpUID.
Дата и время предоставляемой корректировки
Указывается в случае корректировки (исправления) ранее переданных сведений о зачислении денежных средств на отдельный счет.
Отдельный счет получателя денежных средств
Тип операции по зачислению денежных средств
Указывается идентификатор согласно установленному настоящим документом классификатору операций по зачислению денежных средств на отдельный счёт.
Атрибут заполняется при наличии сведений у уполномоченного банка.
Атрибут заполняется при наличии сведений у уполномоченного банка.
Номер счёта плательщика
Атрибут не заполняется, если перевод денежных средств осуществлялся посредством приема у плательщика — физического лица наличных денежных средств.
Наименование банка плательщика
Корреспондентский счёт банка плательщика
11. Списание денежных средств с отдельного счёта
Списание денежных средств с отдельного счета
Указываются все операции по списанию денежных средств с отдельного счета, за исключением перечисленных в разделе 9.
Идентификатор текущей операции, присвоенный уполномоченным банком
Идентификатор корректируемой (исходной) операции
Указывается в случае корректировки (исправления) ранее переданных сведений об операции, при использовании уполномоченным банком транзакционной модели корректировок.
В случае использования уполномоченным банком версионной модели — совпадает с полем OpUID.
Дата и время предоставляемой корректировки
Указывается в случае корректировки (исправления) ранее переданных сведений о списании денежных средств с отдельного счета.
Отдельный счет плательщика
Тип операции по списанию денежных средств
Указывается идентификатор согласно установленному настоящим документом классификатору операций по списанию денежных средств с отдельного счёта.
Дата и время исполнения распоряжения
Атрибуты передаются по всем операциям, кроме «Оплата труда работников предприятия».
Атрибут ИНН для физического лица может не заполняться.
Атрибут КПП для иностранной организации может не заполняться, для физического лица и индивидуального предпринимателя — не заполняется.
Атрибут Номер счета получателя может не заполняться в случаях выдачи наличных денежных средств, предусмотренных пунктом 9 статьи 8.4 Федерального закона N 275-ФЗ.
Номер счёта получателя
Наименование банка получателя
Корреспондентский счёт банка получателя
Передаётся только для платежей по налогам и сборам.
Идентификатор операции по перечислению налогов с ФОТ, присвоенный уполномоченным банком (для операций по списанию денежных средств на цели оплаты труда)
Указывается обязательно в случае перечисления денежных средств на цели оплаты труда.
Произвольная информация об операции
Не обязательно к заполнению.
Передаются документы, служащие основанием списания денежных средств с отдельного счета.
Структура контрольного файла control.xml
Контрольный файл подписывается в соответствии с разделом «Подписание сообщения обмена электронной подписью». Подпись помещается в файл control.sign. Файлы control.xml и control.sign помещаются в архив control.zip (без сжатия).
Уникальный идентификатор пакета данных
Назначается уполномоченным банком.
Информация о контейнерах данных
По количеству контейнеров в пакете.
Уникальный идентификатор контейнера
Размер файла в байтах.
Контрольная сумма (CRC32)
Контрольная сумма файла (алгоритм CRC32).
Список идентификаторов государственных контрактов, по которым операции в обрабатываемом периоде не осуществлялись
Описание обрабатываемого периода (совпадает с аналогичными полями в файле data.xml).
Идентификатор государственного контракта
Перечисленные в этом разделе типы используются только для указания ссылок на элементы данных из атрибутов иных элементов данных. Например, при формировании элемента данных «7. Открытие отдельного счёта», в его атрибуте «Acc» («Отдельный счёт») записывается не элемент данных «5. Отдельный счёт», а только ссылка, формат которой определён в настоящем разделе. При этом элемент данных, на который ссылаются атрибуты иных элементов данных посредством ссылочных типов, обязательно должен присутствовать выше в этом же сообщении обмена. В приведённом примере, в сообщение обмена должен быть включен элемент данных «5. Отдельный счёт», на который указывает ссылка из операции открытия счёта, причём сведения о счёте должны предшествовать сведениям об операции по этому счету.
1. Файловое вложение
Сведения, идентифицирующие файловое вложение при ссылке на него из иных элементов данных
2. Владелец отдельного счёта
Сведения, идентифицирующие владельца отдельного счёта при ссылке на него из иных элементов данных
Уникальный идентификатор владельца отдельного счёта, присвоенный уполномоченным банком
3. Контракт по ГОЗ между головным исполнителем и исполнителем, между исполнителями
Сведения, идентифицирующие контракт по ГОЗ между головным исполнителем и исполнителем, между исполнителями, при ссылке на него из иных элементов данных
Уникальный идентификатор контракта по ГОЗ, присвоенный уполномоченным банком
Идентификатор государственного контракта
4. Отдельный счёт
Сведения, идентифицирующие отдельный счёт при ссылке на него из иных элементов данных
Идентификатор отдельного счета, присвоенный уполномоченным банком
БИК уполномоченного банка (его филиала, иного подразделения), в котором открыт счёт
Номер отдельного счета
5. Акт приёма-передачи
Сведения, идентифицирующие акт приёма-передачи товаров (работ, услуг) при ссылке на него из иных элементов данных
Уникальный идентификатор акта приёма-передачи товаров (работ, услуг), присвоенный уполномоченным банком
Формат данных, получаемых банками из МО РФ
В ходе информационного обмена МО РФ направляет уполномоченным банкам квитанции, содержащие информацию о полученных контейнерах (файл-ответ), а также дополнительные сведения, в частности, перечень завершённых государственных контрактов.
Все данные, передаваемые МО РФ, упаковываются в контейнер zip (без сжатия).
Структура файла gozfin.xml (сведения о закрытых контрактах ГОЗ)
После завершения работ по государственному контракту (предоставления головным исполнителем готового изделия, и окончательного расчёта с головным исполнителем), государственный контракт закрывается. Сведения о закрытии государственного контракта попадают в систему финансового мониторинга, откуда в автоматическом режиме передаются в уполномоченный банк, обслуживающий кооперацию по закрывшемуся государственному контракту. Формат сведений о закрытии контрактов приведён ниже.
Файл gozfin.xml подписывается в соответствии с разделом «Подписание сообщения обмена электронной подписью». Подпись помещается в файл gozfin.sign. Файлы gozfin.xml и gozfin.sign помещаются в архив gozfin.zip (без сжатия).
Описание закрытого государственного контракта
Идентификатор государственного контракта
Дата закрытия государственного контракта
Файл-ответ (квитанция) содержит сведения о полученных от уполномоченных банков контейнерах, с указанием статуса получения каждого контейнера. В случае если в принятом контейнере, в том числе включенных в него сообщениях обмена, обнаружены ошибки, сведения об этих ошибках включаются в квитанцию. Файл-ответ подписывается в соответствии с разделом «Подписание сообщения обмена электронной подписью». Подпись помещается в файл с расширением sign.
Файл-ответ и файл ЭП помещаются в архив zip (без сжатия).
В случае если контейнер, в том числе включенные в него сообщения обмена, содержат ошибки, загрузка содержащихся в контейнере сведений в единую систему контрактов по ГОЗ не производится (загружаются только бинарные файлы со скан-образами, при наличии возможности прочитать сведения о них из xml-сообщения). В случае получения уполномоченным банком файла-ответа о непринятии одного или нескольких контейнеров либо пакета данных целиком, уполномоченный банк устраняет причину непринятия контейнера (контейнеров), вновь формирует контейнер (контейнеры) и направляет его (их) в МО РФ за тот же период (включив только ранее не переданные скан-образы, и скан-образы, по которым ранее были предоставлены некорректные описывающие их элементы данных).
Независимо от наличия или отсутствия ошибок в элементах данных, в раздел Elements всегда включаются сведения обо всех операциях (разделы 7-11 настоящего документа). Отсутствие ошибок обозначается кодом результата «00 — ошибок нет».
Формат предусматривает атрибуты «ResultCode» на уровнях пакета, контейнера и элемента данных. Любое значение этого атрибута, отличное от 0, сигнализирует о критической ошибке соответствующего уровня. Критическая ошибка говорит о невозможности принять данные соответствующего уровня, и необходимости их полного повторного предоставления. Например, критическая ошибка «Неверный идентификатор сессии» говорит о необходимости повторить полную отправку данных. В то же время критическая ошибка «Ошибка валидации ЭП», выданная на уровне контейнера, говорит о необходимости переслать только ошибочный контейнер (критической ошибки уровня сессии эта ситуация не вызовет). На каждом уровне данных дополнительно приводится список предупреждений, т.е. ошибок, не ведущих к невозможности принятия данных. Этот список служит для мониторинга состояния обмена, а также для упрощения трассировки ошибок нижних уровней.
В классификаторе «Коды ошибок», установленном настоящим документом, приведён общий список возможных ошибок и предупреждений, с указанием критичности каждой из них.
Форматы графических файлов
Форматы графических файлов. Растровые и векторные форматы.
Информация в разделе по материалам ВикипедиЯ
Формат TIFF
TIFF (англ. Tagged Image File Format) — формат хранения растровых графических изображений. TIFF стал популярным форматом для хранения изображений с большой глубиной цвета. Он используется при сканировании, отправке факсов, распознавании текста, в полиграфии, широко поддерживается графическими приложениями.
Структура формата гибкая и позволяет сохранять изображения в режиме цветов с палитрой, а также в различных цветовых пространствах:
- Бинарном (двуцветном, иногда называемом чёрно-белым)
- Полутоновом
- С индексированной палитрой
- RGB
- CMYK
- YCbCr
- CIE Lab
Поддерживаются режимы 8, 16, 32 и 64 бит на канал.
Сжатие. Имеется возможность сохранять изображение в файле формата TIFF со сжатием и без сжатия. Степени сжатия зависят от особенностей самого сохраняемого изображения, а также от используемого алгоритма. Формат TIFF позволяет использовать следующие алгоритмы сжатия:
- PackBits (RLE)
- Lempel-Ziv-Welch (LZW)
- LZ77
- ZIP
- JBIG
- JPEG
- CCITT Group 3, CCITT Group 4
Алгоритмы CCITT Group 3, CCITT Group 4 первоначально были разработаны для сетей факсимильной связи (поэтому иногда их называют Fax 3, Fax 4). В настоящий момент они также используются в полиграфии, системах цифровой картографии и географических информационных системах.
TIFF является теговым форматом и в нём используются основные, расширенные и специальные теги:
Основные теги составляют ядро формата и должны поддерживаться всеми продуктами, реализующими формат TIFF в соответствии со спецификацией. Поддержка расширенных тегов, в отличие от основных необязательна.
Формат JPEG
JPEG ( англ. Joint Photographic Experts Group, по названию организации-разработчика) — один из популярных графических форматов, применяемый для хранения фотоизображений. Файлы, содержащие данные JPEG, обычно имеют расширения .jpeg, .jfif, .jpg, .JPG, или .JPE. Алгоритм JPEG позволяет сжимать изображение как с потерями, так и без потерь.
Алгоритм JPEG в наибольшей степени пригоден для сжатия фотографий и картин, содержащих реалистичные сцены с плавными переходами яркости и цвета. Наибольшее распространение JPEG получил в цифровой фотографии и для хранения и передачи изображений с использованием сети Интернет.
С другой стороны, JPEG малопригоден для сжатия чертежей, текстовой и знаковой графики, где резкий контраст между соседними пикселами приводит к появлению заметных артефактов. Такие изображения целесообразно сохранять в форматах без потерь, таких как TIFF, GIF или PNG.
JPEG (как и другие методы искажающего сжатия) не подходит для сжатия изображений при многоступенчатой обработке, так как искажения в изображения будут вноситься каждый раз при сохранении промежуточных результатов обработки. JPEG не должен использоваться и в тех случаях, когда недопустимы даже минимальные потери, например, при сжатии астрономических или медицинских изображений.
К недостаткам сжатия по стандарту JPEG следует отнести появление на восстановленных изображениях при высоких степенях сжатия характерных артефактов: изображение рассыпается на блоки размером 8×8 пикселов (этот эффект особенно заметен на областях изображения с плавными изменениями яркости), в областях с высокой пространственной частотой (например, на контрастных контурах и границах изображения) возникают артефакты в виде шумовых ореолов.
Однако, несмотря на недостатки, JPEG получил очень широкое распространение из-за достаточно высокой степени сжатия, поддержке сжатия полноцветных изображений и относительно невысокой вычислительной сложности.
Формат PDF
PDF (англ. Portable Document Format) — кроссплатформенный формат электронных документов, созданный фирмой Adobe Systems с использованием ряда возможностей языка PostScript. Чаще всего PDF-файл является комбинацией текста с растровой и векторной графикой, реже — текста с формами, JavaScript’ом, 3D-графикой и другими типами элементов. В первую очередь предназначен для представления в электронном виде полиграфической продукции, — значительное количество современного профессионального печатного оборудования может обрабатывать PDF непосредственно. Для просмотра можно использовать официальную бесплатную программу Adobe Reader, а также программы сторонних разработчиков. Традиционным способом создания PDF-документов является виртуальный принтер, то есть документ как таковой готовится в своей специализированной программе — графической программе или текстовом редакторе, САПР и т. д., а затем экспортируется в формат PDF для распространения в электронном виде, передачи в типографию и т. п. PDF.
Формат PDF позволяет внедрять необходимые шрифты (построчный текст), векторные и растровые изображения, формы и мультимедиа-вставки. Поддерживает RGB, CMYK, Grayscale, Lab, Duotone, Bitmap, несколько типов сжатия растровой информации. Имеет собственные технические форматы для полиграфии: PDF/X-1, PDF/X-3. Включает механизм электронных подписей для защиты и проверки подлинности документов. В этом формате распространяется большое количество сопутствующей документации.
Формат CALS
Растровый формат CALS (англ. Computer Aided Acquisition and Logistics Support) стардарт, разработанный подразделением министерства обороны США для стандартизации обмена графическими данными в электронном виде, особеннв в областях технической графики, CAD/CAM и приложений обработки изображений.
CALS — хорошо документированный, хотя и громоздкий, формат, в котором сделана попытка охватить многие вещи. Если вы не знакомы с документами правительства США, вам, вомзожно, покажется работа с данным форматом весьма сложной. Растровый формат CALS является необходимым в большинстве приложений, обрабатывающих документы правительства США. Поскольку все данные имеют байтовую организацию проблем типа «с какого конца разбить яйцо тупого или острого » никогда не возникает.
Характеристики формата CALS
- Тип — Bitmap (битовая матрица)
- Цвет — монохром
- Сжатие — CCITT Group 4 или без сжатия
- Максимальный размер изображения — неограничен
- Несколько изображений в файле — да, только для Type II
- Платформы — все
Формат BMP
BMP (от англ. Bitmap Picture) — формат хранения растровых изображений, разработанный компанией Microsoft. С форматом BMP работает огромное количество программ, так как его поддержка интегрирована в операционные системы Windows и OS/2. Файлы формата BMP могут иметь расширения .bmp, .dib и .rle.
Глубина цвета в данном формате может быть 1, 2, 4, 8, 16, 24, 32, 48 бит на пиксель, но глубина 2 бита на пиксель официально не поддерживается. При этом для глубины цвета меньше 16 бит используется палитра с полноцветными компонентами глубиной 24 бита. В формате BMP изображения могут храниться как есть или же с применением некоторых распространённых алгоритмов сжатия. В частности, формат BMP поддерживает RLE-сжатие без потери качества, а современные операционные системы и программное обеспечение позволяют использовать JPEG и PNG.
Формат PCX
PCX (PCExchange) — стандарт представления графической информации, не столь популярный аналог BMP, хотя поддерживается специфическими графическими редакторами, такими как Adobe Photoshop, Corel Draw, GIMP и др. В настоящее время практически вытеснен форматами, которые поддерживают лучшее сжатие: GIF, JPEG и PNG.
Тип формата — растровый. Большинство файлов такого типа использует стандартную палитру цветов, но формат был расширен из расчета на хранение 24-битных изображений. PCX — аппаратно-зависимый формат. Предназначается для хранения информации в файле в таком же виде, как и в видеоплате. Для совместимости со старыми программами необходима поддержка EGA-режима видеоконтроллером. Алгоритм такого сжатия очень быстрый и занимает небольшой объём памяти, однако не очень эффективен, непрактичен для сжатия фотографий и более детальной компьютерной графики. Используется сжатие без потерь. При сохранении изображения подряд идущие пиксели одинакового цвета объединяются и вместо указания цвета для каждого пикселя указывается цвет группы пикселей и их количество. Такой алгоритм хорошо сжимает изображения, в которых присутствуют области одного цвета.
Достоинства формата
- возможность создания ограниченной палитры цветов (например, 16 или 256 цветов);
- поддерживается большим количеством приложений.
Недостатки формата
- не поддерживает цветовые системы, отличные от RGB;
- многочисленные варианты, особенно при работе с цветами, могут делать работу с файлом невозможным;
- неудобная схема сжатия в действительности может увеличивать размеры некоторых файлов.
Формат PNG
PNG (англ. portable network graphics) — растровый формат хранения графической информации, использующий сжатие без потерь.
Область применения
Формат PNG спроектирован для замены устаревшего и более простого формата GIF, а также, в некоторой степени, для замены значительно более сложного формата TIFF. Формат PNG позиционируется прежде всего для использования в Интернете и редактирования графики.
PNG поддерживает три основных типа растровых изображений:
- Полутоновое изображение (с глубиной цвета 16 бит)
- Цветное индексированное изображение (палитра 8 бит для цвета глубиной 24 бит)
- Полноцветное изображение (с глубиной цвета 48 бит)
Формат PNG хранит графическую информацию в сжатом виде. Причём это сжатие производится без потерь, в отличие, например, от JPEG с потерями. Формат PNG обладает более высокой степенью сжатия для файлов с большим количеством цветов, чем GIF, но разница составляет около 5-25 %, что недостаточно для абсолютного преобладания формата, так как небольшие 2-16-цветные файлы формат GIF сжимает с не меньшей эффективностью.
PNG является хорошим форматом для редактирования изображений, даже для хранения промежуточных стадий редактирования, так как восстановление и пересохранение изображения проходят без потерь в качестве.
Анимация
Существует одна особенность GIF, которая в PNG не реализована — поддержка множественного изображения, особенно анимации; PNG изначально был предназначен лишь для хранения одного изображения в одном файле.
Формат Sun Raster
Формат изображений Sun Raster это родной растровый формат платформ Sun Microsystems использующих операционную систему SunOS. Этот формат поддерживает черно-белые, полутоновые и цветные растровые данные произвольной глубины цвета. Поддерживается также использование цветовых карт и простой компрессии данных Run-Length. Обычно большинство изображений в операционной системе SunOS представлены в формате Sun Raster. Также этот формат поддерживается большинством программ работы с изображениями под UNIX.
Характеристики формата Sun Raster
- Тип — bitmap (битовая матрица)
- Цвета — различные
- Сжатие — RLE
- Несколько изображений в файле — не поддерживается
- Платформа — SunOS
- Приложения — многие приложения под UNIX
Информация в разделе по материалам ВикипедиЯ