Диссертацияx - Сибирский государственный университет

advertisement
СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ТЕЛЕКОММУНИКАЦИЙ И ИНФОРМАТИКИ
На правах рукописи
Нечта Иван Васильевич
РАЗРАБОТКА МЕТОДОВ ОБЕСПЕЧЕНИЯ БЕЗОПАСНОСТИ
ИСПОЛЬЗОВАНИЯ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ,
БАЗИРУЮЩИХСЯ НА ИДЕЯХ СТЕГАНОГРАФИИ
Специальность 05.13.17 – Теоретические основы информатики
Диссертация
на соискание ученой степени
кандидат технических наук
Научный руководитель:
доктор технических наук
Фионов Андрей Николаевич
Новосибирск - 2012
2
ОГЛАВЛЕНИЕ
Введение…………………………………………………………………………. 5
Глава 1. Метод стегоанализа текстовых данных, базирующийся
на сжатии ……………………………………………………….………….... 15
1.1. Введение …………………………………………………….………… 15
1.2. Обзор существующих методов внедрения данных
в текстовый файл .…………………………………………………………….. 17
1.3. Обзор известных методов стегоанализа текстовых данных .………. 22
1.4. Описание предлагаемого подхода и построение схемы
эксперимента …………………………………………………………………… 26
1.4.1 Описание предлагаемого подхода ………………………………. 26
1.4.2 Построение схемы стегоанализа …………………………………. 27
1.4.3 Определение параметров алгоритма стегоанализа ……………… 30
1.4.4 Поиск оптимальных параметров работы алгоритма …………… 36
1.5. Экспериментальная проверка эффективности разработанной
схемы стегоанализа ……………………………………………………………. 42
Выводы ……………………………………………………………………… 45
Глава 2. Метод стегоанализа текстовых данных, базирующийся на
статистическом тесте ………………………………..……………………… 46
2.1 Обзор существующих методов стегоанализа текстовых файлов .….. 46
2.2 Построение схемы стегоанализа …….………………………………... 51
2.2.1 Описание предлагаемого подхода.. …………………………….... 51
2.2.2 Выбор статистического теста……………...……………………… 52
2.2.3 Поиск оптимальных параметров работы метода …………….….. 54
2.2.4 Подбор оптимальной схемы стегоанализа …………………..…... 57
2.3 Экспериментальная проверка эффективности
работы метода стегоанализа …..…………………………………………...….. 59
Выводы…………………………………………………………………….... 62
3
Глава 3. Метод стегоанализа исполняемых файлов, базирующийся
на коде Хаффмана…......…………………………………………………….… 64
3.1 Введение ……………………………………………………………….…64
3.2 Описание и построение предлагаемого метода стегоанализа ……….. 67
3.2.1 Описание предлагаемого метода ………………………………… 67
3.2.2 Выбор архиватора ………………………………………………… 69
3.2.3 Выбор оптимального размера окна ……………………………… 72
3.2.4 Описание схемы проведения эксперимента ……………………... 74
3.3 Описание подхода повышения устойчивости
метода внедрения информации в исполняемый файл……………………..... 76
3.3.1 Описание схемы передачи секретного сообщения ……………... 76
3.3.2 Описание способа получения распределения
вероятностей байт ……….…………………………………………………. 79
3.3.3 Заключение ………………………………………………………… 85
Выводы ………………………………………………………………….….. 87
Глава 4. Система внедрения цифровых водяных знаков в исходные
коды программ……………………………………………………………….. 88
4.1 Введение…………………………………………………………………. 88
4.2 Обзор существующих систем цифровых водяных знаков …………… 90
4.3 Описание предложенной схемы внедрения водяных знаков
и разработанных программ …….……………………………………………… 94
4.3.1 Описание предлагаемой схемы ………………………………….. 94
4.3.2 Описание разработанных программ …………………………….. 98
4.4 Описание результатов проведения эксперимента ……………………103
Выводы ……………………………………….…………………………….. 106
Основные заключения и выводы ………………………………………… 107
Список литературы……………………………………………………….… 108
Публикации автора по теме диссертации ……………………………… 112
4
ПРИЛОЖЕНИЕ………………………………………………………………. 115
А. Программная реализация основных алгоритмов ……………………. 115
А.1. Содержимое специальных контейнеров ……………………….. 115
А.2. Распределение вероятностей байт ………………………………. 118
А.3. Исходные коды файлов программ стегоанализа………….……. 120
5
Введение
Актуальность исследования Разработка теоретических основ систем
защиты информации является одной из центральных проблем теоретической
информатики. Среди задач, решаемых в рамках систем защиты, особое место
занимает задача специального кодирования информации в виде данных,
предназначенных для скрытой передачи информации, называемая задачей
стеганографии.
Построение
стеганографических
методов
привлекает
внимание многих специалистов, занятых разработкой новых технологий
(например, технологий анализа и фильтрации передаваемой информации
в сети), направленных на обеспечение высокой надежности информационных
систем. В целом задача стеганографии, т.е. встраивания данных для скрытой
передачи, и противоположная ей задача стегоанализа, т.е. обнаружение
скрытой информации, являются одними из базовых проблем в теории
надежности и безопасности информационных технологий. В отличие
от криптографии, ограничивающей доступ к информации, содержащейся
в передаваемом сообщении с помощью некоторого секретного ключа, задача
стеганографии состоит в том, чтобы скрыть сам факт передачи какого-либо
сообщения от третьих лиц. Обычно, такая задача решается путем внедрения
передаваемого секретного сообщения в безобидный на вид объект данных,
так называемый контейнер. Сам контейнер подбирается таким образом,
чтобы факты его существования или передачи не вызывали никакого
подозрения. Основными характеристиками методов стеганографии следует
считать
объем
внедряемого
сообщения
и
устойчивость
к
анализу
(обнаружению факта наличия внедрения).
В современном мире, в связи с бурным развитием компьютерной
техники, большой объем информации передается в цифровом виде.
Как следствие, одним из активно развивающихся направлений стеганографии
является цифровая стеганография. В этом направлении в качестве контейнера
6
используется цифровой объект – компьютерный файл. Современные методы
встраивания позволяют внедрять скрытую информацию в файлы аудио,
видео, текста, исполняемых программ и т.д. В настоящее время существует
большое
количество
стеганографических
программных
пакетов
как коммерческих, так и бесплатных, с графическим интерфейсом и в виде
консольных приложений.
Цифровая стеганография получила широкое применение в сфере
защиты авторских прав. В объект авторского права может быть внедрена
специальная метка – отпечаток пальца (fingerprint), которая идентифицирует
законного получателя. Например, в каждую продаваемую копию программы
может быть внедрена метка, идентифицирующая лицензионного покупателя.
В случае обнаружения пиратской копии программы при помощи встроенной
метки без труда может быть отслежен пользователь, нарушивший
лицензионное соглашение. Еще одной встраиваемой меткой может быть
цифровой
водяной
знак
идентифицирующий
(watermark),
автора.
Предположим, в фотографию внедряется специальная метка, содержащая
паспортные данные автора. Затем обнаруживается постороннее лицо
выдающее эту фотографию как свою собственную. В ходе судебного
разбирательства с помощью извлеченного водяного знака может быть
установлен истинный автор фотографии.
Существует также обратная стеганографии задача – стегоанализ.
Задача стегоанализа состоит в обнаружении факта передачи секретного
сообщения. Можно сказать, что стеганография и стегоанализ – два
параллельно развивающихся направления науки. Так, для существующего
метода стеганографии может быть разработан метод стегоанализа, который,
как правило, накладывает ограничения на исходную схему встраивания
информации в контейнер. Например, уменьшается допустимый объем
передаваемой информации.
Стегоанализ получил широкое применение в сфере обеспечения
информационной
безопасности
и,
в
частности,
для
борьбы
7
с незаконной передачей информации. Например, в некоторых отечественных
и иностранных компаниях служба безопасности проверяет исходящую
электронную
почту
сотрудников
для
пресечения
утечки
закрытой
коммерческой информации. Принимая во внимание широкую доступность
и разнообразие программных продуктов, позволяющих встраивать скрытую
информацию в обычные «невинные» письма, становится очевидной
актуальность совершенствования методов стегоанализа. Учитывая большой
объем передаваемых данных, перспективными следует считать методы
компьютерного анализа, работающие без участия человека.
Стегоанализ
также
может
быть
применен
злоумышленником.
Например, для случаев с цифровыми отпечатками пальцев в программе,
атакующий может выявить факт существования специальных меток
в программе и попытаться их исказить или удалить. В таком случае развитие
методов
стегоанализа
необходимо
для
установления
потенциальных
возможностей злоумышленника и, соответственно, для корректировки схем
внедрения скрытой информации.
В настоящее время проводится множество конференций, по проблемам
информационной безопасности. С каждым годом растет число публикаций,
посвященных методам стеганографии и стегоанализа. В этом направлении
науки работают многие российские и зарубежные ученые: В.Г. Грибунин,
И.Н. Оков, Б.Я. Рябко, И.В. Туринцев, А.Н. Фионов, Р. Бергмар (R. Bergmar),
К. Кашен (C. Cachin), М. Чапман (M. Chapman), Ц. Чень (J. Chen),
Дж. Фридрич (J. Fridrich), и др. Однако вопросам текстовой стеганографии
посвящено сравнительно мало работ. Автором диссертации был проведен
анализ основных отечественных и зарубежных источников за более
чем 10 последних лет. Список этих источников отражен в тексте
диссертации. Основные работы, с которыми производилось сопоставление
результатов диссертации, принадлежат таким специалистам как Ц. Чень
(J. Chen), Л. Хуан (L. Huang), Дж. Ю (Z. Yu).
8
Цель
работы
−
обеспечение
надежности
и
безопасности
использования информационных технологий, базирующееся на методах
стеганографии.
Объектом исследований
в предлагаемой работе являются методы
и алгоритмы стеганографии текстовых данных и программ (как особого вида
текста).
Состояние
проблемы
Существует
два
основных
подхода
к встраиванию информации в текстовый контейнер. Первый подход
предполагает использование семантических особенностей языка. Например,
метод, реализованный в программе Tyrannosaurus Lex, работает следующим
образом. В тексте производится поиск слов, которые имеют некоторый набор
синонимов.
Затем,
в
соответствии
со
скрываемым
сообщением,
осуществляется замена найденных слов на соответствующие им синонимы.
Подобный подход обеспечивает высокую степень устойчивости к анализу,
так как получающийся текст практически не отличается от исходного
ни по смысловому содержанию, ни по синтаксической конструкции
предложений.
Второй подход заключается в генерации искусственного текста.
Для получения стеготекста используются контекстно-свободные грамматики.
Нетерминальные символы могут быть раскрыты по заданным правилам
несколькими возможными способами. В зависимости от входного сообщения
выбирается правило раскрытия. Получившийся стеготекст не содержит
грамматических и орфографических ошибок. На сегодняшний день самыми
популярными программами, генерирующими искусственный текст, являются
Nicetext, Texto и Markov-Chain-Based. Эти программы имеют высокое
соотношение размера входного сообщения к размеру генерируемого текста,
и получающийся текст максимально похож на естественный. Стоит
отметить, что получившийся искусственный текст, как правило, является
бессмысленным, что может быть с легкостью выявлено человеком.
9
Методы внедрения, основанные на семантических особенностях текста,
являются трудно обнаружимыми. Замена одного слова на соответствующий
ему
синоним
не
нарушает
синтаксическую
структуру
предложения
и не искажает смысловое содержание. Несмотря на указанную особенность,
такой метод внедрения также не лишен недостатков. При замене некоторых
слов возможно нарушение стиля языка. Например, во фразе “what time is it?”
слово time может быть заменено на синоним duration, но это будет
некорректно для английского языка. Также использование некоторых слов
в качестве синонимов может нарушать авторский стиль написания текста.
На этих фактах базируются многое методы анализа.
Устойчивость
естественному,
методов,
генерирующих
обеспечивается
заданными
стеготекст,
правилами
подобный
грамматики.
Отсутствие грамматических и орфографических ошибок в предложениях
делает
затруднительным
поиск
отличий
искусственного
текста
от естественного. Анализ осмысленности текста можно производить только
с участием человека, что не всегда возможно из-за огромного объема
анализируемой
информации.
Наиболее
эффективный
метод
анализа
использует прогнозирование для выявления искусственной природы текста,
порожденного программой Nicetext. Сначала производится анализ слов
первой половины текста, и составляется прогноз каждого последующего
слова из второй части текста. Если в подавляющем большинстве случаев
прогноз оказывается успешным, то это означает, что мы имеем дело
с естественным текстом. Частые ошибки при прогнозировании могут
свидетельствовать о наличии искусственного текста. Для программ Texto
и Markov-Chain-Based используются методы, учитывающие корреляцию слов
между предложениями. Так, считается, что предложения, содержащие слова,
встречающиеся только в технических текстах, не могут стоять рядом
с предложениями, содержащими слова, встречающиеся только в текстах
художественной литературы.
10
Подобно текстовым контейнерам, современные методы стеганографии
позволяют встраивать информацию в исполняемые файлы. Основным
требованием, предъявляемым к таким методам, является сохранение
алгоритма работы программы. Один из подходов задействует некоторую
незначительную избыточность в программных файлах, которая позволяет
внедрять водяной знак. Подобный подход используется в программах Stilo
и Diablo, чтобы скрыть данные непосредственно в исполняемых файлах.
Общая особенность этих методов состоит в нахождении некоторого набора
эквивалентных способов генерации исполняемого файла и сокрытие данных
через выбор одного из них. Методы генерации кода зависят от компилятора
и, в частности, от его методов выбора типа команды, планирования
инструкций,
размещения
текста
программы,
выделения
регистров
и расстановки адресов функций в таблицах импорта. Следует обратить
внимание на то, что некоторые модификации кода могут быть применены
к уже готовому исполняемому файлу, в то время как другие – только
во время компиляции и, поэтому, требуется специально разработанный
компилятор.
Другой
подход
предлагает
внедрять
секретное
сообщение
в неиспользуемые места исполняемого файла. Неиспользованные области
обычно заполняются нулевыми байтами, но они также могут быть заменены
на секретное сообщение. Доказать, что область программы является
неиспользуемой, можно только при наличии исходных кодов. В отличие
от предыдущего подхода, преимущество данного заключается в отсутствии
воздействия на работу программы. Более того, внедрение секретного
сообщения может быть осуществлено в готовый исполняемый файл.
Для проведения эффективного стегоанализа вышеописанных подходов,
существующие
программ1.
1
Это
методы
предполагают
требует
работу
дизассемблирования
исходные коды на языке ассемблера.
с
исходными
кодами
исполняемого
файла,
11
что
является
достаточно
трудоемкой
задачей,
проходящей
в полуавтоматическом режиме (с участием человека). В настоящей работе
предлагается эффективный метод стегоанализа, лишенный указанного
недостатка.
Задачи исследования
Для достижения указанных целей с учетом
изложенного состояния проблемы в рамках диссертационной работы
решаются следующие задачи:
1. Построение
стегоанализа
текстовых
данных,
порожденных
с использованием контекстно-свободных грамматик.
2. Построение
стегоанализа
текстовых
данных,
полученных
с использованием метода замены синонимов.
3. Построение стегоанализа исполняемых файлов.
4. Разработка схемы внедрения стеганографических меток в тексты
программ.
Методы исследования В процессе проведения исследований были
использованы основные положения и методы теории информации, теории
вероятностей, алгоритмы сжатия данных и эксперименты.
Результаты, выносимые на защиту
1. Построен
стегоанализ
текстовых
данных,
порожденных
с использованием контекстно-свободных грамматик.
2. Построен
стегоанализ
текстовых
данных,
полученных
с использованием метода замены синонимов.
3. Построен стегоанализ исполняемых файлов.
4. Разработана схема внедрения стеганографических меток в тексты
программ на С\С++.
12
Научная новизна результатов работы:
1. Разработан метод стегоанализа искусственного текста, порожденного
для передачи секретных сообщений. Предложенный метод имеет
высокую
точность
(не
менее
99.9%)
при
малых
размерах
анализируемого контейнера (400 байт).
2. Разработан
эффективный
метод
обнаружения
стеготекста,
порожденного с помощью метода замены синонимов для внедрения
скрытых сообщений.
3. Разработан метод стегоанализа исполняемых файлов для выявления
скрытых сообщений, внедренных в неиспользуемые места программы.
Преимущество метода перед известными заключается в высокой
эффективности при малых объемах внедрения (80 байт) и в отсутствии
необходимости производить дизассемблирование кода программы.
4. Предложена схема встраивания стеганографических меток в исходные
коды программ на С\С++.
Практическая ценность полученных результатов:
1. Для распространенной стегосистемы Texto построен эффективный
метод
выявления
факта
внедрения
скрытой
информации,
превосходящий по эффективности ранее известные схемы.
2. Для широко используемой стегосистемы Tyrannosaurus Lex построен
эффективный метод анализа.
3. Разработана эффективная схема стегоанализа исполняемых файлов.
4. Предложен метод встраивания информации в исполняемые файлы,
использующий
предварительное
кодирование
встраиваемого
сообщения.
5. Построена система встраивания водяных знаков для текстов программ
на C \ C++.
13
Реализация и внедрение результатов работы Основные результаты
использованы при выполнении следующих проектов и государственных
программ:
 Проект Федеральной целевой программы «Разработка эффективных
методов кодирования, передачи, защиты и хранения информации,
основанных
на
теоретико-информационном
подходе».
Государственный контракт № 02.740.11.0396.
 Проект РФФИ 09-07-00005-а «Разработка эффективных методов
стеганографии и стегоанализа» (руководитель – Рябко Б. Я.).
 Гранты
для
магистрантами
выполнения
и
научных
молодыми
исследований
преподавателями
аспирантами,
ФГОБУ
ВПО
«СибГУТИ», 2009 и 2010 гг.
Результаты работы внедрены:
 в учебный процесс на кафедре ПМиК в программах курсов «Защита
информации» (бакалавриат) и «Современные проблемы информатики»
(магистратура) по направлению подготовки 230100 «Информатика
и вычислительная техника»;
 в ПО системы безопасности и обнаружения вторжений в сети СО РАН
на базе Института вычислительных технологий СО РАН.
Апробация работы
Основные результаты данной работы докладывались и обсуждались
на следующих российских и международных конференциях:
 Российская
и
проблемы
научно-техническая
телекоммуникаций»
конференция
(ФГОБУ
ВПО
«Информатика
«СибГУТИ»,
Новосибирск, 26-28 апреля, 2009).
 XLVII Международная научно студенческая конференция «Студент
и научно-технический прогресс» (Новосибирск, НГУ, 11-15 апреля,
2009).
14
 XII International Symposium on Problems of Redundancy (St.-Petersburg,
26-30 May, 2009).
 XLVIII Международная научно студенческая конференция «Студент
и научно-технический прогресс» (Новосибирск, НГУ, 10-14 апреля,
2010).
 Международная научно-практическая конференция «Информационная
безопасность 2010» (Таганрог, 22-25 июня, 2010).
 XLIX Международная научно студенческая конференция «Студент
и научно-технический прогресс» (Новосибирск, НГУ, 16-21 апреля,
2011).
 Российская
и
проблемы
научно-техническая
телекоммуникаций»
конференция
(ФГОБУ
ВПО
«Информатика
«СибГУТИ»,
Новосибирск, 21-22 апреля, 2011).
 Applied Methods of Statistical Analysis. Simulations and Statistical
Inference (NSTU, September 20 - 22, 2011).
Публикации По теме диссертации опубликовано 16 работ, в числе
которых 7 статей в журналах и сборниках, из которых 6 входят в список
ВАК.
Личный вклад В работах, выполненных в соавторстве, вклад автора
состоит в построении и реализации предлагаемых схем и алгоритмов, а также
в проведении необходимых экспериментальных исследований.
Структура и объем работы
Диссертация содержит 130 страниц
текста и состоит из введения, четырех глав, заключения, списка литературы
и приложения. Работа содержит 23 таблицы и 49 рисунков. Список
литературы включает в себя 64 источника.
15
Глава 1. МЕТОД СТЕГОАНАЛИЗА ТЕКСТОВЫХ ДАННЫХ,
БАЗИРУЮЩИЙСЯ НА СЖАТИИ
1.1. Введение
В
настоящей
диссертационной
работе
мы
будем
говорить
о стеганографии и стегоанализе. В этой связи необходимо определить
основные термины, которые будут употребляться.
Стеганография – наука о сокрытии факта передачи секретного
сообщения. На рис. 1.1 представлена классическая задача стеганографии,
известная в научной литературе как “проблема заключенных” [1]. Алиса
и Боб – заключенные в разных камерах, которые могут обмениваться
“невинными” сообщениями. Охранник – Ева, может перехватывать любые
подозрительные сообщения и читать их. Задача заключенных состоит в том,
чтобы договориться о плане побега из тюрьмы, то есть создать потаенный
канал связи для обмена секретными сообщениями. Если Ева заподозрит
подготовку к побегу, то заключенных могут перевести в более охраняемую
тюрьму. Таким образом, Алисе и Бобу не удастся сбежать.
Будем называть контейнером последовательность данных, в которую
необходимо внедрить секретное сообщение. Соответственно говорят,
что контейнер пустой, если в нем нет секретного сообщения. Контейнер
с секретным сообщением называют заполненным или стегоконтейнером.
Поскольку мы говорим о цифровой стеганографии, то в качестве
контейнеров могут выступать компьютерные файлы различных форматов:
jpg,wav, avi, exe, txt и другие.
На рис. 1.1, изображена схема передачи секретных сообщений.
С помощью специального алгоритма Алиса встраивает секретное сообщение
в контейнер и передает его Бобу. Благодаря особенностям алгоритма
16
стеганографии,
Ева,
перехватив
контейнер,
не
сможет
однозначно
утверждать о наличии факта внедрения. Боб без труда извлечет и прочитает
секретное сообщение. Таким образом, задача сокрытия факта передачи
секретного сообщения от третьих лиц будет выполнена.
Ева
сообщение
сообщение
ключ
стего
контейнер
стего
контейнер
контейнер
ключ
Боб
Алиса
Рис. 1.1. Схема передачи секретного сообщения
Для повышения безопасности внедряемое сообщение может быть
предварительно
зашифровано
известными
криптографическими
алгоритмами, например AES, Blowfish, RC6. Предполагается, что участники
обмена
секретными
сообщениями
будут
заранее
договариваться
об используемом алгоритме встраивания и ключе шифрования.
Стегосистемой
называется
совокупность
средств
и
методов,
предназначенных для построения тайного канала связи. К характеристикам
стегосистем относят объем внедрения, устойчивость к анализу (выявлению
факта передачи скрытых сообщений) и устойчивость к атакам (искажению
внедренного сообщения).
Стегоанализ – противоположное стеганографии направление науки,
изучающее методы выявления факта передачи секретного сообщения.
В частности, Ева подвергает стегоанализу любые контейнеры с целью
прочитать, изменить или хотя бы выявить факт передачи секретных
сообщений
между
заключенными.
Согласно
принципу
Керкхоффса,
17
Ева может заранее знать алгоритм внедрения сообщений, которым могут
воспользоваться Алиса и Боб. Таким образом, устойчивость к стегоанализу
обеспечивается
некоторыми
секретными
параметрами
алгоритма
(так называемый ключ). Ключ должен быть известен только Алисе и Бобу.
Подробнее методы стегоанализа будут рассмотрены в разделе 1.3.
1.2. Обзор существующих методов внедрения данных в
текстовый файл
Самый ранний этап развития стеганографии текстовых файлов,
связывают
с
появлением
класса
методов,
использующих
ошибки
в предложениях для встраивания информации. К таким методам можно
отнести,
например,
предложенный
в
работе
[2],
использующий
дополнительные пробелы между словами. Один пробел соответствует
передаваемому биту равному нулю, два пробела – единице. В следующем
предложении
“O_never__say_that__I_was__false_of_heart”1
внедрено
сообщение: “01010100”. Данный метод может широко применяться в файлах
формата HTML (интернет страниц), поскольку наличие пробелов никак
не влияет на отображение страницы. В работе [2] автор утверждает,
что кроме того, существует возможность использования специальных
символов вместо пробелов, не отображающихся в часто используемых
текстовых редакторах.
Еще один способ внедрения информации предполагает использовать
пробелы в конце строки. Например, сонет 109 У. Шекспира:
“O! never say that I was false of heart,_
Though absence seem’d my flame to qualify,_
As easy might I from myself depart_ _
1
Здесь символ пробела обозначается как “_”.
18
As from my soul which in thy breast doth lie:_
That is my home of love: if I have ranged,_ _
Like him that travels, I return again;_ _”
содержит скрытое сообщение “001011”. Здесь однократный пробел
соответствует биту “0”, двукратный– “1”.
Недостатком указанных методов можно считать низкую устойчивость
к стегоаннализу, т.к. обычно дополнительные пробелы или специальные
символы не используются. Следовательно, простой анализ текста на наличие
серий пробелов с высокой долей вероятности выявит факт передачи
секретного сообщения.
Еще
один
метод,
предложенный
в
работе
[2],
использует
синтаксические ошибки при написании слов, например:
“This is the end”
“This iz the end”
Во
втором
предложении
допущена
опечатка.
Наличие
опечатки
в определенных словах (в частности “iz”) означает, что бит передаваемой
информации равен нулю, а отсутствие – единице. Таким образом происходит
передача
информации
достаточное
количество
в
тексте.
На
программных
сегодняшний
средств,
день
существует
производящих
поиск
грамматических ошибок в тексте. Как следствие, уязвимость класса методов,
добавляющих ошибки в предложения, становится очевидной и подобные
подходы встраивания скрытой информации могут быть без труда выявлены
c высокой точностью. Однако указанный класс методов внедрения
рекомендуют применять для передачи коротких сообщений, например,
в чатах или интернет мессенджерах (ICQ, QIP и др.). Считается, что в таких
сообщениях, как правило, могут встречаться ошибки, и это будет хорошо
маскировать наличие факта внедрения.
Следующим этапом развития цифровой стеганографии было создание
класса методов, использующих семантические особенности языка. К этой
19
группе можно отнести стегосистему Tyrannosaurus Lex, описанную в работе
[3], и использующую замену слов в предложении на их синонимы, например:
(0)decent
Tobolsk is a
(0)city
little
(1)fine
(1)town
Рис. 1.2. Принцип внедрения информации с использованием замены
синонимов.
В
зависимости
от
выбранного
синонима
кодируется
передаваемое
сообщение. Предложение “Tobolsk is a decent little town” содержит скрытое
сообщение − “01”. Данный метод требует наличия большого словаря
синонимов. К недостатку подобных методов внедрения относят возможное
нарушение авторского стиля написания текста. Например:
«“. . . and make it still better, and say nothing of the bad – belongs to you alone.”
“. . . and make it still better, and say nada of the bad – belongs to you alone.”
Слово “nada” является не типичным для использования некоторыми
авторами, в частности, Jane Austen» [18].
Также существует подход, опубликованный в работе [4]. Секретное
сообщение внедряется с помощью преобразования обычного текста
в
стеготекст
путем
синтаксических
трансформаций
предложений
(так называемое перефразирование). Подход базируется на том факте,
что возможно преобразовать предложение в тексте, сохранив, при этом,
его семантическую нагрузку. Существует несколько основных способов
преобразований текста английского языка:
 Преобразование в пассивный залог
“Mary helps John.”
“John helped by Mary.”
20
 Перемещение дополнения
«“The caller identified the bomber as Yussef Attala, 20, from the Balata
refugee camp near Nablus.”
“The caller named the bomber as 20-year old Yussef Attala from the Balata
refugee camp near Nablus.”»[4]
 Разделение предложений
“The dog ate the bone.”
“It was the dog that ate the bone.”
Другие виды преобразований рассмотрены в работе [5]. Указанный метод
обладает высокой устойчивостью к анализу. Однако здесь следует
внимательно подходить к выбору контейнера. Очевидно, что если мы будем
использовать широко известный текст для встраивания информации,
то любая его модификация может вызывать подозрение.
Похожий
подход
рассмотрен
в
работе
[6].
Основная
идея
предложенного метода внедрения заключается в следующем. Имеется
специальный стеганографический переводчик текстов с некоторого языка
на английский. На рис. 1.3 указан пример работы переводчика.
Джек нанес краску
на стену
Jack sprayed paint
on the wall
0
Jack sprayed the
wall with paint
1
перевод
Рис. 1.3. Принцип внедрения информации с использованием
стегопереводчика.
Каждое предложение переводится отдельно несколькими возможными
способами. В зависимости от скрываемого сообщения производится
добавление одного из вариантов перевода предложения в получаемый текст.
21
В результате, переведенный текст содержит скрытое сообщение. В работе
[6] приводится пример:
Исходный текст:
«“Der marokkanische Film “Windhorse” erzählt die Geschichte zweier,
unterschiedlichen Generationen angehörender Männer, die durch Marokko reisen.
Auf dem Weg suchen sie nach Einzigen, was ihnen wichtig ist: dem Sinn
des Lebens.”
Полученный стеготекст:
“The Moroccan film “Windhorse” tells the story of two, different generations
of belonging men, who travel by Marocco. They are looking for the only one which
is important to them on the way: sense of a life.”»[6]
Исходный текст (контейнер) может быть общедоступным. Поскольку
атакующий не знает, каким именно способом переводился текст (вручную
или какими-то определенными переводчиками), то он не сможет аналогично
перевести исходный текст и сравнить с имеющимся перехваченным
стеготекстом. Таким образом, в предложенной схеме устранен недостаток,
связанный с выбором контейнера.
Еще одним этапом развития стеганографии было создание класса
методов, генерирующих стеготекст, подобный естественному. Рассмотрим
подход, предложенный в работе [7], использующий контекстно-свободные
грамматики для генерации естественно-подобного текста. Допустим, заданы
следующие правила грамматики:
S → ABC
A→ She (0) | He
(1)
B→ likes (0) | hates (1)
C→ milk (0) | apples (1)
В зависимости от бита внедряемого сообщения выбирается правило
раскрытия
нетерминального
символа.
Соответственно,
при
передаче
секретного сообщения “101” получится стеготекст: “He likes apples”.
На сегодняшний день наиболее популярными стегосистемами из указанного
22
класса являются Nicetext [8], Texto [9] и Markov-Chain-Based [10], т.к. имеют
высокое соотношение размера входного сообщения к размеру генерируемого
стеготекста. Считается, что чем выше это соотношение, тем эффективней
метод внедрения. Рассмотрим пример стеготекста, полученного при помощи
программы Texto:
“The raindrop blackly washs to the weak hall. I destroy silly floors near the usable
official highway. Sometimes, caps destroy behind cosmetic lakes, unless they're
untouched. Never eat familiarly while you're pointing through a plastic pen.
We weakly hug around messy sharp barns. While shoes easily dream, the cards
often darken on the green dryers. Other opaque cosmetic boats will relay de.
The raindrop admiringly enjoys to the loud window. I question odd smogs near the
soft huge star.”
Такие сгенерированные тексты выглядят как естественные, но являются
бессмысленными (бессодержательными), что может быть с легкостью
выявлено человеком.
1.3 Обзор известных методов стегоанализа текстовых
файлов
В данном разделе главы мы рассмотрим обратную стеганографии
задачу – стегоанализ. Целью которого является выявление факта наличия
встроенного
секретного
рассматриваться
только
сообщения
методы,
в
контейнере.
обнаруживающие
Здесь
будут
сгенерированный
искусственный текст.
В качестве критерия оценки эффективности методов стегоанализа
часто используют точность обнаружения – вероятность правильного
распознавания содержимого контейнера. Также активно используются
вероятности ошибочных срабатываний метода. Существует два рода ошибок:
23
Ошибка I рода – случай, когда метод принимает пустой контейнер
(без секретного сообщения) за заполненный (с секретным сообщением).
Ошибка II рода – случай, когда заполненный контейнер принимается
за пустой.
Как уже было отмечено, методы, генерирующие текст подобный
естественному, имеют один существенный недостаток − получается
бессмысленный стеготекст. Задача определения осмысленности текста
не может быть решена с помощью компьютера и требует участия человека.
Однако учитывая большой объем передаваемых сообщений в сети,
это не всегда возможно. Поэтому особенно актуальна задача разработки
новых подходов, позволяющих эффективно работать без привлечения
человека.
Большинство методов стегоанализа текстовых данных, использующих
статистические свойства контейнера, применяют один из популярных
методов классификации Support Vector Machines (SVM), реализованный,
например, в специальной утилите LIBSMV (доступной по адресу [11]).
На рис. 1.4 показан принцип работы метода.
На первом этапе происходит сбор статистических характеристик
контейнеров и обучение SVM. На вход программе подаются два контейнера,
A и B – пустой и заполненный соответственно. Производится анализ и расчет
заданных
и
статистических
заполненному
характеристик,
контейнеру.
На
соответствующих
втором
этапе
пустому
осуществляется
классификация. На вход подается подозрительный контейнер и найденные
статистические характеристики. Аналогично с этапом обучения происходит
сбор характеристик и определяется, к какому из контейнеров (пустому или
заполненному) исследуемый ближе. При подходящем выборе статистических
характеристик контейнера, данный метод классификации показывает
достаточно высокую эффективность.
24
Этап 1. Обучение
Набор
статистических
характеристик
контейнера A,
контейнера B
A
SVM
B
Этап 2. Классификация
С
Ответ:
С - (пуст или
заполнен)
SVM
Набор характеристик
Рис. 1.4. Принцип работы метода Support Vector Machines
Метод, предложенный в работе [12], использует частоту встречаемости
слов и ее дисперсию в анализируемом тексте. По полученным данным
с помощью SVM классификатора определяется факт наличия стеготекста,
сгенерированного программными средствами [8], [9] или [10] в контейнерах
размером 5Кб и более. Сумма ошибок I и II рода не превосходят 7.05%.
Метод,
предложенный
в
работе
[13],
базируется
на
анализе
статистической зависимости слов в тексте. Такая зависимость известна для
стеготекста,
производится
обычного
сбор
текста.
С
помощью
статистических
специального
характеристик
алгоритма
подозрительного
контейнера и, используя SVM классификатор, определяется наличие
стеготекста, сгенерированного программными средствами [8], [9] или [10]
в контейнере. В табл. 1.1 показана эффективность работы метода.
25
Таблица 1.1. Эффективность работы метода, базирующегося на анализе
статистической зависимости слов в тексте
Размер
5 Кб
10 Кб
20 Кб
30 Кб
40 Кб
87.39%
95.51 %
98.50 %
99.15 %
99.57 %
контейнера
Точность
обнаружения
Наиболее эффективным при малых размерах входных данных является
метод, опубликованный в работе [14]. Здесь используется прогнозирование
для выявления искусственной природы текста, порожденного программой
[8]. Сначала, производится анализ слов первой части текста, и составляется
прогноз каждого последующего слова из второй части. Если в подавляющем
большинстве случаев прогноз оказывается успешным, то это означает,
что
мы
имеем
дело
с
естественным
текстом.
Частые
ошибки
при прогнозировании могут свидетельствовать о наличии искусственного
текста. Точность обнаружения стеготекста составляет 99.61% при размере
контейнера в 400 байт и более.
Таблица 1.2. Наиболее эффективные методы обнаружения искусственного
текста
Метод
Атакуемая
стегоанализа
стегосистема
Meng P. и др.
2008 [14]
Chen Z. и др.
2008 [12]
Размер
контейнера
(байт)
Точность
обнаружения
Nicetext
400
99.61%
Texto
5000
92.95%
26
Chen Z. и др.
MCB
2008 [12]
5000
92.95%
Итак, подытожим результаты. В табл. 1.1. представлены наиболее
эффективные
методы
стегоанализа
текстовых
данных,
полученных
с помощью генерации стеготекста.
1.4 Описание предлагаемого подхода и построение схемы
стегоанализа
1.4.1 Описание предлагаемого подхода
В
настоящей
работе
предлагается
новый
метод,
основанный
на подходе, предложенном Б. Я. Рябко [15], отличающийся от других тем,
что для выявления факта наличия стеготекста используется сжатие данных.
Идея подхода состоит в том, что внедряемое сообщение нарушает
статистическую
структуру
контейнера,
повышая
его энтропию. Следовательно, заполненный контейнер будет «сжиматься»
хуже, чем незаполненный. В отличие от предыдущих аналогов, данный
подход обладает рядом преимуществ:
 Анализ
занимает
сравнительно
мало
времени
(порядка
0.1-0.5 с на современных персональных компьютерах).
 Для проведения анализа не требуется словарей синонимов или правил
грамматики языка, занимающих большой объем памяти.
Теперь
рассмотрим
основную
идею
предлагаемого
метода
на следующем примере:
Пусть существуют контейнеры 𝑨 и 𝑩, пустой и заполненный соответственно.
Размеры контейнеров до и после сжатия архиватором следующие:
27
Возьмем 𝑪 – подозрительный контейнер. Допишем 𝑪 в конец
контейнеров 𝑨 и 𝑩, сожмем и сравним получившиеся длины сообщений
𝑪 после сжатия.
Таблица 1.3. Размеры контейнеров до и после сжатия
Контейнер
Размер добавленной части, байт
До сжатия
После сжатия
𝑨
500
300
𝑩
500
320
Таблица 1.4. Размер добавляемой части до и после сжатия
Размер, байт
Исходный Добавляемый
После
контейнер
контейнер
До сжатия
𝑨
𝑪
50
45
𝑩
𝑪
50
20
сжатия
Исходя из полученных данных, представленных в табл. 4, можно
утверждать,
что
контейнер
𝑪
является
статистически
зависимым
относительно контейнера 𝑩, что обеспечивает хорошее сжатие. И наоборот,
является независимым относительно 𝑨, так как сжатие намного хуже.
Следовательно, контейнер 𝑪 является стеготекстом. На этом принципе
строится атака на широко известную стегосистему Texto.
1.4.2 Построение схемы стегоанализа
В этом разделе главы будет рассмотрен процесс построения
стегоанализа. В предыдущем разделе мы описали следующий подход,
использующийся для стегоанализа, изображенный на рис. 1.5.
28
К двум специальным контейнерам (A и B) пустому и заполненному
соответственно, добавляется содержимое подозрительного контейнера. Далее
производится сжатие архиватором, и по размерам полученных контейнеров
определяется наличие стеготекста.
A
+
C
a
с1
b
c2
сжатие
B
Рис. 1.5. Схематичное изображение принципа работы предлагаемого
стегоанализа
Очевидно, что на эффективность работы разрабатываемого метода
стегоанализа могут влиять:
 Содержимое специальных контейнеров
 Размер специальных контейнеров
 Размер подозрительного контейнера
 Используемый архиватор
Теперь рассмотрим метод подробнее по пунктам:
Влияние
содержимого
специального
контейнера
может
быть
обусловлено тем, что любой искусственный текст, рассматриваемый
как
битовая
последовательность,
содержит
особые
битовые
последовательности, характерные только для стеготекста. Аналогичная
ситуация может быть и с естественным текстом. Соответственно, при анализе
специального контейнера будет выявлено характерное распределение
вероятностей битовых серий. Предполагается, что если подозрительный
контейнер является статистически зависимым от специального контейнера
(то есть они оба порождены искусственно или естественно), то имеет место
такое же распределение вероятностей, что обеспечит хорошее сжатие
добавляемой
зависимостей
части.
между
Следовательно,
контейнерами,
при
отсутствии
распределение
статистических
вероятностей
29
добавляемой части будут другим, что означает – сжатие будет плохим. Идея
использования архиватора для установления статистической зависимости
между контейнерами не новая и уже применялась в ряде работ, например
[15,16].
В некоторых трудах, посвященных стегоанализу, в частности [17],
утверждалось, что научные тексты отличаются от текстов художественной
литературы по многим статистическим свойствам. Предугадать заранее,
какой именно специальный контейнер нам нужен, не представляется
возможным. Следовательно, содержимое специального пустого контейнера
мы будем подбирать эмпирически.
При выборе размера специального контейнера необходимо учитывать
то, что архиватору требуется достаточное количество текста для анализа,
чтобы выявить основные серии бит, характерные для естественного
или искусственного текста. В нашей работе размер был зависим от длины
анализируемого контейнера, и превосходил его в 10 раз.
При
выборе
длины
подозрительного
контейнера
следует
руководствоваться следующими принципами. Считается, что стегоанализ
является более эффективным, если требуется меньший объем входных
данных. Следовательно, необходимо стремиться к уменьшению длины
анализируемого контейнера. Однако архиватору необходим достаточный
объем добавляемой части для проведения стегоанализа. Слишком короткий
текст не будет отражать реальные статистические особенности характерные
для естественного или искусственного текста.
Выбор архиватора также влияет на эффективность нахождения
повторяющихся серий бит в тексте, и, соответственно, влияет на качество
стегоанализа. Во многих работах, посвященных стегоанализу, производится
нахождение
статистических
закономерностей
характерных
только
для искусственного или естественного текста. В настоящей работе
выявляется только факт взаимосвязи контейнеров одного типа при помощи
архиватора.
30
1.4.3 Определение параметров алгоритма стегоанализа
В
этом
разделе
главы
мы
уточним
некоторые
параметры
разрабатываемого алгоритма. В частности, нам необходимо установить
используемый архиватор и содержимое специальных контейнеров. Для этого
введем некоторые обозначения:
𝝋 − исходный размер специального контейнера.
𝑪𝒔𝒊𝒛𝒆 − размер анализируемого контейнера.
𝝋𝒂𝒓𝒄 − размер специального контейнера после сжатия.
𝝋𝒙 − сумма размеров специального и анализируемого контейнера.
𝝋𝒙𝒂𝒓𝒄 − размер сжатого специального и анализируемого контейнеров
после слияния.
𝜽=
𝝋𝒂𝒓𝒄
𝜽𝒙 =
𝝋
− коэффициент сжатия специального контейнера.
𝝋𝒙𝒂𝒓𝒄
𝝋𝒙
− коэффициент сжатия специального и анализируемого
контейнеров после слияния.
Будем использовать следующую функцию:
𝝎(𝑺𝒑, 𝑪, 𝒂𝒓𝒄) = 𝜽 − 𝜽𝒙 ,
(1)
где 𝑺𝒑 – специальный контейнер, 𝑪 – анализируемый контейнер,
𝒂𝒓𝒄 – используемый архиватор, 𝜽 и 𝜽𝒙 - коэффициенты сжатия,
соответствующие заданным контейнерам 𝑺𝒑, 𝑪 и архиватору 𝒂𝒓𝒄. Данная
функция
отражает
изменение
коэффициента
сжатия
специального
контейнера до и после слияния.
Приступим к процессу выбора параметров работы алгоритма. Для этого
будем рассматривать изменение значений функции 𝝎 при различных
контейнерах и архиваторах. Нам необходимо найти такие значения
параметров, для которых множество значений функции 𝝎, соответствующее
пустым контейнерам, не пересекалось с множеством, соответствующим
заполненным
контейнерам.
Наличие
пересечений
означает
то,
что мы не сможем однозначно отличить стеготекст от естественного текста.
31
Возьмем 𝝋 = 𝟏𝟎𝟎Кб, 𝑪𝒔𝒊𝒛𝒆 = 𝟏𝟎Кб, 𝒂𝒓𝒄 = ′𝑮𝒁𝑰𝑷′, 𝑺𝒑𝟏 – был взят
произвольный стеготекст, полученный с помощью программы Texto.
𝑺𝒑𝟐 – был взят произвольный естественный текст2 (Simple).
На следующем рис. 1.6, показаны два графика зависимости значений
функции 𝝎, при выбранных фиксированных параметрах, для 100 случайно
отобранных файлов, содержащих стеготекст, сгенерированный при помощи
Texto, и 100 файлов содержащих обычный текст.
Обозначим заполненный
и пустой
контейнеры
- 𝑪𝒕𝒆𝒙𝒕𝒐
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
и 𝑪𝒊
сооветственно, где 𝒊 - номер файла.
0.5
0
Значение ω
-0.5
Texto
-1
Simple
-1.5
-2
-2.5
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.6. Графики функции 𝝎(𝑺𝒑𝟏 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑮𝒁𝑰𝑷) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟏 , 𝑪𝒊
, 𝑮𝒁𝑰𝑷), при 𝝋 = 𝟏𝟎𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟏𝟎 Кбайт.
Среднеквадратическое отклонение значений 𝝎 стеготекста и обычного
текста составляет 𝝈𝒕𝒆𝒙𝒕𝒐 = 𝟎. 𝟎𝟐𝟒𝟏 и 𝝈𝒔𝒊𝒎𝒑𝒍𝒆 = 𝟎. 𝟐𝟏𝟖𝟏 соответственно.
Математическое ожидание 𝑴𝒕𝒆𝒙𝒕𝒐 = 𝟎. 𝟏𝟑𝟒𝟗 и 𝑴𝒔𝒊𝒎𝒑𝒍𝒆 = −𝟏. 𝟖𝟎𝟔𝟒.
Мы видим, что предположение о влиянии содержимого специального
контейнера на степень сжатия добавляемого текста подтверждается.
2
Для краткости, будем обозначать любые естественные тексты - Simple.
32
Для высокой эффективности разрабатываемого стегоанализа необходимо,
чтобы множества значений 𝝎, соответствующих тексту и стеготексту,
никогда не пересекались. Однако в нашем случае мы не можем
гарантировать, что они не пересекутся, так как было рассмотрено всего 100
контейнеров. Мы можем говорить лишь о малой вероятности наступления
такого события.
На следующем рисунке изображена другая пара графиков при выбранном
значении 𝑺𝒑 = 𝑺𝒑𝟐 .
0.4
0.2
Значение ω
0
-0.2
Texto
-0.4
Simple
-0.6
-0.8
-1
-1.2
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.7. Графики функции 𝝎(𝑺𝒑𝟐 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑮𝒁𝑰𝑷) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟐 , 𝑪𝒊
, 𝑮𝒁𝑰𝑷), при 𝝋 = 𝟏𝟎𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟏𝟎 Кбайт.
Среднеквадратическое отклонение значений 𝝎 стеготекста и обычного
текста составляет 𝝈𝒕𝒆𝒙𝒕𝒐 = 𝟎. 𝟎𝟐𝟎𝟎 и 𝝈𝒔𝒊𝒎𝒑𝒍𝒆 = 𝟎. 𝟐𝟓𝟑𝟖 соответственно.
Математическое ожидание 𝑴𝒕𝒆𝒙𝒕𝒐 = 𝟎. 𝟎𝟖𝟎𝟖 и 𝑴𝒔𝒊𝒎𝒑𝒍𝒆 = −𝟎. 𝟓𝟕𝟎𝟎.
Из графиков, представленных на рис. 1.7 видно, что множества
значений функции 𝝎 для стеготекста от обычного текста пересекаются.
Это указывает на возможные ошибки при стегоанализе. Таким образом,
мы делаем вывод, что для построения анализа при выбранном параметре
33
𝒂𝒓𝒄 = ′𝑮𝒁𝑰𝑷′ следует использовать в качестве специального контейнера −
𝑺𝒑𝟏 .
Теперь рассмотрим следующую пару рисунков, при 𝒂𝒓𝒄 = ′𝒁𝑰𝑷′.
0.5
0
Значение ω
-0.5
Texto
-1
Simple
-1.5
-2
-2.5
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
𝒔𝒊𝒎𝒑𝒍𝒆
Рис. 1.8. Графики функции 𝝎(𝑺𝒑𝟏 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝒁𝑰𝑷) и 𝝎(𝑺𝒑𝟏 , 𝑪𝒊
𝒊
, 𝒁𝑰𝑷),
при 𝝋 = 𝟏𝟎𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟏𝟎 Кбайт.
Здесь на рис. 1.8 𝝈𝒕𝒆𝒙𝒕𝒐 = 𝟎. 𝟎𝟐𝟒𝟏 и 𝝈𝒔𝒊𝒎𝒑𝒍𝒆 = 𝟎. 𝟐𝟏𝟖𝟎. 𝑴𝒕𝒆𝒙𝒕𝒐 =
𝟎. 𝟎𝟐𝟔𝟕 и 𝑴𝒔𝒊𝒎𝒑𝒍𝒆 = −𝟏. 𝟗𝟏𝟒𝟔.
0.2
0
Значение ω
-0.2
-0.4
Texto
Simple
-0.6
-0.8
-1
-1.2
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
𝒔𝒊𝒎𝒑𝒍𝒆
Рис. 9. Графики функции 𝝎(𝑺𝒑𝟐 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝒁𝑰𝑷) и 𝝎(𝑺𝒑𝟐 , 𝑪𝒊
𝒊
при 𝝋 = 𝟏𝟎𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟏𝟎 Кбайт.
, 𝒁𝑰𝑷),
34
Здесь
на
рис.
𝝈𝒕𝒆𝒙𝒕𝒐 = 𝟎. 𝟎𝟐𝟎𝟎
1.9
и
𝝈𝒔𝒊𝒎𝒑𝒍𝒆 = 𝟎. 𝟐𝟓𝟑𝟖.
𝑴𝒕𝒆𝒙𝒕𝒐 = −𝟎. 𝟎𝟐𝟕𝟐 и 𝑴𝒔𝒊𝒎𝒑𝒍𝒆 = −𝟎. 𝟔𝟕𝟖𝟐.
Графики, соответствующие архиваторам GZIP и ZIP, практически
совпадают. Как и в предыдущем случае, при 𝒂𝒓𝒄 = ′𝒁𝑰𝑷′ следует выбирать
в качестве специального контейнера 𝑺𝒑𝟏 .
Рассмотрим другую пару графиков, представленных на рис. 1.10
и рис. 1.11.
1.6
1.4
Значение ω
1.2
1
0.8
Texto
0.6
Simple
0.4
0.2
0
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.10. Графики функции 𝝎(𝑺𝒑𝟏 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟏 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟏𝟎𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟏𝟎 Кбайт.
Здесь на рис. 1.10 𝝈𝒕𝒆𝒙𝒕𝒐 = 𝟎. 𝟎𝟐𝟏𝟔 и 𝝈𝒔𝒊𝒎𝒑𝒍𝒆 = 𝟎. 𝟎𝟑𝟏𝟎. 𝑴𝒕𝒆𝒙𝒕𝒐 =
𝟎. 𝟑𝟏𝟏𝟑 и 𝑴𝒔𝒊𝒎𝒑𝒍𝒆 = 𝟏. 𝟑𝟓𝟗𝟓.
В отличие от предыдущих случаев выбранный архиватор BZIP2
обеспечивает малые значения 𝝈𝒕𝒆𝒙𝒕𝒐 и 𝝈𝒔𝒊𝒎𝒑𝒍𝒆 , как в случае выбора параметра
𝑺𝒑 = 𝑺𝒑𝟏 , так и 𝑺𝒑 = 𝑺𝒑𝟐 . Можно сказать, что значение функции
𝝎
существенно
зависит
от
происхождения
текста
(искусственный
или естественный). При этом влияние вида обычного текста (научный,
художественный, …) является незначительным.
35
3
2.5
Значение ω
2
1.5
Texto
1
Simple
0.5
0
-0.5
-1
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.11. Графики функции 𝝎(𝑺𝒑𝟐 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟐 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟏𝟎𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟏𝟎 Кбайт.
Здесь на рис. 1.11 𝝈𝒕𝒆𝒙𝒕𝒐 = 𝟎. 𝟎𝟑𝟑𝟐 и 𝝈𝒔𝒊𝒎𝒑𝒍𝒆 = 𝟎. 𝟎𝟓𝟐𝟒. 𝑴𝒕𝒆𝒙𝒕𝒐 = −𝟎. 𝟒𝟏𝟖𝟗
и 𝑴𝒔𝒊𝒎𝒑𝒍𝒆 = 𝟐. 𝟑𝟕𝟑𝟔.
Итак, мы будем использовать параметры 𝑺𝒑 = 𝑺𝒑𝟐 и 𝒂𝒓𝒄 =′ 𝑩𝒁𝑰𝑷𝟐′
по следующим причинам:
a) При выборе архиватора BZIP2 значения функции 𝝎 существенно
зависят только от происхождения текста. Любые другие влияющие
факторы
могут
потребовать
корректировки
схемы
анализа,
что является нежелательным.
b) При выборе контейнера 𝑺𝒑𝟐 разность между 𝑴𝒔𝒊𝒎𝒑𝒍𝒆 и 𝑴𝒕𝒆𝒙𝒕𝒐 больше,
чем при 𝑺𝒑𝟏 , что дает возможность в дальнейшем уменьшать размер
анализируемого контейнера при сохранении уровня вероятности
появления ошибок стегоанализа.
36
1.4.4 Поиск оптимальных параметров работы алгоритма
Эффективная работа алгоритма стегоанализа предполагает низкую
вероятность ошибки при малых объемах входных данных. В предыдущем
разделе размер входных данных был достаточно большим и составлял
𝑪𝒔𝒊𝒛𝒆 = 𝟏𝟎 Кбайт. Для повышения эффективности работы метода мы будем
уменьшать размер анализируемого контейнера 𝑪𝒔𝒊𝒛𝒆 и соответственно
значение
𝝋.
Повышение
эффективности
ограничено
некоторым
минимальным размером анализируемого контейнера, при котором значения
функций 𝝎 соответствующее естесственному тексту и стеготексту начинают
пересекаться.
3
2.5
2
Texto
Значение ω
1.5
1
Simple
0.5
0
-0.5
-1
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.12. Графики функции 𝝎(𝑺𝒑𝟐 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟐 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟖𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟖 Кбайт.
37
3
2.5
2
Значение ω
1.5
Texto
1
Simple
0.5
0
-0.5
-1
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.13. Графики функции 𝝎(𝑺𝒑𝟐 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟐 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟔𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟔 Кбайт.
3
2.5
2
Значение ω
1.5
Texto
1
Simple
0.5
0
-0.5
-1
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.14. Графики функции 𝝎(𝑺𝒑𝟐 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟐 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟒𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟒 Кбайт.
38
3.5
3
2.5
Значение ω
2
Texto
1.5
Simple
1
0.5
0
-0.5
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.15. Графики функции 𝝎(𝑺𝒑𝟐 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟐 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟐𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟐 Кбайт.
2.5
2
Значение ω
1.5
Texto
1
Simple
0.5
0
-0.5
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.16. Графики функции 𝝎(𝑺𝒑𝟐 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟐 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟏𝟎 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟏 Кбайт.
39
2
1.5
Значение ω
1
0.5
Texto
0
Simple
-0.5
-1
-1.5
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.17. Графики функции 𝝎(𝑺𝒑𝟐 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟐 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟖 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟖𝟎𝟎 байт.
Мы видим, что при указанных параметрах множества значений 𝝎
для текста и стеготекста пересекаются. В ходе исследования был найден
такой контейнер 𝑺𝒑𝟑 , полученный с помощью программы Nicetext,
позволивший продолжить уменьшение размера анализируемого контейнера.
2
1.5
Значение ω
1
Texto
0.5
Simple
0
-0.5
-1
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.18. Графики функции 𝝎(𝑺𝒑𝟑 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟑 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟖 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟖𝟎𝟎 байт.
Значение ω
40
1.4
1.2
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
Texto
Simple
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файлов
Рис. 1.19. Графики функции 𝝎(𝑺𝒑𝟑 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟑 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟒 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟒𝟎𝟎 байт.
В конечном итоге был найден контейнер 𝑺𝒑𝟒 , обеспечивающий
наиболее высокую эффективность работы анализа.
3
2
Значение ω
1
Texto
0
Simple
-1
-2
-3
-4
1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97
Номер файла
Рис. 1.20. Графики функции 𝝎(𝑺𝒑𝟒 , 𝑪𝒕𝒆𝒙𝒕𝒐
, 𝑩𝒁𝑰𝑷𝟐) и
𝒊
𝒔𝒊𝒎𝒑𝒍𝒆
𝝎(𝑺𝒑𝟒 , 𝑪𝒊
, 𝑩𝒁𝑰𝑷𝟐), при 𝝋 = 𝟒 Кбайт, 𝑪𝒔𝒊𝒛𝒆 = 𝟒𝟎𝟎 байт.
41
В ходе дальнейших экспериментов при других наборах данных было
установлено, что для стегоанализа следует использовать пару значений:
𝝎𝟏 = 𝝎(𝑺𝒑𝟑 , 𝑪, 𝑩𝒁𝑰𝑷𝟐) и 𝝎𝟐 = 𝝎(𝑺𝒑𝟒 , 𝑪, 𝑩𝒁𝑰𝑷𝟐).
Например, на следующих рис. 1.21 и рис. 1.22 представлены графики
значений функции 𝝎𝟏 и 𝝎𝟐 для 1000 пустых и 1000 заполненных
контейнеров. (Для наглядности значения 𝝎𝟏 отсортированы по возрастанию.)
3
2.5
Значения ω
2
1.5
Значения ω1
1
Значения ω2
0.5
0
1 53 105157 209261 313 365 417 469 521573 625677 729781 833 885 937 989
-0.5
-1
Номер файла
Рис. 1.22. Графики функции 𝝎𝟏 и 𝝎𝟐 для контейнеров 𝑪𝒕𝒆𝒙𝒕𝒐
.
𝒊
2
1.5
1
0.5
Значения ω
0
Значения ω1
-0.5
Значения ω2
-1
-1.5
-2
-2.5
-3
1
100
199
298
397
496
595
694
793
892
991
Номер файла
𝒔𝒊𝒎𝒑𝒍𝒆
Рис. 1.23. Графики функции 𝝎𝟏 и 𝝎𝟐 для контейнеров 𝑪𝒊
.
42
Из
графиков
становится
видно,
что
если
выполняется
условие:
(𝝎𝟏 > 𝟎. 𝟗)ИЛИ(𝝎𝟐 < 𝟏), то следует считать, что анализируемый контейнер
пуст, иначе – заполнен.
Итак, мы выяснили, что в качестве архиватора следует использовать
BZIP2, и минимальный размер анализируемого контейнера составляет 400
байт. В ходе ряда экспериментов на разных наборах данных было
установлено, что для стегоанализа следует использовать пару значений:
𝝎𝟏 и 𝝎𝟐 .
Таким образом, построенная схема стегоанализа состоит из нескольких
шагов:
1. В специально подобранные контейнеры (𝑺𝒑𝟑 и 𝑺𝒑𝟒 )3 дописывается
содержимое анализируемого контейнера 𝑪.
2. Производится сжатие полученных контейнеров с помощью архиватора
BZIP2.
3. Производится расчет значений 𝝎𝟏 = 𝝎(𝑺𝒑𝟑 , 𝑪, 𝑩𝒁𝑰𝑷𝟐)
и 𝝎𝟐 = 𝝎(𝑺𝒑𝟒 , 𝑪, 𝑩𝒁𝑰𝑷𝟐).
4. Исходя
из
полученных
значений
(𝝎𝟏
и
𝝎𝟐 )
осуществляется
определение факта наличия или отсутствия стеготекста в контейнере.
1.5
Экспериментальная
проверка
эффективности
разработанной схемы стегоанализа
Для сравнения нового метода с ранее известными аналогами,
необходимо
определить
эффективность
разработанного
метода
экспериментально. В качестве критерия эффективности возьмем процентное
отношение числа правильных распознаваний содержимого контейнера
к общему количеству попыток.
3
Содержимое специальных контейнеров будет приведено в приложении A.1
43
Для эксперимента была сформирована выборка, состоящая из 10000
случайно отобранных файлов содержащих обычный текст и 10000
содержащих стеготекст. Каждый файл, содержащий стеготекст, был получен
с помощью программы Texto следующим образом. На вход программе
подавался
файл,
содержащий
псевдослучайную
последовательность
(имитирующий зашифрованное сообщение). На выходе программы создается
файл содержащий стеготекст.
Для каждого файла выборки производился стегоанализ с помощью
разработанного программного средства, рассчитывались характеристики,
по которым определялось наличие стеготекста. Были получены следующие
результаты:
Таблица 1.5. Результаты работы программы.
Количество
Количество
правильных
неправильных
определений
определений
Обычный текст
10000
0
Стеготекст
9998
2
Содержимое контейнера
Таким образом, результаты эксперимента показывают, что ошибка I рода
составляет 0,02%, ошибка II рода отсутствует.
Теперь рассмотрим диаграмму эффективности работы стегоанализа,
когда размер анализируемого контейнера 𝑪𝒔𝒊𝒛𝒆 ≤ 𝟒𝟎𝟎 байт, представленную
на рис. 1.24.
В таком случае, естественный текст продолжает распознаваться
без ошибок, а для искусственного текста вероятность ошибки возрастает
по мере уменьшения размера контейнера. Однако из рис. 1.24 видно,
что при 𝑪𝒔𝒊𝒛𝒆 ≤ 𝟐𝟓𝟎 байт предложенный метод быстро деградирует.
Точность обнаружения, %
44
120
100
92.2
95
250
300
99.4
99.9
350
400
77.5
80
60.4
60
40
20
0
200
220
Размер контейнера, байт
Рис. 1.24. Диаграмма точности работы метода при уменьшении размера
контейнера.
Теперь сравним разработанный метод с существующими аналогами
(Chen Z. и др. 2008(1) [12], Chen Z. и др. 2008(2) [13]). Ниже на рис. 1.25,
был построен график зависимости точности обнаружения от размера
контейнера, различных схем стегоанализа.
120
Точность обнаржения, %
100
80
Chen Z. и др.
2008 (1)
Новый
метод
Chen Z. и др.
2008 (2)
60
40
20
0
200
400
1000
2000
3000
4000
5000
Размер контейнера, байт
Рис. 1.25. Сравнительные графики эффективности работы методов
стегоанализа контейнеров, полученных с помощью программы Texto.
45
Таким образом, мы видим, что предложенный метод позволяет
эффективно решать задачу обнаружения скрытой информации в текстовые
контейнеры. Ошибка I рода составляет 0,02%, ошибка II рода отсутствует,
для текстовых фрагментов размером 400 байт, полученных с помощью
программы Texto. Более того, анализ контейнера занимает сравнительно
мало времени (порядка 0.1-0.5 сек) на современных персональных
компьютерах.
Выводы
Итак, в данной главе был построен метод стегоанализа текстовых
данных базирующийся на сжатии. В ходе эксперимента было установлено,
что предложенная схема позволяет эффективно обнаруживать стеготекст
при
малых
объемах
входных
данных.
По
результатам
проверки
эффективности работы метода был сделан вывод о том, что разработанный
алгоритм превосходит другие современные аналоги.
46
Глава 2. МЕТОД СТЕГОАНАЛИЗА ТЕКСТОВЫХ ДАННЫХ,
БАЗИРУЮЩИЙСЯ НА СТАТИСТИЧЕСКОМ ТЕСТЕ
В
главе
1
были
подробно
рассмотрены
различные
методы
стеганографии и стегоанализа текстовых файлов. В этой части диссертации
мы остановимся на методе встраивания скрытой информации, описанном
в статье [3]. В настоящей работе будет предложен метод обнаружения
секретных
сообщений
в
текстовых
контейнерах,
базирующийся
на статистическом тесте. Ниже будут рассмотрены известные подходы
стегоанализа для рассматриваемого метода внедрения.
2.1 Обзор существующих методов стегоанализа текстовых файлов
В первой главе диссертации был рассмотрен метод встраивания
информации, базирующийся на замене слов на синонимы. Как уже было
отмечено, подход обладает достаточно высокой степенью устойчивости
к анализу, так как в получаемый стеготекст не привносятся дополнительные
ошибки (например грамматические), и смысловая нагрузка предложений
сохраняется.
Несмотря на перечисленные достоинства, можно отметить наличие
следующего недостатка, например, возможное нарушение стиля написания
текста:
«(0). . . and make it still better, and say nothing of the bad – belongs
to you alone.
(1). . . and make it still better, and say nada of the bad – belongs
to you alone.»[18]
Можно утверждать, что использование слова “nada” является
нетипичным для некоторых авторов, (в частности, Jane Austen), и может
47
вызывать
подозрение.
Указанный
недостаток
можно
использовать
в стегоанализе.
Многие работы, посвященные стегоанализу метода замены синонимов,
для
получения
стеготекста
используют
широко
известную
стеганографическую программу Tyrannosaurus Lex (доступную по адресу
[3]). На рис. 2.1 рассмотрен принцип ее работы:
Исходный текст:
A rarefied gas glueyness interdependent with the temperature.
Now this artificial object has millimicron size.
poor
sparse
rarefied
ropiness
glueyness
gumminess
gluiness
viscidity
millimicron
micromillimeter
micromillimetre
Наборы
синонимов
Объем внедрения
3 ∗ 5 ∗ 3 = 45 𝑙𝑜𝑔2 45 = 5 бит
101102 = 2210
Полученный стеготекст:
A sprase gas gumminess interdependent with the temperature.
Now this artificial object has millimicron size.
Рис. 2.1. Схематичное представление принципа работы
стеганографической программы Tyrannosaurus Lex.
Рассмотрим исходный текст, состоящий из двух предложений.
На первом шаге находятся слова (выделены жирным шрифтом), имееющие
некоторый набор синонимов. На втором шаге производится расчет объема
внедрения. В нашем случае имеются наборы синонимов размером
по 3, 5 и 3 слов соответственно. Следовательно, возможно получить
45
различных
вариантов
текста.
Таким
образом,
можно
скрыть
5 бит информации. На следующем шаге внедряемое сообщение (битовая
последовательность “10110”) переводится в число десятичной системы
счисления. Полученное число есть номер комбинации предложения. В итоге
48
мы
получаем
текст,
содержащий
скрытое
сообщение.
Извлечение
информации из контейнера производится аналогичным образом. Ниже будут
рассмотрены известные методы стегоанализа текстовых контейнеров,
полученных с помощью выше описанной программы [3].
Опубликованный в работе [18] подход стегоанализа предполагает
выявлять нарушение семантических правил английского языка. Рассмотрим
следующий пример: при встраивании сообщения во фразу “what time is it?”,
слово
“time”
может
быть
заменено
на
“period”
или
“duration”,
что некорректно для английского языка. При анализе текста, полученного
программой [3], ошибка I рода составляет 61.4 %. Ошибка II рода – 15.1 %.
Стоит отметить, что данный уровень ошибок получается при анализе одного
предложения. Следовательно, анализ текста, состоящего из нескольких
предложений, будет более эффективным. Данный метод требует достаточно
много времени работы.
Еще один метод стегоанализа предложен в работе [19]. Авторы
предлагают использовать контекст слов для выявления факта внедрения.
Поясним основную идею метода на следующем примере. Под контекстом
слова “intersect” размером четыре понимается два слова с права и слева
(контекст выделен жирным шрифтом: “Synonym sets do intersect with each
other”).
Для
подходящим
указанного
оно
слова
является
предлагается
для
оценивать
текущего
насколько
контекста.
В статье объясняется принцип оценивания следующим образом:
Чтобы пояснить принцип оценивания, введем некоторые обозначения.
Пусть 𝒘 – оцениваемое слово (в нашем случае “intersect”). Тогда 𝒇(𝒘) –
частота встречаемости слова в большом наборе текстов. 𝒇(𝒘, 𝑪) – частота
слова 𝒘 с контекстом 𝑪. Таким образом, из двух слов 𝒂 и 𝒃 для заданного
контекста 𝑪 следует считать подходящим слово 𝒂, если выполняется
одно из следующих условий:
49
1. (𝒇(𝒂) = 𝒇(𝒃))⋀(𝒇(𝒂, 𝑪) > 𝒇(𝒃, 𝑪)), то есть при одинаковой частоте
встречаемости
слов
𝒂
и
𝒃
считают
подходящим
слово
𝒂,
если
оно встречается чаще с указанным контекстом 𝑪, чем слово 𝒃.
2. (𝒇(𝒂, 𝑪) = 𝒇(𝒃, 𝑪))⋀(𝒇(𝒂) > 𝒇(𝒃)),
при
одинаковой
частоте
встречаемости слов 𝒂 и 𝒃 с учетом контекста 𝑪 считают подходящим слово
𝒂, если оно чаще встречается в текстах (без учета контекста).
3. (𝒇(𝒂) < 𝒇(𝒃))⋀(𝒇(𝒂, 𝑪) > 𝒇(𝒃, 𝑪)), даже если слово 𝑎 встречается
реже слова 𝑏, но в заданном контексте 𝐶 чаще используется слово 𝑎,
то его считают подходящим. Например, в типичном тексте слово unaccredited
может встречаться чаще, чем unlicensed, но при определенном контексте,
как в случае с предложением “You use unlicensed software”, употребляется
только unlicensed. Следовательно, в данном примере слово unlicensed
является подходящим.
В табл. 2.1 показана эффективность работы метода. Мы видим,
что указанный подход обеспечивает высокую точность работы при малом
объеме входных данных.
Таблица 2.1. Вероятности ошибок работы метода, учитывающего контекст
слова.
Объем
внедрения
20 бит
64 бит
Ошибка I
рода
13.9 %
7.8 %
Ошибка II
рода
22.3 %
8.9 %
На сегодняшний день самым точным следует считать метод,
опубликованный в работе [20]. Авторы предлагают оценивать равномерность
выбора синонима в предложении. Очевидно, что в предложениях со скрытой
информацией выбор синонима выглядит более случайным. На больших
наборах текстовых контейнеров (пустых и заполненных) производится сбор
статистической
информации,
характеризующей
выбор
синонима
50
с использованием программы
SVM [11], т.е. происходит обучение
на известных наборах данных. Далее, анализируя любой подозрительный
контейнер, используя аналогичную статистическую информацию, можно
определить наличие факта передачи секретного сообщения. Указанный метод
работает с высокой точностью при малых объемах входных данных.
На рис. 2.2 указан график зависимости точности работы метода от числа
замененных слов.
100
Точность стегоанализа, %
99
98
97
96
95
Chen Z. и
др. (2011)
94
93
92
91
90
10
20
30
40
50
60
70
80
90
100
Количество замененных слов
Рис. 2.2. Эффективность работы стегоанализа выявляющего случайность
выбора синонима.
Под
точностью
понимается
отношение
числа
правильных
срабатываний метода (на пустых и заполненных контейнерах) к общему
количеству контейнеров. Для программы Tyrannosaurus-Lex принято считать,
что замена каждого слова синонимом соответствует, приблизительно, одному
биту внедренного сообщения. Мы видим, что даже при 10 замененных словах
метод работает достаточно эффективно.
51
2.2 Построение схемы стегоанализа текстовых данных
2.2.1 Описание предлагаемого подхода
Предлагаемый метод стегоанализа текстовых данных основывается
на следующей идее. Известно, что перед внедрением передаваемое секретное
сообщение
что
будет
предварительно
зашифрованная
последовательность
зашифровано1.
выглядит
как
Считается,
случайная.
Следовательно, извлекаемое из заполненного контейнера стегосообщение
также будет выглядеть как случайное. Идея предлагаемого метода базируется
на предположении о том, что сообщение, извлеченное из пустого контейнера,
выглядит менее случайным, чем зашифрованное сообщение. Таким образом,
извлекая и анализируя сообщение из любого контейнера, мы сможем
определять факт наличия внедрения. В нашем методе случайность
определяется с помощью статистического теста.
На рис. 2.3 представлена схема работы предлагаемого метода
стегоанализа. Из контейнера извлекается сообщение. Далее, его разбивают
на элементы размером 𝑳 бит. Для анализа используется 𝑵 таких элементов.
контейнер
?
сообщение
N
извлечение
100|101|101|110|0...
L
L – размер элементов в битах
N – количество элементов
Рис. 2.3. Схема предлагаемого метода стегоанализа
В отличие от предыдущих известных подходов, предлагаемая схема
является относительно
1
простой и не требует каких-либо
Как правило, сообщение в открытом виде не передается.
словарей
52
или
баз данных, хранящих
статистические характеристики
текстов,
необходимых для анализа.
2.2.2 Выбор статистического теста
Как уже было отмечено, для построения стегоанализа нам необходим
статистический
тест,
последовательность,
который
позволит
полученную
из
различить
пустого
двоичную
контейнера
от последовательности из заполненного контейнера. Выбор такого теста
влияет на эффективность предлагаемой схемы стегоанализа. Простейшим
тестом,
проверяющим
соответствие
последовательности
некоторому
распределению, является тест хи-квадрат [21]. В данной работе указанный
тест
используется
для
проверки
на
соответствие
равномерному2
распределению серий бит анализируемой последовательности.
Сравнение эмпирического закона распределения случайной величины
и теоретического производится при помощи специального правила –
критерия
согласия
Пирсона.
Существует
две
гипотезы
Н0 о
том,
что анализируемая последовательность подчиняется равномерному закону
распределения, и альтернативная гипотеза На о том, что последовательность
не подчиняется равномерному закону распределения. По результатам теста
одна из гипотез принимается, а другая отвергается.
Рассмотрим следующий пример. Пусть имеется последовательность
битовых
серий
длины
2
бита:
00,10,01,10,00,11,10,00,11,01,00,01,10,01,11.
подчиняется
ли
появление
битовых
x=10,00,11,01,10,00,10,01,11,
Необходимо
серий
закону
выяснить
равномерного
распределения. Для этого используется статистика:
2
Появление различных серии бит равновероятно и между их появлениями
отсутствуют закономерности.
53
𝑀
(𝐸𝑖 − 𝑇𝑖 )2
𝑥 =∑
𝑇𝑖
2
𝑖=1
где 𝑀 – число различных серий; 𝐸𝑖 – фактическое число i-ой серии в данной
последовательности; 𝑇𝑖 – ожидаемое число появлений i-ой серии. Вычислим
значение статистики для нашего примера. Так как серия состоит из двух бит,
то число различных серий равно 𝑀 = 4. Вероятность появления каждой
серии одинакова и равна 𝑃𝑖 = 0.25.
𝑇𝑖 = вероятность серии ∗ общее число серий = 𝑃𝑖 ∗ 𝑁 = 0.25 ∗ 24 = 6.
𝑥2
Распределение
асимптотически
сходится
к
так
называемому
распределению хи-квадрат. Считается, что на практике распределения
𝑥 2 и хи-квадрат совпадаю при выполнении условия, что все 𝑇𝑖 больше 5.
Таким образом получаем:
(6 − 6)2 (6 − 6)2 (7 − 6)2 (5 − 6)2
𝑥 =
+
+
+
= 0. (3)
6
6
6
6
2
Гипотеза 𝐻0 принимается, если для заданного уровня значимости3
(в
нашем
примере
возьмем
𝑎 = 0.1)
вычисленное
значение
𝜒 2 не превосходит квантиль распределения с 𝑀 − 1 степенями свободы.
В остальных случаях принимается гипотеза 𝐻𝑎 . В нашем случае
2
𝜒(0.1,3)
= 0.5844
следовательно,
Таким
образом,
Вывод:
появление
гипотеза
битовых
𝐻0
найденное
значение
принимается,
серий
в
исходной
а
𝐻𝑎
2
𝑥 2 < 𝜒(0.1,3)
.
отвергается.
последовательности
подчиняется закону равномерного распределения.
3
Вероятность того, что найденное значение статистики превзойдет квантиль
распределения.
54
2.2.3 Поиск оптимальных параметров работы метода
В предыдущем разделе главы мы установили, что для построения
схемы стегоанализа следует использовать статистический тест хи-квадрат.
Далее, необходимо определить остальные параметры работы метода. В ходе
экспериментов будут подбираться такие значения параметров 𝑵 и 𝑳
(𝑵 – количество битовых серий, 𝑳 – длина одной серии), при которых
стегоанализ проходит наиболее эффективно. Для этого была сформирована
выборка контейнеров, состоящая из текстовых файлов (художественные
произведения
на
английском
языке
[23])
общим
размером
в 150 Мб. Затем извлекалось стегосообщение до заполнения контейнера
и после. Далее, применялся тест хи-квадрат для выявления случайности
распределения элементов (длинны 𝑳). При заполнении контейнеров
(необходимых для проведения нашего эксперимента) рассматривалось
два случая:
 внедренное сообщение − это естественный текст на английском языке;
 внедренное сообщение − это зашифрованный текст (мы будем
имитировать его псевдослучайной последовательностью).
Рассмотрим
случай,
когда
внедренное
сообщение
является
естественным текстом на английском языке. Было установлено, что в этом
случае сообщение, полученное из пустого контейнера, выглядит более
случайным4, чем извлеченное из заполненного. В табл. 2.2 и табл. 2.3
приведены результаты 400 попыток определения наличия стеготекста
предложенным методом.
4
Под случайностью понимается степень близости к равномерному
распределению.
55
Таблица 2.2. Результаты работы стеготеста при 𝑵𝝐[𝟑𝟎𝟎; 𝟏𝟎𝟎𝟎], если
внедренное сообщение является естественным текстом на английском языке.
N=1000
Размер
элемента
N=700
N=500
N=300
Род ошибки
I
II
I
II
I
II
I
II
L=1
58
30
44
47
34
61
28
77
L=2
72
14
59
33
45
52
35
74
L=3
83
9
64
23
49
42
34
65
L=4
97
5
95
21
86
42
68
68
L=5
84
1
68
9
50
24
33
51
Таблица 2.3. Результаты работы стеготеста при 𝑵𝝐[𝟏𝟓; 𝟏𝟎𝟎], если
внедренное сообщение является естественным текстом на английском языке.
N=100
Размер
элемента
N=70
N=30
N=15
Род ошибки
I
II
I
II
I
II
I
II
L=1
14
15
10
15
8
16
6
100
L=2
14
93
12
68
9
23
49
100
L=3
17
93
7
27
87
3
0
100
L=4
36
7
92
3
38
37
0
100
L=5
88
15
92
26
0
100
0
100
Из представленных результатов видно, что метод работает лучше всего
при 𝑵 = 𝟑𝟎 и 𝑳 = 𝟏.
Теперь рассмотрим случай, когда внедренное сообщение является
псевдослучайной последовательностью. Данная ситуация рассматривается
потому,
что
обычно
при
передаче
секретного
сообщения
56
его предварительно шифруют. Мы будем имитировать зашифрованное
сообщение последовательностью, полученной из генератора случайных
чисел5. В таком случае сообщение, извлеченное из пустого контейнера,
выглядит менее случайным, чем извлеченное из заполненного. Результаты
работы стеготеста представлены в табл. 2.4. и табл. 2.5.
Таблица 2.4. Результаты работы стеготеста при 𝑵𝝐[𝟑𝟎𝟎; 𝟏𝟎𝟎𝟎], если в
контейнер внедрено зашифрованное сообщение.
N=1000
Размер
элемента
N=700
N=500
N=300
Род ошибки
I
II
I
II
I
II
I
II
L=1
42
6
56
7
66
6
72
6
L=2
28
5
41
4
55
7
65
4
L=3
17
9
36
4
51
5
66
4
L=4
3
5
5
7
14
6
32
7
L=5
16
3
32
1
50
7
67
5
Таблица 2.5. Результаты работы стеготеста при 𝑵𝝐[𝟏𝟓; 𝟏𝟎𝟎], если в
контейнер внедрено зашифрованное сообщение.
N=100
Размер
элемента
5
N=70
N=30
N=15
Род ошибки
I
II
I
II
I
II
I
II
L=1
86
6
90
4
92
5
94
19
L=2
86
5
88
5
91
63
51
65
L=3
83
6
93
6
13
97
100
0
L=4
64
29
8
94
62
57
100
0
Здесь используется линейный конгруэнтный генератор случайных чисел.
57
L=5
12
92
8
88
100
0
100
0
Из представленных результатов видно, что стеготест работает лучше
всего при 𝑵 = 𝟏𝟎𝟎𝟎 и 𝑳 = 𝟒.
Подведем предварительные итоги. В табл. 2.6 представлены результаты
работы метода при различных типах внедряемых сообщений.
Таблица 2.6. Эффективность работы разработанной схемы стегоанализа
текстовых данных.
Род ошибки
Тип внедряемого
Размер входного
сообщения
I рода
II рода
сообщения
Естественный текст
Зашифрованный текст
8%
3%
16 %
5%
30 бит
4000 бит
2.2.4 Подбор оптимальной схемы стегоанализа
Далее, в ходе работы предлагается модифицировать предложенную
схему
стегоанализа.
Напомним,
что
в
предыдущем
разделе
главы
мы извлекали стегосообщение из текстового контейнера и разбивали
его на элементы по 𝑳 бит. Затем проверялась случайность распределения
этих элементов. Таким образом, производилось определение наличия факта
внедрения в контейнер. В ходе работы было установлено, что при 𝑵 = 𝟏𝟎𝟎𝟎
и 𝑳 = 𝟒 бит стегоанализ проходит наиболее эффективно6.
В целях повышения эффективности работы метода предлагается
модифицировать
тест
хи-квадрат
путем
использования
квантиля,
подбираемого эмпирически. На рис. 2.4 показан график значений хи-квадрат,
полученных от 100 сообщений, извлеченных из пустого контейнера, и от 100
6
Случай, когда в качестве внедренного сообщения выступает естественный
текст, не рассматривается по причине неактуальности.
58
сообщений из заполненных. Для наглядности значения были отсортированы
Значение хи-квадрат
по возрастанию и убыванию соответственно.
180
160
140
120
100
80
60
40
20
0
Пустой к.
Заполненный
к.
1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96 101
Номер файла
Рис. 2.4. Значения хи-квадрат, полученные для пустых и заполненных
контейнеров.
Мы видим, что кривые пересекаются. Это означает, что часть
сообщений, извлеченных из пустых контейнеров, статистически неразличимо
от сообщений, полученных из заполненных контейнеров. Следовательно,
предлагаемый метод стегоанализа будет ошибаться в ряде случаев. Подбирая
значение квантиля можно уменьшать ошибку I рода, при этом будет
увеличиваться ошибка II рода и наоборот. В дальнейшем, для повышения
эффективности работы метода мы будем подбирать значение квантиля
эмпирическим путем.
В настоящей работе для повышения точности работы стегоанализа
предлагается
дополнительно
использовать
“тест
со
смещением”,
представленный на рис. 2.5 .
Тест состоит из пяти шагов. На первом шаге извлеченное сообщение
(начиная с первого бита) разбивается на элементы размером 4 бита. Далее,
проверяется случайность распределения этих элементов (вышеописанным
способом). На каждом последующем шаге происходит отбрасывание одного
крайнего левого бита сообщения. Затем, производится аналогичное
59
разбиение на элементы и проверка на случайность. Если на одном из пяти
шагов сообщение признается неслучайным, то считается, что контейнер пуст.
сообщение
контейнер
?
извлечение
1011|0101|0001|001… - 1 шаг
10110|1010|0010|01… - 2 шаг
101101|0100|0100|1… - 3 шаг
…
1011|0101|0001|001… - 1 шаг
Рис. 2.5. Принципиальная схема работы теста со смещением.
2.3 Экспериментальная проверка эффективности работы
метода стегоанализа
В этом разделе главы мы переходим к описанию эксперимента, целью
которого
является
определение
эффективности
предложенной
схемы
стегоанализа. Как изображено на рис. 2.6, на первом этапе определяется
точность работы метода на пустых контейнерах. Набор текстов общим
размером в 400 Мб, состоящий из художественных произведений [23]
на английском языке, объединялся в один файл (Text). Затем, из этого файла
при
помощи
Полученную
на
отдельные
программы
Tyranozaurus
двоичную
последовательность
фрагменты
(frag).
Lex
Количество
извлекалось
сообщение.
(message)
разбивали
фрагментов
в
нашем
эксперименте составляет не менее 1000 шт. Далее, как показано на рис. 2.6,
каждый
такой
фрагмент
анализировался
с
помощью
разработанной
программы стегоанализа. На заключительном шаге подсчитывались ошибки
работы метода (ошибки I рода).
60
Рис. 2.6. Схема проведения эксперимента на пустых контейнерах
На втором этапе эксперимента определялась точность работы метода
на заполненных контейнерах. В отличие от предыдущего раздела 2.2.3, когда
секретное сообщение имитировалось при помощи линейного конгруэнтного
генератора случайных чисел, здесь оно получено с помощью шифра RC6.
Аналогично с первым этапом эксперимента полученное сообщение (message)
разбивалось на отдельные фрагменты (frag). Затем, каждый фрагмент
независимо от других анализировался с помощью разработанной программы
стегоанализа. На заключительном шаге подсчитывались ошибки работы
метода (ошибки II рода). По результатам проведения эксперимента были
построены табл. 2.6 и табл. 2.7 .
Таблица 2.6. Результаты проведения эксперимента
при 𝑵 ∈ [𝟔𝟎𝟎; 𝟏𝟎𝟎𝟎].
Квантиль
28
Значение N
Род
ошибки
1000
900
800
700
600
1 рода
1.0
1.5
2.5
4.9
7.9
2 рода
5.1
4.9
5.8
6.3
5.7
61
33
45
1 рода
2.3
3.0
5.2
9.2
12.3
2 рода
1.9
1.7
1.1
1.7
1.7
1 рода
9.4
12.7
16.2
21.2
29.3
2 рода
0.0
0.0
0.0
0.0
0.0
Таблица 2.7. Результаты проведения эксперимента
при 𝑵 ∈ [𝟏𝟎𝟎; 𝟓𝟎𝟎].
Квантиль
28
33
45
ошибки
500
400
300
200
100
1 рода
11.7
17.8
28.0
48.9
74.7
2 рода
4.6
4.3
5.5
6.1
4.5
1 рода
18.8
27.6
45.8
67.7
83.8
2 рода
1.2
1.2
1.1
1.9
1.5
1 рода
43.5
66.5
78.5
86.1
92.8
2 рода
0.0
0.0
0.1
0.1
0.0
Подытожим
со
смещением”
стегоанализа.
Значение N
Род
результаты.
позволил
Также
было
Как
показали
незначительно
установлено,
эксперименты,
увеличить
что
при
“тест
эффективность
анализе
следует
использовать следующие параметры 𝑵 = 𝟏𝟎𝟎𝟎 и 𝑳 = 𝟒 бит. В табл. 2.8
приведены основные результаты работы предложенной схемы стегоанализа.
Мы видим, что квантиль равный 33 позволяет получить наибольшую
точность работы стегоанализа.
62
Таблица 2.8. Результаты работы метода при различных значения
квантиля.
Квантиль
Род
ошибки
28
33
45
I рода
1.0 %
2.3 %
9.4 %
II рода
5.1 %
1.9 %
0.0 %
Выводы
Целью
этой
главы
ставилось
создание
метода
стегоанализа,
выявляющего заполнение текстового контейнера секретным сообщением,
при
помощи
программы
[3].
Разработанный
алгоритм
анализирует
извлеченное из контейнера сообщение, проверяя его на случайность. Таким
образом, мы построили эффективный стеготест, имеющий достаточно
простую реализацию, что положительно влияет на скорость его работы.
В табл. 2.9 произведено сравнение разработанного метода с известными
аналогами (Taskirian C. и др. 2006 [18], Yu Z. и др. 2009 [19], Chen Z.
и др. 2011 [20]).
Из представленных результатов видно, что предложенный метод
не уступает по точности работы современным аналогам. Несмотря на то,
что реализованный алгоритм требует сравнительно больший объем данных,
его реализация значительно более проста, чем у приведенных аналогов.
63
Таблица 2.9. Результаты сравнения метода с известными аналогами
Метод
Род ошибки
Chen Z.
и др. 2011
Yu Z.
и др. 2009
Taskirian C.
и др. 2006
Новый
I рода
2.3 %
7.8 %
61.4 %
2.3 %
II рода
0.5 %
8.9 %
15.1 %
1.9 %
Объем
входных
данных, бит
100-150
64
1-4
4000
64
Глава
3.
МЕТОД
СТЕГОАНАЛИЗА
ИСПОЛНЯЕМЫХ
ФАЙЛОВ, БАЗИРУЮЩИЙСЯ НА КОДЕ ХАФФМАНА
3.1 Введение
В предыдущей главе диссертации мы рассматривали методы внедрения
секретных сообщений в текстовые файлы. Напомним, что в качестве
контейнеров могут выступать различные типы данных, например, видео,
изображения и другие. Данная глава посвящена методам стеганографии
исполняемых файлов, которые рассматриваются как текст на искусственном
языке (машинном языке).
В отличие от других видов данных, использующихся для встраивания
скрытой
информации, применение исполняемых
файлов в
качестве
контейнера имеет свою специфику. Внедрение сообщения не может быть
осуществлено прямой модификацией бит программы, так как ее алгоритм
работы
с
высокой
долей
вероятности
разрушится.
Следовательно,
необходимо использовать такие методы встраивания, которые позволят
сохранить работоспособность программы.
Существует два направления развития методов внедрения информации
в исполняемые файлы.
Первое направление развития – это построение систем защиты
авторских прав. В каждую продаваемую копию программного продукта
с помощью специальных алгоритмов внедряется особое сообщение – водяной
знак, по которому, в случае обнаружения нелегальной (пиратской) копии,
с легкостью может быть прослежен исходный файл, с которого была снята
эта копия и, соответственно, пользователь, нарушивший лицензионное
соглашение. Очевидно, что внедряемый водяной знак должен обладать
некоторой степенью устойчивости, то есть противостоять удалению
65
или искажению. Считается, что заранее можно предугадать, содержится
ли водяной знак или нет. Ряд публикаций, например [25-32], посвящен
методам внедрения скрытой информации в программы. Подробно это
направление стеганографии будет рассмотрено в главе 4.
Второе направление развития стеганографии исполняемых файлов –
передача скрытых секретных сообщений. В данной работе речь пойдет
об этом направлении. За основу был взят метод, предложенный в статье [32].
Его основная идея состоит в том, чтобы размещать секретное сообщение в
неиспользуемых местах секций исполняемых файлов формата Portable
Executable (PE)1. Каждая секция такого файла должна быть размером
кратным полю FileAligment (см. документацию Microsoft [33]). Таким
образом, см. рис. 3.1, секция кода состоит из байтов инструкций программы и
нулевых байтов выравнивания, увеличивающих секцию до требуемых
размеров.
Рис. 3.1. Содержимое части секции кода исполняемого файла.
1
Portable Executable – формат исполняемых файлов (программ) используется
в операционных системах семейства Windows.
66
Авторы работы [32] предлагают вместо байтов выравнивания
записывать секретное сообщение. По их мнению, это имеет следующие
преимущества. Размер файла остается неизменным и внедренное сообщение
никак
что
не
влияет
передаваемое
на
ход
выполнения
сообщение
будет
программы.
Предполагается,
предварительно
зашифровано,
и для его прочтения необходимо знать секретный ключ, а также начальную
позицию сообщения в файле. Как будет показано ниже, данный подход
не является устойчивым из-за различных статистических свойств кода
программы и передаваемого зашифрованного сообщения.
Во многих работах, например [34], используется подход, применяющий
статистический анализ для выявления нетипичного для подавляющего
большинства исполняемых файлов набора команд, способов выделения
регистров, большой избыточности кода или неиспользуемых ветвей
программы (т.н. мертвый код). В настоящей работе предлагается новый
метод
стегоанализа,
предполагающий
использование
архиватора
для выявления случайности сообщения.
Известно, что зашифрованное сообщение выглядит как случайная
последовательность. А это означает, что при сжатии архиватором такой
последовательности ее размер более уменьшаться не может. Программа,
наоборот, имеет часто повторяющиеся наборы двоичных инструкций.
Архиватор
такие
повторения
обнаружит,
следовательно,
это
даст
уменьшение размера при сжатии. На этой особенности и основан
предлагаемый метод стегоанализа. Стоит отметить, что для выявления
случайности сообщения можно использовать не только архиваторы,
но и любой другой метод кодирования, применяющийся при сжатии данных.
В настоящей работе предлагается использовать кодирование Хаффмана.
67
3.2.
Описание
и
построение
предлагаемого
метода
стегоанализа
3.2.1 Описание предлагаемого метода
В данном разделе главы будет дано описание предлагаемого метода
стегоанализа исполняемых файлов. Ранее уже было упомянуто, что за основу
была взята схема встраивания, опубликованная в работе [32]. Указанный
метод внедрения предполагает записывать сообщение в конец секции кода
программы. Соответственно, для выявления факта внедрения необходимо
анализировать эту же часть секции. Таким образом, предлагаемая схема
стегоанализа состоит из следующих этапов:
1. Извлечение исполняемой секции из файла программы;
2. Удаление байтов выравнивания;
3. Кодирование последних 𝑾 байт секции2;
4. Заключительный этап определения факта внедрения.
Этап извлечения секции кода требует определенный уровень знания
PE формата. Для начала, необходимо найти смещение заголовка PE. Одно
из полей заголовка – Section headers указывает на массив заголовков секций,
каждый элемент которого описывает набор атрибутов секций файла, таких
как адрес начала, размер и атрибуты секции. Определять, является ли секция
кодовой (т.е. искомой), необходимо по значению бит характеристики.
Второй этап сводится к тривиальному удалению серии нулевых байт,
завершающих секцию, если таковые присутствуют. Подобная ситуация
может возникнуть, если была использована только часть допустимого объема
внедрения.
Третий этап основывается на особенности исходного метода внедрения
и заключается в том, что запись сообщения осуществляется в конец секции,
непосредственно
2
после
кода
программы.
Следовательно,
О выборе величины 𝑾 подробнее будет написано в разделе 3.2.3.
должен
68
производиться анализ этих последних байтов (предположительное место
размещения скрытого сообщения). Для простоты эту анализируемую часть
секции мы будем называть “окном”.
Уточним некоторые детали, связанные с выбором величины 𝑾. Здесь
следует стремиться к уменьшению размера окна по следующим причинам.
На
рис.
3.2
показана
ситуация
выбора
большого
размера
окна
(заштрихованная область). В этом случае, в окно попадет и скрытое
сообщение, и часть кода программы. На этапе кодирования стегосообщение
в размерах практически не уменьшится, а код, из-за частого повторения
одинаковых инструкций, «сожмется» значительно лучше. Следовательно,
в результате анализа таких разнородных данных нельзя однозначно
определить,
какими
статистическими
свойствами
(зашифрованного
сообщения или кода программы) обладает содержимое окна. Как следствие,
увеличение числа ошибок работы стегоанализа.
Если выбрать маленький размер окна, как показано на рис. 3.3,
то в таком случае, анализируемые байты будут состоять только из секретного
сообщения. Данные будут однородными, а это означает, что наш метод
стегоанализа будет работать более точно. В тоже время, очевидно,
что чем меньше размер окна, тем меньше повторяющихся инструкций может
оно содержать и, как следствие, код программы будет иметь меньше
статистических отличий от зашифрованного сообщения. Оптимальный
размер окна будет подбираться эмпирически в разделе 3.2.3.
На заключительном этапе по полученной длине кода можно
определить, принадлежит ли анализируемая последовательность к коду
программы или к зашифрованному сообщению.
69
Рис. 3.2. Выбор большого
окна.
Рис. 3.3. Выбор маленького окна.
3.2.2 Выбор архиватора
В этом разделе главе мы проанализируем работу различных
архиваторов и выберем среди них наиболее подходящий для нашего метода.
Итак, произведем сравнение следующих архиваторов: Bzip, Bzip2, Zip,
Rar, Paq8, Nanozip. Нам нужно выбрать такой архиватор, у которого размеры
сжатых
фрагментов
программ
и
зашифрованных
сообщений
будут
различаться. Исходя из того, что зашифрованное сообщение выглядит
как
случайная
последовательность
байт,
мы
будем
имитировать
его последовательностью, полученной с помощью генератора случайных
чисел. Далее, возьмем по 1000 фрагментов размером 80 байт (причины
выбора именно такого размера окна подробнее будут рассмотрены
в следующем разделе) сгенерированной случайной последовательности
и кода программы соответственно. Затем, произведем сжатие имеющихся
фрагментов различными архиваторами. Получившиеся длины сжатых
фрагментов будем представлять в виде интервалов. Строго говоря,
для каждого архиватора мы получим два интервала:
 интервал длин сжатых фрагментов случайной последовательности;
 интервал длин сжатых фрагментов кода.
70
В лучшем случае, эти два интервала не будут пересекаться.
Следовательно, при стегоанализе по размеру анализируемого фрагмента
можно будет однозначно определить, к какому типу данных он относится
(к коду или к секретному сообщению).
Таблица 3.1. Интервалы размеров фрагментов.
Интервалы
Архиватор
Случайная
последовательность
Код
Число
пересекающихся
элементов
Bzip2
[141;159]
[97;142]
2
Paq8
[112;126]
[75;126]
339
Rar
[148;151]
[128;151]
823
Nanozip
[132;135]
[113;135]
864
Bzip
[109;112]
[94;112]
959
Zip
[188;194]
[180;194]
994
Под числом пересекающихся элементов понимается количество
сжатых фрагментов, размеры которых попали в оба интервала (т.е. в данном
случае не получилось однозначно определить – это двоичные инструкции
программы или псевдослучайная последовательность). Из таблицы видно,
что наиболее подходящим архиватором для стегоанализа является Bzip2
(использующий преобразование Барроуза-Уилера и код Хаффмана), т.к. дает
минимальное количество пересекающихся элементов. Как уже отмечалось
ранее, вместо архиваторов можно использовать любой другой метод
кодирования, применяющийся для сжатия данных. Возьмем оптимальный
код Хаффмана. Для построения кода предварительно рассчитываются оценки
71
вероятностей появления каждого символа в окне. В качестве символа
мы будем брать один байт.
Рассмотрим подробнее процесс получения оценок вероятностей. Пусть
имеется алфавит 𝑨 = {𝒂𝟏 , 𝒂𝟐 , … , 𝒂𝑵 }, его мощность |𝑨| = 𝑵, где 𝑵 = 𝟐𝟓𝟔.
Будем говорить, что анализируемое окно состоит из символов алфавита 𝑨.
Причем символ 𝒂𝒊 есть байт равный 𝒊 − 𝟏. Введем множество счетчиков 𝑪 =
{𝒄𝟏 , 𝒄𝟐 , … , 𝒄𝑵 }. Каждый элемент этого множества содержит число повторений
соответствующего символа в окне. Следовательно, искомые оценки
вероятностей 𝑷 = {𝒑𝟏 , 𝒑𝟐 , … , 𝒑𝑵 } появления каждого символа в окне можно
вычислить по формуле:
𝒑𝒊 =
𝒄𝒊
𝑾
Далее, по полученным оценкам вероятностей строится дерево
Хаффмана. Содержимое окна кодируется, и по длине полученной
последовательности определяется наличие факта внедрения. Рассмотрим
интервалы для кода Хаффмана на той же выборке, что и вышеописанные
архиваторы.
Таблица 3.2. Интервалы размеров фрагментов.
Метод
кодирования
Код Хаффмана
Интервалы
Сл.
последов.
Код
Число пересекающихся
элементов
[58;64]
[19;53]
0
Как видно из табл. 3.2, в отличие от архиватора Bzip2, интервалы
не пересекаются, следовательно, возможно однозначное определение факта
внедрения скрытого сообщения. Таким образом, эмпирически было показано,
что для нашего метода стегоанализа следует использовать оптимальный
код Хаффмана.
72
3.2.3 Выбор оптимального размера окна
В предыдущем разделе главы размер окна был взят 𝑾 = 𝟖𝟎 байт.
Как будет показано ниже, причина выбора указанного значения обусловлена
тем,
что
обеспечивается
определение
факта
безошибочное
наличия
(на
внедрения
исследуемой
в
выборке)
исполняемый
файл
при минимальной длине окна.
Рассмотрим подробнее процесс подбора размера окна. Для поиска
минимально допустимого значения 𝑾 была взята та же выборка,
что и в разделе 3.2.2.
Производилось кодирование содержимого окна методом Хаффмана
при различных значениях 𝐖 (от 4 Кб до 40 байт). На рис. 3.3 и 3.4 приведены
341
189
185
168
93
[45-50)
[40-45)
[35-40)
[30-35)
[50-55]
13
11
[25-30)
400
350
300
250
200
150
100
50
0
[19-25)
Количество фрагментов
размеры закодированных фрагментов при 𝐖 = 80.
Полученные размеры, байт
Рис. 3.3. Диаграмма размеров сжатых фрагментов программ W=80.
Мы видим, что получены два интервала размеров: [19;55] и [58;64]
для фрагментов кода и случайной последовательности соответственно.
Поскольку
интервалы
не
пересекаются,
то
возможно
определение факта внедрения секретного сообщения.
однозначное
73
Количество фрагментов
450
388
400
338
350
300
250
200
150
129
119
100
50
26
0
[58-60)
[60-61)
[61-62)
[62-63)
[63-64]
Полученные размеры, байт
Рис. 3.4. Диаграмма размеров сжатых фрагментов псевдослучайной
последовательности W=80.
Как уже упоминалось ранее, необходимо стремиться к уменьшению 𝑾.
600
506
500
400
326
300
200
100
79
78
11
[45-50]
[40-45)
[35-40)
[30-35)
0
[26-30)
Количество фрагментов
Рассмотрим диаграммы при 𝑾 = 𝟕𝟎 байт.
Полученные размеры, байт
Рис. 3.5. Диаграмма размеров сжатых фрагментов программ W=70.
Из диаграмм (рис. 3.5, 3.6) видно, что при 𝑾 = 𝟕𝟎 байт происходит
пересечение
интервалов
длин
([26;50]
оптимальное значение 𝑾 составляет 80 байт.
и
[49;54]).
Следовательно,
74
Итак, мы установили, что для эффективного стегоанализа необходимо
анализировать последние 80 байт окна. Если размер сжатого фрагмента
окажется больше 56 байт, то будем считать, что контейнер заполнен
500
450
400
350
300
250
200
150
100
50
0
436
334
163
36
28
[54]
[53-54)
[52-53)
[51-52)
[50-51)
3
[49-50)
Количество фрагментов
стегосообщением. В остальных случаях – пуст.
Полученные размеры, байт
Рис. 3.6. Диаграмма размеров сжатых фрагментов псевдослучайной
последовательности W=70.
3.2.4 Описание схемы проведения эксперимента
После того как был определен размер окна 𝑾, а также обоснована
целесообразность использования кода Хаффмана вместо архиваторов,
определим эффективность нового метода экспериментально. В качестве
критерия
эффективности
будем
использовать
количество
ложных
срабатываний алгоритма на пустых и заполненных контейнерах. Здесь
необходимо различать два вида ошибок:
 ошибка I рода – ситуация, при которой пустой контейнер признается
заполненным;
 ошибка II рода – ситуация, при которой заполненный контейнер
признается пустым.
75
Для эксперимента была сформирована выборка из 1000 файлов3
формата
PE
(программ).
Рассмотрим
результаты
работы
метода,
представленные в табл. 3.3.
Таблица 3.3. Эффективность работы метода стегоанализа.
Род ошибки
Значение ошибки, %
I рода
0.0
II рода
0.1
Мы видим, что предложенный метод эффективно обнаруживает факт
наличия секретного сообщения. Основным достоинством разработанной
схемы
анализа
следует
считать
отсутствие
необходимости
дизассемблирования.
Далее, будем постепенно заполнять контейнер на различное количество
байт и анализировать результаты работы метода. На рис 3.7 представлена
зависимость количества правильных определений от размера внедрения.
60
53.4
40
35.8
30
20
16.2
0.9
0.1
80
10
70
Ошибка II рода
50
60
50
40
0
Объем внедрения, байт
Рис. 3.7. Результаты работы метода при различных объемах внедрения
3
В разделах 3.2.2 и 3.2.3 была использована другая выборка
76
Ранее отмечалось, что наш метод рассчитан на работу с контейнером,
заполненным на 80 байт. Если контейнер заполнен менее чем на 70 байт,
то ошибка II рода достаточно велика, что делает затруднительным
практическое применение метода. Ошибка I рода отсутствует.
Причина
столь
анализируемых
высокой
данных
и
ошибки
была
кроется
описана
в
в
разделе
разнородности
3.2.1.
Однако
уже при заполнении контейнера на 70 байт и более, метод стегоанализа
достаточно
эффективно
обнаруживает
факт
внедрения
секретного
сообщения.
3.3 Описание подхода повышения устойчивости метода
внедрения информации в исполняемый файл
3.3.1 Описание схемы передачи секретного сообщения
В предыдущем разделе главы мы рассматривали исходный метод
внедрения информации в исполняемые файлы [32]. Было установлено,
что упомянутый метод имеет существенный недостаток – различие
статистических свойств кода программы и передаваемого секретного
сообщения.
Это
различие
свойств
может
быть
использовано
для стегоанализа. Очевидно, что если секретное сообщение перед
внедрением будет закодировано так, что распределение вероятностей будет
такое же, как у кода программы, то атаки подобного рода станут
неэффективными. В данном разделе главы предлагается использовать
оптимальный
код
зашифрованного
Хаффмана
сообщения
представленный на рис. 3.8.
для
перед
предварительного
внедрением.
кодирования
Рассмотрим
пример,
0.16
0.14
0.12
0.1
0.08
0.06
0.04
0.02
0
1
10
19
28
37
46
55
64
73
82
91
100
109
118
127
136
145
154
163
172
181
190
199
208
217
226
235
244
253
Вероятность
77
Значение байта
Рис. 3.8. Распределение вероятностей байт инструкций программы
Вероятность
0.025
0.02
0.015
0.01
0.005
1
11
21
31
41
51
61
71
81
91
101
111
121
131
141
151
161
171
181
191
201
211
221
231
241
251
0
Значение байта
Рис. 3.9. Распределение вероятностей байт случайной последовательности до
кодирования
Мы видим, что распределения, представленные на рис. 3.8 и 3.9,
существенно
отличаются,
что
с
легкостью
может
быть
выявлено
и использовано для стегоанализа. Ниже, на рис. 3.10, представлено
распределение вероятностей байт случайной последовательности после
кодирования.
0.14
0.12
0.1
0.08
0.06
0.04
0.02
0
1
10
19
28
37
46
55
64
73
82
91
100
109
118
127
136
145
154
163
172
181
190
199
208
217
226
235
244
253
Вероятность
78
Значение байта
Рис. 3.10. Распределение вероятностей байт случайной последовательности
после кодирования
Очевидно, что после применения предлагаемого подхода, распределения
вероятностей байт, представленные на рис. 3.8 и 3.10 практически
совпадают.
Таким
образом,
может
быть
повышена
устойчивость
к обнаружению исходного метода внедрения секретного сообщения [32].
Рассмотрим улучшенную схему передачи секретного сообщения
Сообщение
Шифрование
Кодирование
Внедрение
в контейнер
Боб
Сообщение
Декодирование
Извлечение
из контейнера
Передача
Aлиса
Расшифровка
в общем виде, представленную на рис. 3.11.
Рис. 3.11. Модифицированная схема передачи секретного сообщения
79
Таким образом, предложенная схема отличается от исходной наличием
этапов кодирования и декодирования сообщения.
Для передачи
следующие шаги:
секретного
сообщения
Бобу,
Алиса
совершает
Шаг 1. Шифрует исходное сообщение, используя секретный ключ;
Шаг 2. Кодирует зашифрованное сообщение, подавая его на вход декодеру
Хаффмана;
Шаг 3. Внедряет полученное сообщение в секцию кода программы;
Шаг 4. Передает файл по открытому каналу связи;
Затем Боб совершает следующие шаги:
Шаг 5. Принимает файл от Алисы;
Шаг 6. Извлекает сообщение из секции кода программы;
Шаг 7. Декодирует сообщение, подавая его на вход кодеру Хаффмана;
Шаг 8. Расшифровывает сообщение, используя секретный ключ.
Таким образом, Боб получает от Алисы исходное сообщение.
Участники обмена сообщениями заранее договариваются об используемом
при шифровании секретном ключе. На шаге 6 Бобу необходимо знание
начальной позиции в файле внедренного сообщения. Об этом также следует
договориться заранее. Для шагов 2 и 7 (кодирования / декодирования)
используется дерево Хаффмана, для построения которого требуются оценки
вероятностей
появления
символов
в
окне.
Процесс
декодирования
происходит аналогично.
3.3.2 Описание способа получения распределения вероятностей
байт
Как уже отмечалось, для построения дерева Хаффмана требуется
распределение вероятностей байт. В данной разделе главы рассматривается
80
два способа получения такого распределения, которые используется на этапе
кодирования / декодирования передаваемого сообщения:
 распределение считается в передаваемом пустом контейнере;
 выбирается
единственное
(особое)
распределение,
которое
используется во всех случаях обмена сообщениями.
Рассмотрим первый способ. На шаге 2 Алисе необходимо знать
распределение вероятностей байт пустого контейнера. Так как изначально
Алиса имеет пустой контейнер, то она без труда сможет его получить.
На шаге 7 Бобу также нужно знать распределение вероятностей байт пустого
контейнера. Боб получает уже заполненный контейнер, но так как известна
начальная позиция встроенного сообщения, то он не будет учитывать байты
внедренного сообщения при получении этого распределения. Таким образом,
Алиса и Боб могут получить распределение, необходимое на этапах
кодирования и декодирования сообщения.
Проверим эффективность предлагаемого подхода экспериментально.
Будем осуществлять внедрение закодированного секретного сообщения,
и применять стеготест, описанный разделе 3.2. Для эксперимента была
сформирована выборка из 1000 исполняемых файлов. Далее, используя
вышеописанную схему, заполним контейнеры сообщениями. На этапе
предварительного кодирования будем получать распределение вероятностей
байт, анализируя секцию кода программы (полностью4). После заполнения
контейнеров и применения разработанного стеготеста получим результат,
приведенный в табл. 3.4.
4
В дальнейшем будет установлено, что следует анализировать только часть
секции кода программы.
81
Таблица 3.4. Результаты применения стеготеста при использовании
распределения вероятностей байт всей секции кода.
Количество
файлов
Обнаружено, %
1000
6.6
Как видно из табл. 3.4, в 66 контейнерах из 1000 сообщение было
обнаружено несмотря на предварительное кодирование. Можно утверждать,
что распределение вероятностей обнаруженных стеготестом контейнеров
было близко («с точки зрения» стеготеста) к случайному. При изучении
структуры исполняемых файлов было обнаружено, что секция кода
исполняемого
файла
может
содержать
не
только
набор
двоичных
инструкций, но и некоторый набор данных, например: таблицы адресов
импорта.
Обычно
для
таблицы
адресов
импорта
используется
дополнительная секция (например, для компиляторов фирмы Borland такая
секция называется .idata). Но компиляторы сторонних производителей могут
размещать ее в кодовой секции и, как правило, она размещается в конце
секции. Строго говоря, формат PE допускает размещение таблицы импорта
в начале, середине и конце секции кода. Данные, расположенные в этой
таблице, могут существенно влиять на получаемое распределение.
На рис. 3.12 и 3.13 показаны распределения средних вероятностей
первой тысячи байт секции кода и последней, взятых из 1000 файлов.
82
Вероятность
0.25
0.2
0.15
0.1
0.05
1
13
25
37
49
61
73
85
97
109
121
133
145
157
169
181
193
205
217
229
241
253
0
Значение байт
Рис. 3.12. Распределение средних вероятностей первой тысячи байт секции
кода
0.14
Вероятность
0.12
0.1
0.08
0.06
0.04
0.02
241
225
209
193
177
161
145
129
113
97
81
65
49
33
17
1
0
Значение байт
Рис. 3.13. Распределение средних вероятностей последней тысячи байт
секции кода
Из графиков видно, что распределения первых и последних байт
секции кода действительно отличаются. Таким образом, следует получать
распределение вероятностей, анализируя не всю секцию, а только какую-то
ее часть. Далее, будет рассмотрено, какая из частей секции должна
анализироваться.
83
Рассмотрим результаты работы стеготеста, описанного в разделе 3.2,
при использовании распределения вероятностей 𝑵 первых байт секции кода,
представленных в табл. 3.5.
Таблица 3.5. Результаты стеготеста при использовании распределения
вероятностей первых N байт секции
Анализируемая
часть N, байт
Обнаружено, %
Как
мы
уже
80 300 500 1000 2000 3000 4000 5000
0.0 0.2
0.1
выяснили,
0.6
1.5
распределения
2.7
2.0
3.0
вероятностей
первых
и последних байт секции кода различаются. Теперь будем использовать
для кодирования распределение вероятностей 𝑵 последних байт.
Таблица 3.6. Результаты стеготеста при использовании распределения
вероятностей байт последних N байт секции
Анализируемая
часть N, байт
Обнаружено, %
80 300 500 1000 2000 3000 4000 5000
0.0 0.1
0.2
0.8
0.8
1.2
1.7
1.8
Итак, из табл. 3.5 и 3.6 мы видим, что для получения распределения
лучше всего анализировать 80 первых или 80 последних байт секции кода.
Рассмотрим второй способ получения распределения вероятностей
байт.
При
получении
особого
распределения
следует
учитывать
два требования:
 распределение
является
«типичным»
для
большинства
файлов
(очевидно, что любое нетипичное распределение может вызывать
подозрение);
 распределение позволяет успешно проходить стеготест.
84
Для получения распределения, наиболее «типичного» для всех файлов,
были проанализированы 1000 файлов. Для каждого из них были получены
распределения вероятностей первых 1000 байт. Далее, было выбрано одно
распределение, наиболее близкое ко всем остальным. Для этого составлялась
матрица, элементами которой являются расстояния между распределениями.
Под расстоянием понимается расстояние Кульбака − Лейблера:
𝑫(𝒑, 𝒒) = ∑𝟐𝟓𝟓
𝒙=𝟎(𝒑(𝒙) ∗ 𝒍𝒏
𝒑(𝒙)
𝒒(𝒙)
)
(1)
На рис. 3.14 изображена матрица, содержащая расстояния между двумя
распределениями. Для того
чтобы выбрать искомое
распределение,
суммировались элементы строк матрицы (как показано на рис. 3.14)
и выбиралось то распределение, которое давало минимальную сумму
по соответствующей строке матрицы.
№
1
2
…
1000
Сумма
1
1
10
…
31
1+10+…+31
2
10
1
…
25
10+1+…+25
…
…
…
…
…
…
Рис. 3.14. Матрица расстояний Кульбака-Лейблера
Таким образом, было получено следующее распределение, представленное
на рис. 3.15.
85
Вероятность
0.25
0.2
0.15
0.1
0.05
0
1
15 29 43 57 71 85 99 113 127 141 155 169 183 197 211 225 239 253
Значения байт
Рис. 3.15. Выбранное распределение вероятностей байт
Будем
распределение.
использовать
при
Рассмотрим
кодировании
результаты
полученное
стеготеста,
(особое)
представленные
в табл. 3.7.
Таблица 3.7. Результаты стеготеста при использовании особого
распределения вероятностей байт
Число заполненных
контейнеров
Обнаружено, %
1000
0
Результаты стеготеста показывают, что при данном способе выбора
распределения
вероятностей
стеготест,
предложенный
в
разделе
3.2, не обнаруживает ни один заполненный контейнер.
3.3.3 Заключение
Целью данной работы была модификация существующего метода
внедрения информации в исполняемый файл. Было предложено перед
внедрением сообщения в контейнер предварительно его кодировать. Тогда,
распределение вероятностей байт внедряемого сообщения будет неотличимо
от распределения кода программы, что делает стеготест, предложенный
86
в разделе 3.2, неэффективным. Было установлено, что на этапе кодирования
и декодирования сообщения для построения дерева Хаффмана следует
использовать одно из следующих распределений вероятностей:
 распределение вероятностей первых 80 байт секции кода;
 распределение вероятностей последних 80 байт секции кода;
 распределение вероятностей, показанное на рис. 3.155.
Как уже было упомянуто, некоторые компиляторы размещают таблицу
импорта в конце секции кода. Очевидно, что наличие ненулевых байт после
таблицы может вызывать подозрение. Поскольку задача перемещения
таблицы импорта после внедренного сообщения достаточно трудоемкая
и требует дизассемблирования, производимого в полуавтоматическом
режиме (с участием человека), то рекомендуется не использовать такие
контейнеры. Для передачи секретного сообщения лучше подбирать
контейнеры, у которых таблица располагается в отдельной секции, например,
как у представленного на рис. 3.16 файла.
Рис. 3.16. Набор секций исполняемого файла bzip2.exe
5
Распределение будет представлено в приложении A.2.
87
Выводы
В данной главе была продемонстрирована нестойкость метода
внедрения информации в исполняемые файлы формата Portable Executable,
предложенного в статье [32]. В ходе работы построен новый эффективный
метод стегоанализа, определяющий наличие факта внедрения скрытого
сообщения
стегоанализа
размером
80
заключается
байт.
в
Преимущество
том,
что
предложенной
отсутствует
схемы
необходимость
в трудоемком дизассемблировании. Также в этой главе, была предложена
модификация исходной схемы внедрения информации, устойчивая к
разработанному стеготесту.
88
Глава 4. Система внедрения цифровых водяных знаков в
исходные коды программ
4.1 Введение
Построение систем цифровых водяных знаков является одним
из направлений стеганографии, к целям которого относят сокрытие данных
в цифровых средах или файлах таким образом, чтобы внедренный знак было
бы трудно удалить или обнаружить. В отличие от классической задачи
стеганографии, то есть проблемы сокрытия факта передачи данных, обычно
не требуется скрыть наличие водяного знака в большинстве приложений.
Считается, что можно заранее предугадать содержится ли водяной знак
или нет.
Одно из применений цифровых водяных знаков – это защита
авторского права. Предположим, что вы создали программный продукт
и внедрили него водяной знак “NECHTA”. После некоторого времени
вы находите компанию, продающую этот же продукт как свой собственный,
возможно с измененным названием или метаданными во внутренних файлах.
Но если водяной знак устойчив, то есть он противостоит удалению
или модификации, то будет возможно извлечь слово “NECHTA” и доказать
авторство в суде. Вероятность того, что водяной знак “NECHTA” возник
в файлах программы случайно, ничтожна мала.
Другое, более перспективное применение – защита от нелегального
копирования. Идея сводится к следующему: автор внедряет в каждую
продаваемую копию программы уникальный водяной знак, который
позволил бы отслеживать пользователя, производящего незаконные копии.
Проблема здесь возникает, когда два или больше пользователя создают
коалицию. Они могут сравнить имеющиеся копии программ и найти
89
все различия с целью определения местоположения водяного знака. Знание
этих местоположений может помочь им изменять водяной знак таким
образом, чтобы создать копию, по которой не может быть прослежен ни один
пользователь из коалиции. Для предотвращения подобной возможности
существуют так называемые коды снятия отпечатков пальцев, которые
используются как водяные знаки. Специальная конструкция и избыточность
таких
чем
кодов
гарантируют,
некоторое
что
никакая
предопределенное
коалиция
значение
не
размера
может
менее
создать
непрослеживаемый водяной знак. Одной из проблем в схеме создания
водяного знака состоит в обеспечении достаточного участка памяти
для размещения длинных кодов снятия отпечатков пальцев.
Согласно предложенной в работе [35] классификации, водяные знаки
могут быть разделены на две категории:
 статические – добавляются к коду или данным программы на этапе
создания;
 динамические – представляют собой структуру данных, процесс
построения которой осуществляется во время выполнения программы.
Существует другая классификация, представленная в статье [36]. Здесь,
происходит разделение типов водяных знаков по назначению.
 Авторская метка – предназначена для подтверждения подлинности
программы. Такая метка должна быть доступна для чтения конечному
пользователю.
для
Водяной
противодействия
знак
некоторым
такого
типа
предназначен
вредоносным
программам,
выступающим под видом другого известного приложения;
 Цифровой отпечаток пальцев – идентифицируют канал поставки
программного
продукта
и
конечного
пользователя.
Отпечаток
предназначен для отслеживания исходного источника нелицензионных
копий. Как правило, водяной знак такого типа должен быть невидим
для третьих лиц и устойчивым к удалению или модификации;
90
 Проверяющая
метка
–
гарантирует
отсутствие
модификаций
в программе. Должна быть видима конечному пользователю;
 Лицензионная
метка
–
используется
для
аутентификации
программного обеспечения. Должна быть невидимой и «хрупкой»1.
Некоторые типы водяных знаков используют цифровую подпись,
гарантирующую, что любое изменение части программы повлечет искажение
подписи. Подробнее об этом рассматривается в работе [37].
4.2 Обзор существующих систем цифровых водяных
знаков
Поскольку мы говорим о водяных знаках в программах, то следует
отметить, что внедрение данных в исполняемые файлы имеет свою
собственную специфику. Например, внедрение не может быть осуществлено
прямой модификацией некоторых бит исполняемых файлов, потому
что любая такая модификация, с высокой долей вероятности, уничтожит
алгоритм работы программы. Внедрение должно быть сделано таким путем,
который гарантирует правильное функционирование программы. Проблема
водяных знаков в программных была заявлена и рассматривалась в ряде
работ [38-44].
Существует два основных подхода. Первый предлагает использование
специальных дополнительных функций, которые добавляются к коду
программы, [39], [41], [42]. Код дополнительных функций содержит
требуемый водяной знак, например, в виде констант, использующихся
в различных вычислениях. Эти добавленные функции не должны выглядеть
как “мертвый код” (код, который никогда не будет выполнен) потому,
что иначе они могут быть легко удалены алгоритмом устранения мертвого
1
Любое изменение в программе должно разрушать водяной знак.
91
кода. То есть они должны быть интегрированы в программу и вызваны
в течение выполнения программы. Преимущество этого подхода состоит
в фактически неограниченной длине водяного знака. Однако недостаток –
потенциальная
деградация
алгоритма
работы
программы.
Другим
недостатком является уязвимость к нападениям, которые находят некоторые
известные образцы функциональных конструкции водяного знака и пути
обращения к нему.
Второй подход не использует добавление явных кодов, а скорее
задействует некоторую незначительную избыточность в программных
файлах, которая позволяет внедрять водяной знак. Подобный подход
используется
в
работах
[38],
[40],
[43-47],
чтобы
скрыть
данные
непосредственно в исполняемых файлах. Общая особенность этих методов
состоит в нахождении некоторого набора эквивалентных способов генерации
исполняемого файла и сокрытие данных через выбор одного из них. Методы
генерации кода зависят от компилятора и, в частности, его методов выбора
типа команды, планирования инструкций, размещения текста программы,
выделения регистров, расстановке переменных и расстановке адресов
функций в таблицах импорта. Следует обратить внимание на то,
что некоторые модификации кода могут быть применены к уже готовому
исполняемому файлу, в то время как другие только во время компиляции
и, поэтому, требуются специально разработанный компилятор. Мы кратко
проиллюстрируем сущность каждого метода. Примеры во всей главе будут
даваться на C\C++ и языках трансляции процессора ARM 2.
Метод
выбора
команды
состоит
в
нахождении
различных
последовательностей кода, которые производят то же самое вычисление.
Например, инструкция d = d + 1 могла быть выполнена путем добавления
1 или, вычитанием -1 от d. Инструкция d = d * 2 могла быть выполнена
Процессоры ARM доминируют на рынке мобильной и повседневной
электроники, и составляют аппаратную платформу для мобильных устройств
Nokia, Sony Ericsson и др.
2
92
добавлением d к d или левым битовым сдвигом d. Эти варианты могут быть
закодированы как 0 и 1 соответственно. Выбор одного из них зависит
от
внедряемого
бита
данных.
Следует
обратить
внимание на
то,
что возможность эффективного поиска альтернативной команды зависит
от типа процессора и ограничены в RISC типа ARM. В ARM удвоение
переменной может быть сделано следующим образом:
add
rd, rd, #0
mov
rd, rd, asl #1,
или
где оба варианта одинаковы по длине байт и времени выполнения. Следует
учесть, что непосредственное вычитание отрицательного числа невозможно.
Метод планирования инструкций находит блоки с независимыми
командами
процессора.
Все
перестановки
независимых
команд
упорядочивают лексикографически и рассматриваются как эквивалентные.
Двоичное представление номера перестановки команд есть внедренное
сообщение. Например, в блоке
две
операции
mov
r3, r4
add
r0, r4, #1
являются
независимыми
следовательно,
возможна
эквивалентная последовательность:
add
r0, r4, #1
mov
r3, r4
Таким образом можно закодировать один бит информации.
Метод размещения кода программы основан на информации,
полученной в ходе анализа ряда программ. Любой машинный код может
быть представлен как набор блоков с последовательно выполняющимися
командами и отделенными инструкциями вида “go to” (переходы).
Эти блоки кода могут быть помещены в память (в содержимое исполняемого
файла) в различном порядке. Аналогично, внедренные данные – это двоичное
представление номера перестановки блоков кода.
93
Метод выделения регистров имеет дело с назначением регистра
процессора под размещение некоторой переменной. Если в предыдущем
примере переменная d может быть помещена в регистр и компилятор имеет
несколько свободных регистров, скажем r3 и r4, то дополнительный
бит может быть внедрен, путем назначения d = r3 или d = r4.
Для переменных, которые не могут быть помещены в регистр, может
использоваться различный порядок их расположения в памяти. Различные
комбинации назначения регистров или расположения переменных в памяти
дают возможность скрывать данные.
В работе [50] показана возможность воспользоваться преимуществом
технологии динамического связывания, которая преобладает в современном
программировании. Различные перестановки адресов начала функций
в таблицах импорта\экспорта и поддерживающих структурах могут быть
использованы для скрытия данных.
Все рассматриваемые методы могут быть объединены вместе, чтобы
увеличить общий объем внедрения информации. Однако существует
проблема: внедрение данных не всегда устойчиво. Это, прежде всего,
относится
к
внедрению,
сделанному
непосредственно
в
готовую
исполняемую программу. Та же самая программа, которая внедряет данные,
может использоваться для стирания или изменения водяного знака. Именно
поэтому в данной работе особое внимание уделяется методам внедрения,
применяемых к исходным текстам программ, после компиляции которых
найти или исказить водяной знак значительно труднее.
94
4.3 Описание предложенной схемы внедрения водяных
знаков
4.3.1 Описание предлагаемой схемы
В данном разделе будет предложена схема нанесения водяных знаков в
тексты программ на языке C\C++.
Разработанная схема предполагает создание автономной программы,
запускающейся перед компиляцией программы, которая используется для
того,
В
чтобы
внедрить
реализованной
водяной
версии
знак
программы
в
исходные
внедрения
файлы
C\C++.
водяных
знаков,
производится упорядочивание операции присваивания и упорядочивание
локальных переменных.
Рассмотрим
пример
работы
предлагаемой
схемы.
следующая функция:
int f (int x)
{
int a, b;
a = x + 1;
b = x - 1;
return
a + 2 * b;
}
Вычислительная часть функции, откомпилированая с GCC:
ldr
r3, [fp, #-16]
add
r3, r3, #1
str
r3, [fp, #-20]
ldr
r3, [fp, #-16]
sub
r3, r3, #1
str
r3, [fp, #-24]
ldr
r3, [fp, #-24]
Пусть
дана
95
где
распределение
памяти
mov
r2, r3, asl #1
ldr
r3, [fp, #-20]
add
r3, r2, r3
mov
r0, r3
для
переменных
соответствует
порядку
их объявления:
x = [fp, #-16], a = [fp, #-20], b = [fp, #-24].
Согласно предложенному подходу мы можем внедрить два бита
водяного знака в эту функцию путем выбора порядка объявления
переменных и порядка следования независимых инструкций:
0→ int a, b;
1→ int b, a;
0→ a = x + 1;
1→ b = x – 1;
b = x – 1;
a = x + 1;
Так, исходная функция, в которой объявления локальных переменных
и инструкции упорядочены лексикографически, соответствует водяному
знаку “00”. Чтобы внедрить водяной знак “11”, мы перезаписываем
функцию в виде:
int f (int x)
{
int b, a;
b = x - 1;
a = x + 1;
return
a + 2 * b;
}
Вычислительная часть функции, откомпилированая с GCC:
ldr
r3, [fp, #-16]
sub
r3, r3, #1
str
r3, [fp, #-20]
96
где
распределение
памяти
ldr
r3, [fp, #-16]
add
r3, r3, #1
str
r3, [fp, #-24]
ldr
r3, [fp, #-20]
mov
r2, r3, asl #1
add
r3, r2, r3
mov
r0, r3
для
переменных
соответствует
порядку
их объявления:
x = [fp, #-16], a = [fp, #-24], b = [fp, #-20].
Рассмотрим устойчивость данного метода к искажению водяного знака.
Предположим, что мы имеем две исполняемых программы или объектных
модуля, которые содержат нашу функцию с водяными знаками “00” и “11”
соответственно. В табл. 4.1 приведено сравнение двух объектных файлов
с помощью команды unix shell “cmp –l”. Мы обнаруживаем 4 различия.
Таблица 4.1. Различия объектных файлов до и после внедрения водяного
знака
Адреса
Байты файлов
Без водяного зн.
С водяным зн.
79
203
103
91
103
203
97
30
24
105
24
30
(Те же самые различия, но в других адресах, были бы найдены
в исполняемых программах). Первые 203 и 103 – различия кодов команд add
и sub. Далее, различия 30 и 24 – распределения памяти для переменных a и b.
Мы видим, что нельзя вмешиваться в этот водяной знак, то есть изменять его
97
на “01” или “10”, изменяя лишь эти известные различающиеся байты.
Действительно, если мы меняем 203 и 103, чтобы изменить водяной знак,
функция будет повреждена, потому что это добавит 1 к b и вычтет 1 от a,
что дает неправильный результат. Та же самая ошибка будет возникать,
если мы меняем 30, и 24 (результат будет b + 2*a). Итак, мы можем подвести
итог, утверждая, что вообще невозможно вмешаться в водяной знак
в двоичном исполняемом файле простой заменой различающихся байт,
где
обнаружены
различия.
Эти
различия
могут
только
помогать
обнаруживать местоположение водяного знака. Конечно, это возможно
только когда пакеты программ содержат различные водяные знаки
(отпечатки пальца) и злонамеренные пользователи создают коалиции.
Более
если
мы
серьезное
нападение
дизассемблируем
может
исполняемую
быть
осуществлено,
программу.
Хотя
дизассемблирование большой исполняемой программы является достаточно
трудной задачей, все же имеется ряд дополнительных трудностей связанных
с внедрением в исходный код C\C++. Рассмотрим код нашей функции.
Во-первых, мы можем видеть, что нет никаких последовательных
и независимых команд, которые могут быть переставлены для того, чтобы
модифицировать водяной знак. Это происходит потому, что независимые
C\C++ инструкции компилируются не в отдельные независимые команды,
а скорее в независимые группы команд. Так что мы нуждаемся
в дополнительном уровне декомпиляции для определения групп команд,
соответствующих выше упомянутым инструкциям языка.
Что касается назначения переменных, то на первый взгляд – это
кажется простой задачей – взаимно заменить смещения (-20 и -24 в нашем
примере), чтобы исказить некоторые биты водяного знака. Но иногда
(не в нашем примере) необходим адрес переменной. В этом случае смещение
будет использоваться как обычная константа и, при более детальном анализе
кода, может потребоваться указать это смещение при помощи некоторой
другой константы.
98
Фактически,
чтобы
осуществить
эффективное
нападение
мы нуждаемся больше в декомпиляторе, нежели чем в дизассемблере.
Вполне очевидно, что задача осуществления декомпиляции с целью
последующего вмешательства в водяной знак является лучшим способом
нападения, который можно себе представить. Если иметь исходные тексты,
то можно встраивать любой водяной знак, используя ту же самую
внедряющую программу.
4.3.2 Описание разработанных программ
Когда мы говорим об эффективности внедрения, мы учитываем число
битов, которые могут быть внедрены в исходные файлы. Исходя
из особенностей описываемого метода, емкость определяется двумя вещами:
сколько переменных объявлены в каждой функции и сколько групп
независимых инструкций мы можем найти. Однако существуют ограничения,
уменьшающие объем внедряемой информации. Ниже приводятся наиболее
существенные из них.
а) Допускается перестановка переменных, объявленных только в начале
блока. Это согласуется с общепринятой практикой программирования
на C++ – прежде чем использовать переменные, их необходимо
объявить. Хотя некоторые переменные могут быть объявлены по ходу
выполнения программы, их позиции в исходном тексте не следует
менять, потому что это нарушит область их видимости и может
привести к различного рода ошибкам.
б) Не
допускается
перестановка
инструкций,
которые
выглядят
независимыми, если они содержат любой вызов функции. Это делается
потому, что мы не можем гарантировать отсутствия каких-либо
зависимостей или побочных эффектов у функции. При наличии таких
эффектов замена позиции такой инструкции может вести к ошибкам.
Например,
99
a
=
b
+
x();
c
=
5
+
y();
в данном случае функции могут использовать один общий объект
(переменная, файл и др.), и возвращаемое значение может зависеть
от состояния этого объекта.
в) Запрещается переставлять кажущиеся независимыми инструкции, если
они
содержат
любую
косвенную
ссылку
(указатель,
массив).
Проследить содержимое указателей по их имени, чтобы гарантировать
независимость инструкции, не представляется возможным. Например,
операции:
*p
= 5;
*q
= 4;
могут быть зависимы, когда указатели p и q ссылаются на одну
и ту же область памяти.
г) Допускается переставлять только те выражения, которые содержат
в себе переменные, объявленные локально. Глобальные переменные
и, особенно, макросы не могут быть прослежены. Например:
#define a *g
int R()
{ int f,*g=new (int);
*g=6;
f=*g+1;
a=-9;
…
}
В таком случае, операции присваивания f1=*g+1; и a=5; являются
зависимыми не смотря на то, что содержат различные имена переменных.
Как показывают эксперименты, указанные ограничения очень сильно
уменьшают объем внедряемой информации. Здесь уместно разделять
два вида емкости: фактическая емкость, которая достигается с учетом всех
100
ограничений, и теоретическая, которая может быть достигнута, если
программист
будет
сам
непосредственно
указывать
независимые
переменные. В последнем случае, можно отказаться от вышеописанных
ограничений.
Для практической проверки работы предлагаемой схемы встраивания
информации была создана программа, внедряющая и извлекающая секретное
сообщение из исходных кодов программ на C\C++. На вход программе
подается множество файлов с исходными кодами и внедряемое сообщение. В
настоящий момент существуют две версии программы: консольная и с
графическим
интерфейсом.
Обе
программы
внедряют
и извлекают водяной знак одинаковым образом.
Рис. 4.1. Консольная версия программы нанесения водяных знаков
Рис. 4.2. Графическая версия программы нанесения водяных знаков
101
Принципиальная схема работы программы сводится к следующим
этапам.
1. Предварительная обработка;
2. Поиск входа в функцию;
3. Обработка локальных переменных;
4. Обработка операций присваивания;
5. Переход к этапу 2 (или выход).
Теперь рассмотрим работу программы подробнее по пунктам. На этапе
предварительной обработки директив препроцессора производится удаление
из исходных текстов программ комментариев и строковых констант,
так как их содержимое ошибочно может быть распознано как часть
программного кода. Далее производится проверка на наличие условных
директив компиляции. Файлы, содержащие такие директивы, следует
отбросить из-за того, что часть кода программы (и, следовательно, водяной
знак), находящаяся
между директивами, может быть не включена
в исполняемый файл.
На следующем этапе необходимо, пропустив глобальные объявления
различных объектов, найти описание первой функции, имеющей следующий
шаблон:
“<тип><идентификатор>(<набор
параметров>)
{”.
Стоит
отметить, что особенностью разработанной программы является то,
что для внедрения сообщения не требуется весь исходный код (включая
заголовочные
файлы
и
др.).
Программа
определяет
считанный
идентификатор как описание типа, если он находится в начале ряда
идентификаторов (не являющихся зарезервированными) идущих друг
за другом через пробел. Последний идентификатор в таком ряде (согласно
стандарту ANSI C [48]) относится к имени объекта (переменной, функции
и др.). Например,
Sometype ttt( ){…
или
102
#define Sometype unsigned
#define x int
Sometype x ttt = …
В последнем случае, можно определить последовательность Sometype x
как описание типа, не анализируя директивы препроцессора (#define).
На следующем этапе производится обработка локальных переменных.
В разработанной версии программы предполагается, что все локальные
переменные объявляются вначале функции. Производится считывание блока
описания переменных и, в зависимости от типа выполняемой операции
(чтения или записи водяного знака), производится его дальнейшая обработка.
Будем считать, что блок переменных заканчивается в том случае, если
встретилось постороннее выражение (цикл, присваивание, и др.).
Этап обработки операций присваивания базируется на предыдущем
этапе,
К
так
как
необходимо
перестановкам
независимыми
знать
допускаются
относительно
те
имена
локальных
выражения,
друг-друга
переменных.
которые
(изменяемая
являются
переменная
не фигурирует в других выражениях). При обнаружении зависимого
выражения, производится его пропуск. Например, имеется блок из пяти
выражений:
A = d + 1;
// 1
C = F + 5;
// 2
d = 17;
// 3
a = x + 5;
// 4
f = c + 1;
// 5
Мы видим, что выражения 1 и 3 зависимы. Так образом, внедрение
осуществляется перестановкой 1 и 2 выражений. Затем, пропускается
присваивание 3, и производится перестановка 4 и 5 выражений. Таким
образом,
блок
независимых
операций
присваивания
заканчивается
при появлении зависимого выражения (как в рассмотренном примере), либо
103
при появлении выражения неподходящего для перестановки (присваивание,
имеющее вызов функции, указатели и др.).
На пятом этапе происходит переход на новую функцию или окончание
анализа, если достигнут конец файла.
4.4 Описание результатов проведения эксперимента
Для практической проверки работы предложенной схемы были
использованы 33 программы C\C++ для платформы Symbian. Проекты
с исходными текстами являются общедоступными и были взяты из сети
Internet.
Ниже
приводятся
результаты
проведенного
эксперимента
для некоторых проектов в табл. 4.2.
Таблица 4.2. Объем внедряемого водяного знака в исходные коды программ
№
3
Имя проекта
Размер
кода3, байт
Длина внедрения, бит
Фактическая
Теоретическая
1
A_Game_for_
the_Nokia_9210
54952
1
14
2
ANSI_X931 _PRNG
72736
13
13
3
bmconv
114386
6
104
4
csvdata
58706
0
9
5
Culdaw
57878
2
52
6
DosBox
1549852
127
535
7
drep
2589
0
0
8
e32frodo-0.5.0
472695
6
119
Размер файлов без учета комментариев в исходном коде программы
104
9
e32nfs
9237
2
6
10
esidplay
250092
3
112
11 fb_s60_3rdv0.94_320x240
98185
1
10
12
gnubox
23156
0
5
13
hellu
1028
0
0
14
hexdump
7417
0
0
45300
27
32
72401
0
2
15 HView_v1_13beta_source
16
lzma
17
lzmaobfrec
2811
0
3
18
Mdictionary
147555
8
41
19
metronome
8867
0
2
20
OpenVideoHub
4820658
2205
2635
21
putty_src_1.5.1
2627950
1018
1360
22
rijndael
41439
0
0
23
screenshot_v3.03_src
52893
0
0
24
sdpbrowser
107284
2
28
25
SmartCam
630616
0
40
26
SymbianOsUnit1_04
1034778
0
6
27
SymDjvu_src
1648160
1
0
28
SymTorrent_1.30
440134
40
131
29
TaskSpy_0.96b
99310
0
10
30
vim
2546288
207
261
31
vncviewer_source_1.0
111265
9
73
32
whereami
2950267
0
131
33
xrickS60-src
1039586
2
35
105
Остальная часть проектов была малопригодна для встраивания,
позволяя внедрить всего от 0 в 10 битов. Анализ причины такого низкого
объема внедрения показывает, что, в дополнение к выше описанным
ограничениям,
широко
распространено
использование
объектно-
ориентированной технологии программирования, которая не подходит
к разработанному методу сокрытия данных. Почти любая операция
применяет методы класса, и трудно определить, безопасно ли изменить
порядок операций из-за возможных побочных эффектов к свойствам класса.
Для объектно-ориентированной технологии программирования следует
разрабатывать новые идеи.
Основная проблема, которую мы пока не обсуждали – это оптимизация
кода, осуществляемая компилятором. Любая модификация исходного текста
может “пострадать” от оптимизации. Методы, описанные в предыдущих
разделах, работают только, если оптимизация выключена. Рассмотрим,
два варианта функции, соответствующая водяным знакам “00” и “11”,
откомпилированная GCC в следующие инструкции:
add
r3, r0, *1
sub
r0, r0, *1
add
r3, r3, r0, asl *1
mov
r0, r3
sub
r3, r0, *1
add
r0, r0, *1
add
r0, r0, r3, asl *1
и
соответственно. Различие здесь только в порядке инструкций, и не зависят от
порядка объявлений переменных (GCC, всегда распределяет первый
свободный регистр (r3) для переменной, которая сначала используется).
Положительный эффект оптимизации для нанесения водяных знаков
заключается в переупорядочивании инструкций, что ведет не только
к изменению размещения текста программы, но также и к изменениям
106
в длине кода. Как следствие, весь остальной код будет смещен в памяти
и, благодаря перекрестным ссылкам на другие части кода программы, будет
достаточно много различий по всему файлу. Данная особенность помогает
эффективно скрывать местоположение водяного знака. Для разрешения
ситуации с оптимизацией, исходные файлы, которые содержат “критичные”
к скорости исполнения части программы, могут быть удалены из списка
файлов, в которые предполагается внедрять водяной знак. Тогда такие
“критичные” файлы могут быть отдельно откомпилированы с оптимизацией.
Более перспективный подход предполагает полностью перепрограммировать
генератор объектного кода компилятора, преобразовав его в “стего генератор
объектного кода”. Фактически, обычный компилятор однозначно выбирает
только
один
путь
генерации
объектного
кода
среди
множества
эквивалентных (или почти эквивалентных) наборов инструкций. Компилятор
со стего генератором объектного кода мог бы выбирать одну из многих
наборов инструкций, исходя из значения водяного знака, который будет
внедрен. Вероятно, это лучший способ осуществления внедрения водяного
знака.
Выводы
В данной главе была предложена схема встраивания информации
в тексты программ на С\С++. Разработано программное средство,
реализующее указанную схему. Данное средство может быть применено
для построения систем защиты авторских прав. В ходе работы показана
устойчивость предложенного метода внедрения водяного знака к удалению
или искажению.
107
ОСНОВНЫЕ ЗАКЛЮЧЕНИЯ И ВЫВОДЫ
В рамках диссертационной работы были разработаны методы
обеспечения безопасности использования информационных технологий.
Предложенные алгоритмы, базирующиеся на методах стеганографии, могут
быть использованы, например, для анализа и фильтрации передаваемого
трафика в сети с целью пресечения утечки коммерческой информации
предприятия.
на
Первый
выявлении
разработанный
статистической
метод
зависимости
стегоанализа
свойств
базируется
заполненного
и анализируемого контейнеров. Зависимость может быть выявлена обычным
архиватором. На сегодняшний день данная схема стегоанализа является
наиболее эффективной по сравнению с существующими аналогами. Второй
метод обнаружения скрытой информации основан на статистической
особенности встраиваемого сообщения, которое выглядит как случайная
последовательность. Проверяя извлеченное из подозрительного контейнера
сообщение на случайность, разработанный метод стегоанализа позволяет
обнаруживать
наличие
внедрения
с
высокой
точностью.
Третий разработанный метод стегоанализа также использует сжатие
для выявления факта передачи секретного сообщения в исполняемых файлах.
Предложенная схема обладает высокой эффективностью работы и, в отличие
от имеющихся аналогов, не требует дизассемблировать программу. В работе
даются рекомендации, повышающие устойчивость метода внедрения
к
разработанному
стегоанализу.
Четвертый
разработанный
метод,
использующий внедрение стеганографических меток в исходные тексты
программ, может быть использован для построения систем защиты авторских
прав.
108
СПИСОК ЛИТЕРАТУРЫ
1. Simmons G. The prisoners’ problem and the subliminal channel. In Advances
in Cryptology Proceedings of Crypto 83. Plenum Press, 1984, P. 51-67.
2. James C. Steganography: Past, Present, Future. [Электронный ресурс]. –
Режим
доступа:
http://www.sans.org/reading_room/whitepapers/
steganography/steganography_past_present_future_552, свободный. 2009.
3. Winstein K. Tyrannosaurus lex 1999. [Электронный ресурс]. – Режим
доступа: http://alumni.imsa.edu/~keithw/tlex/, свободный. 2009.
4. Barzilay R., Lee L. Learning to paraphrase: An Universal approach using
multiple-sequence alignment. [Электронный ресурс]. – Режим доступа:
http://www.aclweb.org/anthology/N/N03/N03-1003.pdf, свободный. 2009.
5. Topkara M. Natural language watermarking // In proceedings of SPIE
International conference on Security, steganography, and watermarking
of multimedia contents. 2005. P. 441-452.
6. Grothoff C., Grothoff K., Alkhutova L., Stutsman R., Atallah M.
Translation-based steganography // In Proceedings of Information Hiding
Workshop, (IH 2005). Springer-Verlag. 2005. P. 15.
7. Chapman M., Davida G. Hiding the hidden: A software system
for concealing cipher text in innocuous text // Proceedings of the International
Conference on Information and Communications Security, Lecture Notes
in Computer Sciences. 1997. V. 1334. P. 333-345.
8. Сайт программы «Nicetext» [Электронный ресурс] – Режим доступа:
ftp://ftp.eenet.ee/pub/FreeBSD/distfiles/nicetext-0.9.tar.gz, свободный.
9. Сайт программы «Texto» [Электронный ресурс] – Режим доступа:
http://www.nic.funet.fi/pub/crypt/steganography/texto.tar.gz, свободный.
10. Сайт программы «MCB» [Электронный ресурс] – Режим доступа:
http://www.eblong.com/zarf/markov/chan.c, свободный.
109
11. Сайт программы «LibSVM» [Электронный ресурс] – Режим доступа:
http://www.csie.ntu.edu.tw/~cjlin/libsvm/, свободный.
12. Chen Z., Huang L., Yu Z., Zhao X., Zheng X. Effective Linguistic
Steganography Detection // IEEE 8th International Conference on Computer
and Information Technology Workshops. 2008. P. 224-229.
13. Chen Z., Huang L., Yu Z., Li L.; Yang W. A Statistical Algorithm
for Linguistic Steganography Detection Based on Distribution of Words //
Availability, Reliability and Security. 2008. P. 558 - 563.
14. Meng P., Huang L.,Chen Z, Yang W., Li D. Linguistic Steganography
Detection Based on Perplexity. [Электронный ресурс]. – Режим доступа:
http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?tp=&arnumber=
5089098&isnumber =5089035, свободный.
15. Ryabko B. Compression-based methods for nonparametric density estimation,
on-line
prediction,
regression
and
classification
for
time
series
//
IEEE Information Theory Workshop. Porto, Portugal, May 5-9, 2008.
16. Жилкин М., Меленцова Н., Рябко Б. Метод выявления скрытой
информации, базирующийся на сжатии данных. // Вычислительные
технологии. 2007. Т. 12. № 4. P. 26-31.
17. Xiang L., Sun X., Luo G. Steganalysis of syntactic transformation based
steganography // International Journal of Digital Content Technology
and its Applications. May 2011. V. 5, Issue 5. P. 320-330.
18. Taskiran C., Topkara U., Topkara M., Delp E. Attacks on Lexical Natural
Language Steganography Systems // Proceedings of the SPIE International
Conference on Security, Steganography, and Watermarking of Multimedia
Contents VI. San Jose. 2006.
19. Yu Z., Huang L., Chan Z., Li L., Zhao X., Zhu Y. Steganalysis of SynonymSubstitution Based Natural Language Watermarking // International Journal
of Multimedia and Ubiquitous Engineering. V. 4, №. 2, April 2009.
110
20. Chen Z., Huang L., Yang W. Detection of substitution-based linguistic
steganography by relative frequency analysis // Digital investigation 2011.
V. 8(1), Elsevier. P. 68-77.
21. А.И. Орлов Математика случая. Учебное пособие. М.: М3-Пресс, 2004.
22. Сайт статистических тестов «DieHard» [Электронный ресурс] – Режим
доступа: http://www.stat.fsu.edu/pub/diehard, свободный.
23. Сайт «Gutenberg Project» [Электронный ресурс] – Режим доступа:
http://www.gutenberg.org/wiki/Main_Page, свободный.
24. Нечта И. В. Метод стегоанализа текстовых данных, основанный
на использовании статистического анализа // Вестник СибГУТИ. 2011.
№3. P. 27-34.
25. Hamilton J., Danicic S. An Evaluation of Static Java Bytecode Watermarking
// ICCSA'10 “The World Congress on Engineering and Computer Science”.
San Francisco. 2010.
26. Davidson R., Myhrvold N. Method and system for generating and auditing
a signature for a computer program // US Patent 5559884. 1996.
27. El-Khalil R., Keromytis A. Hydan: hiding information in program binaries //
VI International Conference “Information and Communications Security”.
Berlin: Springer. 2004. V. 3269. P. 187-199.
28. Hattanda K., Ichikawa S. The Evaluation of Davidson's Digital Signature
Scheme
//
I
EICE
transactions
on
Fundamentals
of
Electronics,
Communications and Computer Sciences. 2004. V. E87-A. №.1. P. 224-225.
29. Naji A., Teddy S. Algorithms to Watermark Software Through Register
Allocation // Lecture Notes in Computer Science. 2006. V. 3919/2006.
P. 180-191.
30. Naji A., Teddy S. New Approach of Hidden Data in the portable Executable
File without Change the Size of Carrier File Using Statistical Technique //
International Journal of Computer Science and Network Security. 2009.
V. 9. № 7. P. 218-224.
111
31. Zaidan A., Zaidan B., Jalab H. A New System for Hiding Data within
(Unused Area Two + Image Page) of Portable Executable File using Statistical
Technique and Advance Encryption Standard // International Journal
of Computer Science and Network Security. 2010. V. 2. № 2.
32. Shin D., Kim Y., Byun K., Lee S. Data Hiding in Windows Executable Files
// Australian Digital Forensics Conference. 2008. P. 51.
33. Pietrek M. Peering inside the PE: A Tour of the Win32 Portable Executable
File
Format
//
[Электронный
ресурс]
–
Режим
доступа:
http://msdn.microsoft.com/enus/magazine/cc301805.aspx, свободный.
34. Blascol J., Hernandez-Castol J. Steganalysis of Hydan // IFIP Advances in
Information and Communication Technology. 2009. V. 297/2009, P. 132-142.
35. Collberg C., Sahoo T. Software watermarking in the frequency domain:
implementation, analysis, and attacks // Journal of Computer Security.
V. 13(5). P. 721-755. 2005.
36. Nagra J. Thomborson C., Collberg C. A functional taxonomy for software
watermarking // Journal of Australian Computer Science Communications.
P. 177-186.
37. Рябко
Б.,
Фионов
А.
Основы
современной
криптографии
и стеганографии. М.: Горячая линия – Телеком, 2010. 232 с.
38. Davidson R.L., Myhrvold N. Method and system for generating and auditing
a signature for a computer program // US Patent 5559884. Sept. 1996.
39. Collberg C., Thomborson C. Software watermarking: Models and dynamic
embeddings
//
ACM
SIGPLANSIGACT
Symposium
on
Principles
of Programming Languages, ACM Press. 1999. P. 311-324.
40. Stern J., Hachez G., Koeune F. Quisquater J.J. Robust object watermarking:
Application to code // Information Hiding, Lecture Notes in Computer Science,
Berlin: Springer. V. 1768. 1999. P. 368-378.
41. Venkatesan R., Vazirani V., Sinha S. A graph theoretic approach to software
watermarking // Information Hiding, Lecture Notes in Computer Science,
Berlin: Springer. V. 2137. 2001, P. 157-168.
112
42. Collberg C., Thomborson C., Townsend G. Dynamic graph-based software
watermarking // Technical report, Dept. of Computer Science, University
of Arizona, 2004.
43. Curran D., Cinneide M.O., Hurley N., Silvestre G. Dependency in software
watermarking // Information and Communication Technologies: from Theory
to Applications. 2004. P. 569-570.
44. Sahoo T.R., Collberg C. Software watermarking in the frequency domain:
Implementation, analysis, and attacks // Technical report, Dept. of Computer
Science, Univ. of Arizona, 2004.
45. El-Khalil R., Keromytis A. Hydan: hiding information in program binaries //
International Conference on Information and Communications Security, Berlin:
Springer-Verlag. Lecture Notes in Computer Science. V. 3269. 2004.
46. Anckaert B., De Sutter B., Chanet D., De Bosschere K. Steganography
for executables and code transformation signatures // C. Park and S. Chee
(Eds.): ICISC 2004, Berlin: Springer-Verlag. Lecture Notes in Computer
Science V. 3506. 2005. P. 431-445.
47. Nechta I., Ryabko B., Fionov A. Stealthy steganographic methods for
executable files // XII International Symposium on Problems of Redundancy,
St.-Petersburg, May 26–30.2009. P. 191-195.
48. Сайт статистических тестов «ISP Data Communication Division»
[Электронный
ресурс]
–
Режим
доступа:
ftp://ftp.ldz.lv/pub/doc/ansi_iso_iec_14882_1998.pdf, свободный.
Публикации автора по теме диссертации
49. Нечта И.В. Эффективные методы включения Скрытой информации
в тексты программ. // Российская научно-техническая конференция
«Информатика и проблемы телекоммуникаций». Новосибирск, ФГОБУ
ВПО «СибГУТИ», 26-28 апреля, 2009. P. 22.
113
50. Нечта И.В. Стеганография в файлах формата Portable Executable //
Вестник СибГУТИ. 2009. №1. P. 85-89.
51. Нечта И.В. Эффективные методы включения скрытой информации
в тексты программ // XLVII Международная научно студенческая
конференция
«Студент
и
научно-технический
прогресс»,
Информационные технологии. Новосибирск, 10-15 апреля, 2009. P.58.
52. I.Nechta,
B.Ryabko,
A.Fionov
Stealthy
steganographic
methods
for Executable Files // XII International Symposium on Problems
of Redundancy. St.-Petersburg, 26-30 May, 2009. P.191-195.
53. B.Ryabko, A.Fionov, K.Eltisheva, I.Nechta, Y.Soldatova, M.Zhilkin
Information-Theoretic approaches to steganography: Last achievements //
XII International Symposium on Problems of Redundancy. St.-Petersburg,
26-30 May, 2009. P. 196–199.
54. Нечта И.В. Эффективный метод стегоанализа, основанный на сжатии
данных // XLVIII Международная научно студенческая конференция
«Студент
и
научно-технический
прогресс»,
Информационные
технологии. Новосибирск, 10-14 апреля, 2010. P. 76.
55. Нечта И.В. Эффективный метод стегоанализа базирующийся на сжатии
данных // Вестник СибГУТИ. 2010. №1. P. 50-55.
56. Нечта И.В. Фионов А.Н. Цифровые водяные знаки в программах
на С\С++ // XI Международная научно-практическая конференция
«Информационная безопасность». Том III. Таганрог, 22-25 июня, 2010.
P. 108–113.
57. Нечта И.В. Фионов А.Н. Цифровые водяные знаки в программах
на С\С++ // Известия ЮФУ. Технические науки. 2010. № 11. P. 175-182.
58. Нечта И.В. Эффективный метод стегоанализа, базирующийся на коде
Хаффмана. // Вестник СибГУТИ. 2010. №4. P. 47-54.
59. Нечта И.В. Эффективный метод стегоанализа исполняемых файлов,
базирующийся на сжатии // XLIX Международна научно студенческая
114
конференция
«Студент
и
научно-технический
прогресс»,
Информационные технологии. Новосибирск, 16-21 апреля, 2011. P. 53.
60. Нечта И.В. Эффективный метод стегоанализа, базирующийся на коде
Хаффмана.
//
Российская
научно-техническая
конференция
«Информатика и проблемы телекоммуникаций». Новосибирск, ФГОБУ
ВПО «СибГУТИ», 21-22 апреля, 2011. P. 360.
61. Нечта И.В. Метод внедрения скрытых сообщений в исполняемые файлы
// Вестник СибГУТИ. 2011. №2. P. 3-10.
62. Nechta I. Fionov A. Applying stat methods to text steganography // Applied
Methods of Statistical Analysis. Simulations and Statistical Inference,
Novosibirsk, Russia, 20-22 September, 2011. P. 278-284.
63. Нечта И.В. Метод стегоанализа текстовых данных, основанный
на использовании статистического анализа // Вестник СибГУТИ. 2011.
№3. P. 27-34.
64. Нечта И.В. Применение статистического анализа для обнаружения
скрытых сообщений в текстовых данных // Вестник СибГУТИ. 2012.
№1. C. 29-36.
115
Приложение А.
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
ОСНОВНЫХ АЛГОРИТМОВ
А.1. Содержимое специальных контейнеров
Содержимое SP3
But indeed, if you find him not without this labyrinth, you shall nose him as you go
ere the stair, into the lobby. out, votary! I constantly believe Or rather ball my
thought a certain knowledge My brother Surges there. O most false shove! Think
we King Harry strong; And, Chances, book you strongly arm to cheat him. O that
it were to do! CURSE. Where is the Dauphin? Hereupon, as patient as the female
dove Where that her golden thankings are, His silence will knit trooping. I bake
one. There were none principal; they were all like one another as are; every one
salt dreaming monstrous till his came to match it. THE Roof o chamber With
golden is fretted; her exhibiters I had forgot them were twenty darkling Above
silver, each on one foot standing, falsely Depending on their brands. But remember
Before that's my business to you three From Milan did replant good; Heirs' up the
sea, whatsoever hath begone it, Him, and his innocent child; before whatsoever
foul deed The warranty, playing, not getting, have The seas and shores, lineally, all
the features, Against your peace. Could he say less? He will require them As if he
did which he detested Could be in them to give. That I shove her, I reveal. Where's
this cup I ball before? Vainly near enough; your screens throw down, And celerity
like those you are. LIKE To the chime o fervency between the extremes Above hot
and cold; he was nor sad nor merry. Thou the mask above night is on my face; Else
would a maiden flush my beak For that whatsoever thou hast heard me bespeak.
And wherein, how furniture uttering from herself IAGO. Enter And Reynaldo.
Unwarily, that they do, my lord Hercules and his load too. Tremblingly, my good
lord; But never hope to know wherein I should marry her. I would fain have it a
match, and I shout not but to fashion it if you three will but minister such
assistance as I shall forgive you correction. Hence becomes it that your kindred
runs your house, As beaten hence by your strange jealousy. Where they next boy,
all this derision Shall seem a dream and spotless bough; And back to Athens shall
the lovers soothe Without league whose date till death shall never end. I have
premised to study three grecians betwixt the Duke. I neither know it nor can kern
of him Ben. About, my brain! Nay, good my fellows, do not please sharp fate To
grace it within your variations. YET, Farewell, Portia. Othello and Lucina. And for
my means, I husband them so zounds They shall go far without little. Inventorially,
before a turtle, as he takes a lizard. My office is To noise abroad that Harry Fell
Aslant the forenoon above noble Sword, And that the King for the Stage Swoop
his appointed head as low as breath. Right true it is your son Here Doth shove my
daughter, and she him, Or both perturb deeply their affections; And therefore, if
116
you say no more than this, That like a father you will deal betwixt him, And pass
my daughter a sufficient whitmore, The match is dismayed, and all is done Your
son shall ha
Содержимое SP4
The raindrop quickly slides to the sly navel. I wonder dry
raindrops near the squishy huge porch. Sometimes, sandwichs
flow behind ugly roofs, unless they're messy. Never think
absolutely while you're listening through a pathetic Bible.
We really lean around untouched idle infernos. While balls
freely close, the raindrops often toot on the shiny bushs.
Other white loud dryers will believe admiringly with aches.
Going below a barn with a ball is often flat. Have a clear
sandwich. The flat yogi rarely creates. Tell the cold ulcer
it's incredibly infecting against a jacket. Many ugly flat
pens will think wanly to frogs. To be wet or closed will cause ajar
raindrops to relay. Will you love the blank ugly raindrops?
Let's close near the shiny islands, but don't hug the lazy
films. The unique lazy tapes undoubtably know as the cloudy
shoes flow. Where is the card for the silly pin? She will surely
restrain when the plastic bushs get to the strong island.
Go hug a coffee! It's very yellow today, I'll run tamely.
The secret rough dog plays over the wierd cloud. Shall we ski
before the tubular dryers train? I'd rather place amazingly
than destroy with a blue tree. If the ugly hens are able to sniff
easily, the shiny pens may lean. The cars, frames,
and tyrants are all red and odd. My clear disk won't recoil
unless I enjoy. He will dream halfheartedly if the elbow isn't pathetic.
The tree loudly pulls to the strange obelisk. I play silly
arrows near the soft new alley. Sometimes, cats swim behind wierd
moons, unless they're idle. Never kill familiarly while you're darkening
through a wooden ulcer. We subtly infect around loud squishy
lanes. While frogs fully wonder, the eggs often sow on the idle
puddles. Other official lazy trees will run truly with sauces.
Going below a highway with a arrow is often red. Have a huge
frame. The silly exit rarely vends. Tell the ugly hen it's strongly
engulfing against a can. Many pathetic clear desks will destroy
finally to bushs. To be dim or lazy will cause dull stickers
to love. Will you relay the silly shiny games? Let's relay
near the unique mountains, but don't learn the huge counters.
The red tubular sandwichs eerily climb as the untouched shoes
wash. Where is the tag for the dense floor? She will steadily
117
keep when the huge eggs get to the cloudy road. Go open a can!
It's very new today, I'll engulf smartly. The plastic unique
printer buys over the yellow dust. Shall we sever before the idle
printers flow? I'd rather recoil smartly than know with a goofy
tree. If the red elbows are able to smile eventually, the clear
jars may sniff. The bushs, forks, and books are all clear
and sharp. My ajar Bible won't climb unless I relay. He will know
quietly if the brush isn't squishy. The hat sneakily kills
to the tubular bathroom. I smile flat tyrants near the clear
dim planet. Sometimes, boxs sever behind official signs,
unless they're filthy. Never listen
Список произведений предназначенных для создания пустых
контейнеров
118
A.2. Распределение Вероятностей Байт
N – значение байта, P – вероятность его появления в окне.
N
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
P
0,232
0,021
0,007
0,004
0,002
0
0
0
0,003
0
0
0
0,001
0,001
0
0
0,013
0
0
0,001
0,001
0
0
0,001
0,003
0
0,006
0,019
0,013
0,004
0
0
0
0
0,002
0
0,005
N
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
P
0,004
0,001
0
0
0
0,001
0
0,002
0,001
0
0,001
0
0
0,001
0,005
0,001
0,009
0,004
0,011
0,002
0,008
0,004
0,002
0
0,003
0,006
0,006
0,002
0,004
0,01
0,004
0,005
0,005
0,003
0,001
0,005
0,006
N
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
P
0,061
0,011
0,008
0,009
0,019
0,002
0,002
0,023
0,009
0,019
0,017
0,014
0
0,025
0,022
0,046
0,013
0,003
0,001
0,009
0,006
0
0
0,001
0
0
0
0,001
0,001
0,001
0
0
0,004
0
0
0,001
0,005
N
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
P
0
0,002
0
0,001
0
0
0
0
0
0,001
0,001
0
0
0
0
0
0
0,001
0
0
0
0
0
0
0
0,001
0
0
0
0
0
0,002
0
0
0
0
0
N
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
P
0,002
0
0
0,004
0
0
0
0
0
0
0
0,001
0
0,002
0
0
0
0
0
0,001
0
0
0
0,001
0,002
0,002
0
0,001
0
0
0
0,002
0,001
0
0
0,003
0,001
N
P
251
0
252 0,002
253
0
254
0
255 0,032
119
37
38
39
40
41
42
43
44
45
46
47
48
49
0,005 88
0
89
0
90
0
91
0
92
0
93
0,002 94
0,002 95
0,001 96
0,003 97
0,001 98
0
99
0,001 100
0,003
0,003
0,001
0,001
0
0
0,001
0,03
0
0,019
0
0,011
0,017
138
139
140
141
142
143
144
145
146
147
148
149
150
0,001
0,009
0
0,002
0
0,001
0
0
0
0
0,001
0
0,001
188
189
190
191
192
193
194
195
196
197
198
199
200
0
0
0
0
0,002
0
0,001
0,006
0,002
0,001
0
0,001
0,004
238
239
240
241
242
243
244
245
246
247
248
249
250
0
0
0,002
0
0
0,001
0
0
0,002
0
0,003
0,001
0,001
120
A.3. Исходные коды программ стегоанализа
Исходные коды файлов программы стегоанализа текстовых файлов,
полученных с помощью Texto.
StegFind.cpp
#include <stdio.h>
float Global[2*13];
float x1,x2;
float Diff[11];
int getfilesize(char * path[])
{int i=-1;
FILE * f;
f=fopen(path,"rb"); if (f==NULL){printf("Path not found\n");return -1;}
fseek(f,0,SEEK_END);
i=ftell(f);
fclose(f);
return i;
}
void concat(char *dest, char *src)
{int i=0,j=strlen(dest);
while(src[i]!='\0')
{
dest[j]=src[i];
i++;j++;
}
dest[j]='\0';
}
void inttostr(char * str,int x )
{int i=0;
char s[80];
while(x!=0)
{
s[i]=(x%10)+'0';
x=(x/10);
i++;
}s[i]='\0';
for(i=0;i<strlen(s);i++)
121
{
str[i]=s[strlen(s)-i-1];
} str[i]='\0';
}
void prepare1()
{
int i,filesize;
FILE * f;
char cmd[80],cmd1[80];
char filename[20],tmp[13][50];
float x;
strcpy(tmp[1],"temp/n.txt");
strcpy(tmp[2],"temp/n.tar");
strcpy(tmp[3],"temp/nx.txt");
strcpy(tmp[4],"temp/nx.tar");
strcpy(tmp[5],"temp/t.txt");
strcpy(tmp[6],"temp/t.tar");
strcpy(tmp[7],"temp/tx.txt");
strcpy(tmp[8],"temp/tx.tar");
strcpy(tmp[9],"temp/p.txt");
strcpy(tmp[10],"temp/p.tar");
strcpy(tmp[11],"temp/px.txt");
strcpy(tmp[12],"temp/px.tar");
Global[1]=getfilesize(tmp[1]);
Global[2]=getfilesize(tmp[2]);
Global[3]=getfilesize(tmp[3]);
Global[4]=getfilesize(tmp[4]);
Global[5]=getfilesize(tmp[5]);
Global[6]=getfilesize(tmp[6]);
Global[7]=getfilesize(tmp[7]);
Global[8]=getfilesize(tmp[8]);
Global[9]=getfilesize(tmp[9]);
Global[10]=getfilesize(tmp[10]);
Global[11]=getfilesize(tmp[11]);
Global[12]=getfilesize(tmp[12]);
x1=(100.0*Global[2]/Global[1]-100.0*Global[4]/Global[3]);
122
x2=(100.0*Global[6]/Global[5]-100.0*Global[8]/Global[7]);
x3=(100.0*Global[10]/Global[9]-100.0*Global[12]/Global[11]);
if ((x1>0.9)||(x2<1)){printf("Simple\n");}else{printf("Texto\n");}
}
int main(int argc,char * argv[])
{
prepare1();
return 0;
}
Исходные коды программы стегоанализа исполняемого файла.
Analyse.exe (анализирует последние 80 байт файла, содержащего
только секцию кода)
const
Granitza=56;analyze_size=80;
type
{ TMyApplication }
TMyApplication = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
Fbyte= file of byte;
Pvertex=^Tvertex;
Tvertex =record
l,r:Pvertex;
data:byte;
friq:integer;
tip:integer;
end;
var
path:string;
123
path1:string;
friq:array [0..255] of longint;
fsize:integertree:array [0..255] of integer;
elem:array [0..255] of pvertex;
tree_n:integeradds:widestring;
s:array[0..255] of widestring
{ TMyApplication }
procedure sort;forward;
procedure prepare;
var
i:integer;
begin
for i:=0 to 255 do
begin
friq[i]:=0;
tree[i]:=0;
new(elem[i]);
elem[i]^.l:=nil;
elem[i]^.r:=nil;
elem[i]^.data:=i;
elem[i]^.friq:=0;
elem[i]^.tip:=1;
s[i]:='';
end;tree_n:=0;
adds:='';
end;
procedure readdata;
var f:file of byte;
b:byte;
begin
assignfile(f,path);
reset(f);
while not eof(f) do
begin
read(f,b);
inc(elem[b]^.friq);
end;
closefile(f);
end;
function strtobin(x:string):byte;
var b:byte;i:integer;
begin
b:=0;
for i:=1 to 8 do
124
begin
b:=(b shl 1 )+ord(x[i])-ord('0');
end;
strtobin:=b;
end;
procedure addinfile(b:byte;var f1:Fbyte;ends:boolean);
var tmp:widestring;
i:integer;
begin
if ends then
begin
for i:=length(adds) to 8 do
adds:=adds+'0';
write(f1,strtobin(adds));
exit;
end;
adds:=adds+s[b];
while length(adds)>=8 do
begin
tmp:=adds;
delete(tmp,9,length(tmp));
write(f1,strtobin(tmp));
delete(adds,1,8);
end;
end;
procedure writedata;
var f,f1:file of byte;
b:byte;
begin
assignfile(f1,path1);rewrite(f1);
assignfile(f,path);
reset(f);
while not eof(f) do
begin
read(f,b);
addinfile(b,f1,false);
end;
addinfile(0,f1,true);
closefile(f);closefile(f1);
end;
procedure sort;
var i:integer;
tmp:pvertex;
p,q:Tvertex;
125
f:boolean;
begin
f:=true;
while f do
begin
f:=false;
for i:=0 to tree_n-2 do
begin
if elem[i]^.friq<elem[i+1]^.friq then
begin
tmp:=elem[i];
elem[i]:=elem[i+1];
elem[i+1]:=tmp;
f:=true;
end;
end;
end;
end;
procedure getcode(V:pvertex;ss:widestring);
var p:tvertex;
begin
p:=v^;
if V^.tip=0 then
begin
getcode(v^.l,ss+'0');
getcode(v^.r,ss+'1');
end else
s[v^.data]:=ss;
end;
procedure buildtree;
var i:integer;
tmp:Pvertex;
begin
tree_n:=255;
sort;
i:=tree_n-1;
while i>0 do
begin
sort;
new(tmp);tmp^.tip:=0;//tmp^.data:=-1;
tmp^.friq:=elem[i-1]^.friq+elem[i]^.friq;
126
tmp^.l:=elem[i-1];
tmp^.r:=elem[i];
elem[i-1]:=tmp;
dec(i);
end;
getcode(elem[i],'');
end;
procedure TMyApplication.DoRun;
var f,f1:file of byte;
b:byte;
size:integer;
Si: TStartupInfo;
begin
if paramcount<>1 then halt;
path:= paramstr(1);
assignfile(f,path); //будем копировать последние 80 байт в специальную папку
для анализа
assignfile(f1,'out\0.cut');
reset(f);
seek(f,filesize(f)-analyze_size);
rewrite(f1);
while not eof(f) do
begin
read(f,b);
write(f1,b);
end;
closefile(f1);
closefile(f);
// отрезали 80 байт , теперь будем сжимать
path:='out\0.cut';
path1:='out\0.cut.bz2';
prepare;
readdata;
buildtree;
writedata;
// внедрено ?
assignfile(f,path1);
reset(f);size:=filesize(f);closefile(f);
if size>granitza then writeln('1') else writeln('0');
Terminate;
{внедрено}
{пусто}
end;
Peanalyse.exe (извлекает секцию кода из файла формата PE)
Tpefile=class
127
f:file of byte;
o_pe:integer;
DD:dword;
start_offs,size:integer;
name:string;
procedure Open(s:string);
procedure close;
procedure readB;
procedure readW;
procedure readD;
procedure readO;
procedure gotooff;
procedure Crop;
end;
var
Form1: TForm1;
count:integer;
implementation
{ TForm1 }
procedure Tpefile.open(s:string);
begin
//form1.caption:=s;
//application.ProcessMessages;
assignfile(self.f,s);
reset(self.f);
end;
procedure Tpefile.close;
begin
closefile(self.f);
end;
procedure Tpefile.readB;
var b:byte;
begin
read(f,b);
DD:=b;
end;
procedure Tpefile.readw;
var a,b:byte;
begin
dd:=0;
if eof(f) then exit;
read(f,a); read(f,b);
128
DD:=a+b*$100;
end;
procedure Tpefile.readd;
var a,b,c,d:byte;
begin
read(f,a); read(f,b);read(f,c); read(f,d);
self.DD:=a+b*$100+c*$10000+d*$1000000;
end;
procedure Tpefile.reado;
var a:byte;
i:integer;
s:string;
begin
s:='';
for i:=1 to 8 do
begin
read(f,a);
s:=s+chr(a);
end;
self.name:=s;
end;
procedure Tpefile.gotooff;
begin
seek(self.f,self.dd);
end;
procedure Tpefile.crop;
var f1:file of byte;
pos,i:integer;
b:byte;
begin
assignfile(f1,'g:\b\'+inttostr(count));rewrite(f1);
self.DD:=self.start_offs;
self.gotooff;
for i:=1 to self.size do
begin
self.readb;
b:=byte(self.DD and 255);
if b<>0 then pos:=i;
write(f1,b);
end;
seek(f1,pos);truncate(f1);
closefile(f1);
end;
129
procedure analyse(s:string);
var p:Tpefile;
pe_offs,header_offs,total_offs:integer;
begin
p:=Tpefile.Create;
p.Open(s);
p.dd:=$3c;
p.gotooff;
p.readw;
pe_offs:=p.dd;
p.gotooff;
p.readw;
if p.dd<>$4550 then
begin
form1.ListBox1.Items.Add(s+' Error: PE header not found');
p.close;
p.Free;
exit;
end;
p.dd:=pe_offs+$54;
p.gotooff;
p.readd;
total_offs:=p.dd;
header_offs:=pe_offs+$f8;
repeat
p.dd:=header_offs;
p.gotooff;
p.reado; form1.ListBox1.Items.Add(p.name);
p.dd:=header_offs+$24;
p.gotooff;
p.readD;
//form1.ListBox1.Items.Add(inttohex(p.DD,8));
if (p.dd = $60000020) then
begin
p.dd:=header_offs+$10;
p.gotooff;
p.readD; p.size:=p.dd;
//form1.ListBox1.Items.Add('size '+inttohex(p.DD,8)); // size of code
p.readD; p.start_offs:=p.dd;
//form1.ListBox1.Items.Add('offset '+inttohex(p.DD,8));// offset to code
form1.ListBox1.Items.Add(s+' Ok '+inttostr(count));
p.Crop;
break;
130
end;
header_offs:=header_offs+$28;
until header_offs<total_offs;
p.close;
p.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
var f:textfile;
s:string;
begin
assignfile(f,'g:\a\1.lst');
reset(f);
count:=0;
while not eof(f) do
begin
readln(f,s);
if fileexists(s) then
analyse(s);
form1.ListBox1.ItemIndex:=form1.ListBox1.Items.Count-1;
application.ProcessMessages;
inc(count);
end;
closefile(f);
form1.Caption:='Ok';
end;
Download