Научная статья на тему 'О МЕТОДЕ СЧИТЫВАНИЯ ЦИФРОВОГО ВОДЯНОГО ЗНАКА В ИСПОЛНЯЕМЫХ ФАЙЛАХ'

О МЕТОДЕ СЧИТЫВАНИЯ ЦИФРОВОГО ВОДЯНОГО ЗНАКА В ИСПОЛНЯЕМЫХ ФАЙЛАХ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
73
10
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ЦИФРОВЫЕ ВОДЯНЫЕ ЗНАКИ / ЗАЩИТА АВТОРСКИХ ПРАВ / TAMPER PROOFING / КОНТРОЛЬ ЦЕЛОСТНОСТИ / НЕПРОЗРАЧНЫЕ ПРЕДИКАТЫ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Нечта Иван Васильевич

В рамках исследования предлагается метод считывания цифрового водяного знака в исполняемом файле. Рассматриваемый водяной знак относится к разряду полухрупких, которые разрушаются при заданной доле изменений в программе. Указанный метод может быть применён для контроля целостности программного обеспечения. Разработанный алгоритм обладает рядом свойств, позволяющих противодействовать анализу кода. Защищенная таким образом программа считывает хранимый водяной знак по байтам в псевдослучайном порядке, что затрудняет выявление и последующее разрушение механизма контроля целостности. Предложенный алгоритм является расширением подхода непрозрачных предикатов. Показана высокая трудоёмкость атаки на данный метод при использовании точек остановки с условиями и трассировки.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Нечта Иван Васильевич

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

ON THE METHOD OF READING A DIGITAL WATERMARK IN EXECUTABLE FILES

As part of this this research a method for reading a digital watermark is suggested for executable files. The watermark in question belongs to the category of semi-fragile, which is destroyed at a given percentage of changes in the program. Specified method can be used to control software integrity. The developed algorithm has a number of properties that make it possible to counteract code analysis. The program protected in this way reads the stored watermark by bytes in a pseudorandom order making it difficult to detect and destroy the integrity control mechanism. The proposed algorithm is an extension of the opaque predicate approach. The high complexity of attacking this method based on breakpoints with conditions and tracing is presented.

Текст научной работы на тему «О МЕТОДЕ СЧИТЫВАНИЯ ЦИФРОВОГО ВОДЯНОГО ЗНАКА В ИСПОЛНЯЕМЫХ ФАЙЛАХ»

УДК 004.422

О методе считывания цифрового водяного знака

в исполняемых файлах

И. В. Нечта

В рамках исследования предлагается метод считывания цифрового водяного знака в исполняемом файле. Рассматриваемый водяной знак относится к разряду полухрупких, которые разрушаются при заданной доле изменений в программе. Указанный метод может быть применён для контроля целостности программного обеспечения. Разработанный алгоритм обладает рядом свойств, позволяющих противодействовать анализу кода. Защищенная таким образом программа считывает хранимый водяной знак по байтам в псевдослучайном порядке, что затрудняет выявление и последующее разрушение механизма контроля целостности. Предложенный алгоритм является расширением подхода непрозрачных предикатов. Показана высокая трудоёмкость атаки на данный метод при использовании точек остановки с условиями и трассировки.

Ключевые слова: цифровые водяные знаки, защита авторских прав, tamper proofing, контроль целостности, непрозрачные предикаты.

1. Введение

При решении задач, связанных с информационной безопасностью, в ряде случаев возникает необходимость не только скрыть информацию от третьих лиц, но и скрыть сам факт передачи секретного сообщения. Исследованием методов построения тайных каналов связи занимается наука стеганография. Задача стеганографии формулируется следующим образом. Пусть имеются двое заключенных - Алиса и Боб, которые сидят в различных ячейках камеры. Их задача - обсудить детали плана побега так, чтобы охранник Ева, которая может анализировать все передаваемые сообщения, не заподозрила о готовящимся побеге. Для решения этой задачи Алиса выбирает безобидный на внешний вид объект данных (т.н. контейнер) и встраивает с помощью стеганографических методов скрытую информацию. При передаче Бобу такого «заполненного» контейнера Ева даже после проведения анализа не сможет однозначно утверждать о наличии факта внедрения.

Методы стеганографии активно применяются в системах защиты авторского права. В одном случае при разработке защищенной программы автор встраивает цифровой водяной знак (ЦВЗ) - скрытую информацию, содержащую, например, паспортные данные, в каждый модуль исполняемого файла. При обнаружении несанкционированного использования такой программы посторонним скрытая информация может быть извлечена и продемонстрирована в суде. Таким образом установится истинное авторство. В другом случае программист может встраивать уникальный цифровой отпечаток пальца, идентифицирующий конечного (лицензионного) потребителя. В случае обнаружения пиратской копии программы отпечаток пальца может быть извлечен, что позволит определить нарушителя лицензионного соглашения.

Существуют различные свойства и виды цифровых водяных знаков. Упомянутые ранее устойчивые водяные знаки (робастные) позволяют противодействовать их удалению или искажению, т.е. злоумышленнику затруднительно исказить контейнер так, чтобы водяной знак разрушился, а работоспособность программы не пострадала. Хрупкие ЦВЗ, наоборот, разрушаются при малейшем изменении программы, контролируя тем самым целостность кода.

Например, после установки оригинального браузера компьютер был атакован вирусными приложениями, которые внесли модификации в модули браузера, позволяющие перехватывать пароли. Для противодействия этому защищенный браузер при каждом запуске анализирует состояние хрупкого ЦВЗ и в случае разрушения сигнализирует об это пользователю.

Настоящая работа посвящена элементу функционирования хрупкого водяного знака -механизму контроля целостности программы (tamperproofing mechanism). Существующие методы контроля целостности базируются на вычислении криптографических хэш-функций от защищаемого участка кода и последующем сравнении полученного значения с некоторым эталоном. Например, в работе [1] приводится обзор методов контроля целостности. Описаны методы измерения характеристик программ: времени выполнения, значений хэш-функций или контрольных сумм. Измерения могут выполняться как локально [2], средствами самой программы, так и удаленно [3], через отсылку измеренных данных на удаленный доверенный сервер, который проводит анализ. Известны три вида архитектур защищённой программы: модуль с самотестированием [4], внешний модуль тестирования [5] и архитектура на базе ги-первизора [6, 7], в котором виртуально выполняются защищённые процессы. Известны механизмы, базирующиеся на аппаратных средствах [8, 9]. В аппаратном модуле находится доверенная среда тестирования, которая не может быть искажена злоумышленником, так как это потребует анализа и перестройки микросхемы модуля.

Очевидно, что рассмотренные механизмы контроля целостности, базирующиеся на программном анализе кода, имеют уязвимость в части проверки. Допустим, злоумышленник в ходе дизассемблирования нашел место проверки значения хэш-функции с эталоном. Тогда он может заменить команду проверки равенства на неравенство, что позволит беспрепятственно искажать программу. В этой связи активно применяются методы запутывания (obfuscation), которые модифицируют код программы так, что ее анализ становится крайне трудной задачей. Например, используются непрозрачные предикаты [10], условия которых всегда либо истинны, либо ложны и одна из ветвей ведет к неиспользуемому участку кода (т.н. мертвый код). Существуют и другие подходы, базирующиеся на усложнении процессов дизассемблирования и анализа программы, подробнее описанные в работе [11]. Тем не менее существует ряд алгоритмов, которые позволяют проанализировать запутанный код, например, с целью выявления вредоносных программ [12]. В работе [13] утверждалось, что злоумышленник всегда способен за полиномиальное время выявить весь механизм контроля целостности программы. В этой связи ставится задача на затруднение работы злоумышленника так, чтобы время взлома превышало время основных коммерческих продаж программы. Следовательно, финансовый урон будет незначительным.

Настоящая работа посвящена построению метода считывания цифрового водяного знака в программном приложении с целью контроля целостности кода. В качестве такого водяного знака выступает фрагмент кода программы, модификация которого нежелательна для разработчика программы. Новый метод позволяет учесть стратегию злоумышленника при атаке на ЦВЗ и особенности имеющихся в его распоряжении программных средств, позволяющих эффективно проводить анализ работы приложения.

2. Описание предлагаемого алгоритма

Существуют различные программные средства для анализа и изменения программы. В настоящий момент популярными дизассемблерами, позволяющими анализировать программу в виде ассемблерного кода, являются OllyDbg [14], IDAPro [15], WinDBG [16] и др. Их функционал позволяет отлавливать вызовы API функций ядра ОС и устанавливать точки остановки (Break Points). Точки остановки представляют собой команду с опкодом 0xCC (int 3 -вызов прерывания № 3). Такая команда записывается в код отлаживаемой программы и при её выполнении управление передается из программы в отладчик. Существует способ пошаговой отладки - трассировка (Trace). В таком режиме после каждой выполненной команды про-

граммы управление передается в отладчик, следовательно, появляется возможность устанавливать точки остановки с условием. Например, передать управление пользователю в момент окончания цикла и при заданном значении счётчика. Такой механизм позволяет быстро выявлять ход работы программы, пропуская трудоёмкие циклические операции. Недостатком технологии является большое время выполнения даже малого участка кода, поэтому её в чистом виде не используют. Обычные (программные) точки остановки не позволяют отслеживать чтение и запись в ячейки памяти. Поэтому в архитектуре процессоров Intel и AMD существует четыре регистра аппаратной остановки программы: DR0-DR3. При их использовании программа передаст управление отладчику, когда произойдет обращение (исполнение, чтение или запись) к памяти по адресу, указанному в одном из этих регистров. К недостаткам следует отнести малое число регистров для обработки точек остановки.

Существуют различные способы противодействия отладке [17]. С одной стороны, используется перезапись значений регистров DR0-3, с другой - анализируется состояние операционной системы на наличие признаков отладки. Известны подходы, базирующиеся на расчёте времени выполнения кода, которое, очевидно, возрастает в режиме отладки. Наиболее эффективным методом противодействия отладке является пофрагментная расшифровка и последующее выполнение кода. При расшифровке новый код записывается в память, перезаписывая, при наличии, команды точек остановки. Несмотря на то, что пароль для расшифровки доступен злоумышленнику, убрать шифрование, заменив расшифрованным кодом, не представляется возможным в силу постоянной проверки целостности кода другими компонентами защиты.

Очевидно, что злоумышленник может попытаться выявить места вычисления оригинального значения хэш-функций от кода программы с целью его последующей замены. Например, программа была модифицирована, следовательно, хэш-значение поменялось, но если известно, где оно хранится на момент окончания расчёта и перед проверкой с эталоном, то возможна его подмена на оригинальное значение. Другой подход предполагает изменение условия сравнения эталонного значения и рассчитанного. Например, можно заменить проверку равенства двух значений на неравенство. Тогда программа при неверном хэш-значении будет реагировать, как при верном. Последний подход трудно реализуем, так как проверка и вывод сообщения об ошибке выполняется не сразу после вычисления хэш-функции, а через некоторое время, что существенно затрудняет злоумышленнику поиск данного места сравнения в коде.

Существующие методы расчёта хэш-значения считывают код последовательно. Как только код считан, то его значение необходимо сравнить с эталоном. Считается, что поиск этого места сравнения является главной задачей злоумышленника. При последовательном чтении легко выявить места считывания последнего фрагмента кода и хранения его соответствующего хэш-значения, которое более не должно меняться. Следовательно, последующее обращение к этому хэш-значению, которое легко выявляется аппаратными точками остановки, будет сравнением с эталоном. Таким образом, злоумышленник способен найти место проверки целостности кода. Можно утверждать, что последовательное чтение кода потенциально уязвимо перед анализом с использованием аппаратных точек остановки.

Известные ранее методы предполагали, что анализ программы будет затруднен в силу применения методов запутывания и антиотладочных механизмов. В настоящей работе предлагается контролировать целостность работы программы, рассматривая её как водяной знак. Чтение водяного знака осуществляется не последовательно, а в псевдослучайном порядке, что позволяет затруднять процесс анализа программы.

Опишем подробнее предлагаемый метод. Обозначим через Encode (pwd, message) процесс шифрования блоковым шифром, где pass - пароль, message - сообщение. Encode-1 -расшифровка. Введем функцию для считывания из оперативной памяти кода программы (с целью дальнейшего вычисления хэш-функции1) GetCode(address). В настоящей работе предполагается вычислять адрес считываемого байта программы по формуле address = ах mod р, при простом р различные степени х будут давать различные значения address €

1 Сам расчёт хэш-функции выходит за рамки предлагаемого алгоритма.

[0;р — 1], 1 < а < р — 1. Используется хэш-функция Ьа5Ь(Ь01а,пе'№Ьу1е), рассчитыващая значение на основе значений считанного байта и её предыдущего значения. В силу используемого в Алгоритме 2 побайтового считывания необходимо использовать хэш-функцию со свойством коммутативности. Например, контрольные суммы или функция вида дЪ1ь2^.ьп р , где {Ь1, Ь2,..., Ьп} - считанные байты. Ниже в табл. 1 приведён список используемых идентификаторов и их описание.

Таблица 1. Описание используемых идентификаторов

Имя переменной Диапазон значений Способ инициализации Описание

to (1;P-1) задаётся константа

messenc вычисляется шифрованное сообщение

h* - вычисляется оригинальное значение хэш-функции

12 - вычисляется адрес (метка) окончания Алгоритма 2

k kEN задаётся константа

codeSjZP - вычисляется размер защищаемого фрагмента кода

stop - вычисляется смещение последнего считываемого байта во фрагменте

a (1;P-1) задаётся константа

p p EN задаётся константа, простое число

const const E N задаётся константа

Li - вычисляется адрес (метка) начала цикла чтения байт кода

reg - вычисляется переменная для хранения адреса перехода

b [0;255] считывается считанный байт кода

h - вычисляется расчётное значение хэш-функции

i - вычисляется вспомогательная переменная

offset - вычисляется смещение текущего считываемого байта во фрагменте

StOXt^Yg - вычисляется адрес начала фрагмента

Ниже представлены алгоритмы на псевдокоде. В особо значимых местах команды будут написаны на языке ассемблера (выделены полужирным шрифтом), что является принципиально важным.

Алгоритм 1. Предварительный расчёт.

messenc = Encode(t0 ,L2 + k* Codesize)

stop = ato*h mod p i = (t0 + const) mod p

Алгоритм 2. Считывание фрагмента цифрового водяного знака в исполняемом файле. hi = 0 // инициализация

Li. //метка (адрес) начала цикла

offset = a1 mod р

b=ReadCode(startfrg + offset) // считываем следующий байт кода программы hi+1 = hash(hi, b) //этап вычисления значения хэш-функции

// пытаемся расшифровать адрес L2 reg = [Encode-1(i ,messenc)] mod Codesize i = (i + 1) mod p

cmp stop, offsethi mod p //считывание фрагмента завершается?

je reg //если значения равны, то алгоритм выполнен

jmp L1 //иначе переходим в начало цикла

Используемые переменные поделены (см. табл. 2) на две категории доступа: открытая -доступ к которой злоумышленником не представляет опасности и закрытая - доступ к такой переменой позволит разрушить защиту. Закрытые переменные следует защищать методами запутывания кода.

Таблица 2. Категории доступа переменных

Категория Категория Категория

Перемен- доступа Перемен- доступа Перемен- доступа

ная откры- закры- ная откры- закры- ная откры- закры-

тая тая тая тая тая тая

to + CodeSj7e + offset +

h* + а + b +

h + р + StQ.Vt.fYg +

h + i + h +

k + stop + const +

messenc + гед +

Для нахождения значения h* можно воспользоваться функцией внутри программы. Например, значение может быть выведено на экран (например, при фиксированном значении некоторой переменной). Алгоритмы не должны применяться к участкам памяти, в которых хранится значение h*. Быстрое выполнение Алгоритма 1 снижает вероятность его обнаружения средствами отладки. Сообщение, хранящее адрес 12, шифруется ключом t0.

Покажем корректность работы алгоритмов. Хэш-функция вычисляется от считанных байт. Окончание расчётов происходит тогда, когда a1 mod р = ato mod р, т.е. i = t0, что даст возможность корректно расшифровать сообщение. Далее из сообщения находится L2. Действительно, так как метка 12 располагается внутри кода программы, то всегда справедливо неравенство L2 < Codesize, следовательно, [L2 + k * Codesize] mod Codesize = L2. Таким образом, произойдёт выход из Алгоритма 2. Сообщение messenc расшифровывается ключом i, правильная расшифровка возможна только тогда, когда i = t0. В остальных случаях гед ф Ь2.

3. Анализ предлагаемых алгоритмов

В данной главе мы рассмотрим ключевые моменты и особенности работы предложенных алгоритмов. Сформулируем рекомендации, которых необходимо придерживаться для уменьшения вероятности успешной атаки на представленные алгоритмы.

1. Алгоритмы следует применять совместно со средствами запутывания.

2. Алгоритм 1 должен быть защищен от обнаружения. Это сделать нетрудно в силу малого количества его операций.

3. Алгоритм 2 не следует выполнять непосредственно после Алгоритма 1. Алгоритмы должны быть разнесены по коду и по времени выполнения (последовательное размещение в памяти или выполнение повышает вероятность обнаружения).

4. Алгоритм 2 должен обрабатывать некоторый фрагмент кода. Механизм контроля целостности запускает Алгоритм 2 несколько раз, покрывая таким образом весь код программы.

5. Считываемые байты равномерно покрывают фрагмент кода, но не каждый байт будет считан. Следовательно, для критически важных участков рекомендуется запускать алгоритмы с другими параметрами, чтобы контролировать каждый байт кода программы.

6. Рекомендуется запускать Алгоритмы 1 и 2 несколько раз, причём каждый раз менять не только один из байтов фрагмента, но и ссылаться на различные (фиктивные) концы алгоритма (Ь2). Только одно из рассчитанных значений будет реально использоваться.

Таким образом, создается множество ложных значений хэш и усложненная форма непрозрачных предикатов, ведущая к фиктивному (мертвому) коду. Можно считать проблематичным атаку перебора значений i для взлома шифра, так как потребуется доступ к байтам кода (к коду другой программы), чему можно противодействовать.

7. Необходимо иметь несколько реализаций алгоритмов в коде. Выявление и разрушение единственной функции для расчёта хэш создает угрозу успешной атаки.

8. Между запусками Алгоритма 2 необходимо запускать некоторую трудоемкую операцию с целью противодействия отладке.

9. В процессе работы Алгоритма 2 необходимо контролировать целостность его кода альтернативными средствами (например, прямой проверкой или временем выполнения). В противном случае команды сравнения в памяти будут перезаписаны на небезопасные эквиваленты, что позволит реализовать атаку.

Предложенный метод обладает следующими свойствами.

1. По имеющимся открытым переменным нельзя вычислить закрытые. В одном случае необходимо вычисление трудоёмкого дискретного логарифма, в другом - решение одного уравнения с двумя неизвестными. Расшифровка методом перебора сообщения messenc не представляется возможным, так как все варианты расшифровок будут равновероятны.

2. В силу свойств функции a1 mod р считывание байтов кода происходит в псевдослучайном порядке, что не дает возможности эффективно использовать аппаратные точки остановки злоумышленником.

3. Так как число р простое, то байты фрагмента будут считаны только по одному разу.

4. В связи с тем, что размер кода не всегда является простым числом, код может разбиваться на фрагменты. Если размер кода чётный, то на основании бинарной гипотезы Гольдбаха существует разбиение на два фрагмента с размерами, равными простым числам. При нечётном размере значение одного байта может быть проверено обычным образом, а далее - аналогичное разбиение.

5. Установка точки остановки на команду je гед1 не поможет определить момент выхода из цикла, так как будет происходить срабатывание в конце каждой итерации цикла.

6. Вероятной атакой является применение трассера или условных точек остановки. Однако согласно данным, представленным в табл. 3, время такой атаки становится неприемлемо большим.

Рассмотрим время выполнения произвольного фрагмента кода (на С++), содержащего две команды в цикле. Данным примером мы хотим показать существенное увеличение времени отладки при использовании условных точек остановки. Усреднение проводилось по пяти замерам. Время представлено в тактах процессора. Дизассемблирование показало, что значения переменных xl, x2 хранятся в регистрах, что повышает скорость работы программы (в отличие от хранения значений в памяти).

Фрагмент программы 1. t1 = rdtsc(); // чтение времени до запуска цикла

for (int i=0;i<n;i++){ x1+=i+1; x2+=i+3;

}

t2 = rdtsc(); // чтение времени после запуска цикла

cout << (t2 - t1); // выводим время выполнения цикла

Из табл. 3 видно, что использование точек остановки с условиями не представляется возможным.

Таблица 3. Среднее время выполнения программы в режиме отладки.

Точки остановки Число итераций цикла 1 \п)

100 1000 10000

Без условия 396 2882 27784

С условием 20160052 194936601 1956591390

4. Заключение

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

В настоящей работе был предложен метод считывания цифрового водяного знака для исполняемых файлов. В качестве ЦВЗ рассматривается код программы. Свойства предложенных алгоритмов позволяют эффективнее противодействовать несанкционированной модификации программы по сравнению с известными аналогами. Основным преимуществом метода является то, что порядок считывания анализируемого кода является псевдослучайным. Предполагается, что предложенный метод будет использоваться для контроля целостности программного кода. Новый метод должен применяться в дополнение к существующим методам противодействия отладке.

Литература

1. AhmadvandM., Pretschner A., Kelbert F. A taxonomy of software integrity protection techniques // Advances in Computers. Elsevier. 2019. V. 112. P. 413-486.

2. Abrath B., Coppens B., Volckaert B., Wijnant J., De Sutter B. Tightly-coupled selfdebugging software protection // Proceedings of the 6th Workshop on Software Security, Protection, and Reverse Engineering, SSPREW '16, New York, NY, USA, ACM, 2016. P. 7.

3. Baumann A., Peinado M., Hunt G. Shielding applications from an untrusted cloud with haven // ACM Transactions on Computer Systems (TOCS). 2015. V. 33, № 3. P. 8.

4. Banescu S., Ahmadvand M., Pretschner A., Shield R., Hamilton C. Detecting patching of executables without system calls // Proceedings of the Conference on Data and Application Security and Privacy, ACM, 2017. P. 185-196.

5. Blietz B., Tyagi A. Software tamper resistance through dynamic program monitoring // Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics), 3919 LNCS, 2006. P. 146-163.

6. Dewan P., Durham D., Khosravi H., Long M., Nagabhushan G. A hypervisor-based system for protecting software runtime memory and persistent storage // Proceedings of the 2008 Spring simulation multiconference. Society for Computer Simulation International, 2008. P. 828-835.

7. Park S., Yoon J. N., Kang C., Kim K. H., Han T. TGVisor: A tiny hypervisor-based trusted geolocation framework for mobile cloud clients // 2015 3rd IEEE International Conference on Mobile Cloud Computing, Services, and Engineering, 2015. P. 99-108.

8. Morgan B., Alata E., Nicomette V., Kaaniche M., Averlant G. Design and implementation of a hardware assisted security architecture for software integrity monitoring // IEEE 21st Pacific Rim International Symposium on Dependable Computing (PRDC), 2015. P. 189-198.

9. Van Oorschot P. C., Somayaji A., Wurster G. Hardware-assisted circumvention of selfhashing software tamper resistance // IEEE Transactions on Dependable and Secure Computing, 2005. V. 2 (2). P. 82-92.

10. Banescu S., Collberg C., Ganesh V., Newsham Z., Pretschner A. Code obfuscation against symbolic execution attacks // Proceedings of the 32nd Annual Conference on Computer Security Applications, ACM, 2016. P. 189-200.

11. Madou M., Anckaert B., Moseley P., Debray S., De Sutter B., De Bosschere K. Software protection through dynamic code mutation // International Workshop on Information Security Applications, Springer, 2005. P. 194-206.

12. Likarish P., Jung E., Jo I. Obfuscated malicious javascript detection using classification techniques // 2009 4th International Conference on Malicious and Unwanted Software (MALWARE), IEEE, 2009. P. 47-54.

13. Dedic N., Jakubowski M., Venkatesan R. A graph game model for software tamper protection // International Workshop on Information Hiding, Springer, Berlin, Heidelberg, 2007. P. 80-95.

14. Официальный сайт программы OllyDbg [Электронный ресурс]. URL: http://www.ollydbg.de/ (дата обращения: 07.10.2019).

15. Официальный сайт программы IDAPro [Электронный ресурс]. URL: https://www.hex-rays.com/products/ida/index.shtml (дата обращения: 07.10.2019).

16. Официальный сайт программы WinDBG [Электронный ресурс]. URL: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/ (дата обращения: 07.10.2019).

17. Chen X., Andersen J., Mao Z. M., Bailey M., Nazario J. Towards an understanding of anti-virtu-alization and anti-debugging behavior in modern malware // IEEE International Conference on Dependable Systems and Networks with FTCS and DCC (DSN), 2008. P. 177-186.

Статья поступила в редакцию 29.10.2019.

Нечта Иван Васильевич

к.т.н., доцент, доцент кафедры прикладной математики и кибернетики СибГУТИ (630102, Новосибирск, ул. Кирова, 86), тел. (383) 2-698-359, e-mail: ivannechta@gmail. com.

On the method of reading a digital watermark in executable files I. Nechta

As part of this this research a method for reading a digital watermark is suggested for executable files. The watermark in question belongs to the category of semi-fragile, which is destroyed at a given percentage of changes in the program. Specified method can be used to control software integrity. The developed algorithm has a number of properties that make it possible to counteract code analysis. The program protected in this way reads the stored watermark by bytes in a pseudorandom order making it difficult to detect and destroy the integrity control mechanism. The proposed algorithm is an extension of the opaque predicate approach. The high complexity of attacking this method based on breakpoints with conditions and tracing is presented.

Keywords: digital watermarks, copyright protection, tamper proofing, integrity control, opaque predicate.

i Надоели баннеры? Вы всегда можете отключить рекламу.