Научная статья на тему 'Методика защиты программного кода от несанкционированной модификации и исследования посредством его хеширования'

Методика защиты программного кода от несанкционированной модификации и исследования посредством его хеширования Текст научной статьи по специальности «Компьютерные и информационные науки»

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

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Кукарцев Анатолий Михайлович, Лубкин Иван Александрович

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

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

Method of protection computer program's code against unauthorized modification and analysis using Hashing

The paper deals with using selfmodification codes to protect computer programs against unauthorized modification. Mounted protection system for integrity control use hash-functions.

Текст научной работы на тему «Методика защиты программного кода от несанкционированной модификации и исследования посредством его хеширования»

ние избыточной сложности исходного текста, повышение показателей комментируемое™, что приводит к улучшению взаимозаменяемости программистов в процессе подготовки программ БПО.

Наиболее значимым результатом применения средств измерения является повышение качества тестирования программ: обеспечивается 100%-е покрытие тестами программ БПО по критерию С1 и приближение к максимально достижимой величине покрытия тестами по критерию С.

Библиографический список

1. Колташев, А. А. Технологические аспекты создания бортового программного обеспечения спутников связи / А. А. Колташев, А. Н. Антамошкин // Вестн. Сиб. гос. аэрокосмич. ун-та им. акад. М. Ф. Решетнева : сб. науч.

тр. / Сиб. гос. аэрокосмич. ун-т. Вып. 6. Красноярск, 2005. С. 93-95.

2. Технология разработки и верификации компонентов бортового программного обеспечения спутников связи и навигации / О.С. Иноземцева, Л.В. Клюкина, А. А. Колташев [и др.] // Материалы: Всерос. науч.-практ. конф., 10-14 окт. 2007, г. Железногорск / Сиб. гос. аэрокосмический ун-т. Красноярск, 2007. С. 165-167.

3. Черноножкин, С. К. Методы и инструменты метрической поддержки разработки качественных программ [Электронный ресурс] : автореф. дис. ... канд. физ.-мат. наук / С. К. Черноножкин. Электрон. дан. Режим доступа: http:/ www.uran.donetsk.ua/~masters/2004/kita/ukrainsky/ library/consist.htm. Загл. с экрана.

4. Еремин, А. В. Архитектура настраиваемой среды отладки / А. В. Еремин // Проблемы программирования. Киев, 2000.

A. V. Yeryomin, O. S. Inozemtseva, A. A. Koltashev, K. A. Kondratev, K. G. Lvov MEASUREMENT TOOLS FOR THE ON-BOARD SOFTWARE

Considered in this article the measurement tools are a part of the on-board software design and verification technology for the communication and navigation satellites and intend to improve quality and reliability of the on-board programs.

УЦК 004.056.53

А. М. Кукарцев, И. А. Лубкин

МЕТОДИКА ЗАЩИТЫ ПРОГРАММНОГО КОДА ОТ НЕСАНКЦИОНИРОВАННОЙ МОДИФИКАЦИИ И ИССЛЕДОВАНИЯ ПОСРЕДСТВОМ ЕГО ХЕШИРОВАНИЯ

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

В современном мире большую актуальность получила проблема защиты авторских прав. В сети Интернет можно найти множество так называемых «взломанных» программ. Большая часть из них является программами с отключенной или модифицированной системой защиты (СЗ). И это связано с тем, что большинство систем защиты от несанкционированного использования уязвимы к отключению посредством модификации, поскольку любая программа (в том числе и с установленной системой защиты) должна выполняться на центральном процессоре ЭВМ, а исполнимый код программы на момент выполнения должен существовать в оперативном запоминающем устройстве (ОЗУ) в открытом, пригодном для исполнения виде. Все это и создает основную проблему при построении системы защиты программ от модификации.

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

раскрытия принципа работы, на котором основана система защиты, появляется возможность ее быстрого преодоления.

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

Система защиты от модификации должна обладать следующими свойствами:

- защитой программы от модификации до и после загрузки в ОЗУ;

- распределенностью кода, реализующего защиту, по программе, что усложняет процесс его обнаружения и удаления;

- неотделимостью кода, реализующего защиту, от защищаемой программы;

- сокрытием логики работы программы;

- алгоритмической сложностью задачи деактивации системы;

- затруднением исследования программы;

- прозрачностью защиты.

Отметим также, что если программное средство неработоспособно после модификации, то будем считать, что модификация не удалась.

Разработанная авторами система защиты основана на использовании трех методик контроля целостности защищаемой программы: цепочечного хеш-связывания, естественного множественного условного хэш-связывания и синтетического условного хэш-связывания, которые будут рассмотрены нами далее.

Введем следующие обозначения:

- Instr(DATA) - машинная инструкция, аргументом которой является данное DATA. В результате выполнения инструкции меняется содержимое регистра флагов и (или) регистров процессора;

- Block - блок линейно выполняющихся машинных инструкций;

- @@Label - обозначение метки, т. е. символьного представления адреса. Оно может являться числом, словом, фразой;

- Jmp Addr или Jmp @@Label - безусловный переход по явно указанному в программе адресу Addr или метке @@Label. Значение адреса или метки задано в явном виде и может меняться в ходе работы программы;

- Jmp X - безусловный переход по неявно заданному в программе адресу. Адрес X, на который перейдет программа после выполнения перехода, будет определен не раньше запуска программы, но не позже выполнения инструкции, предшествующей самому переходу. К данному типу переходов так же относится команда возврата из подпрограммы RET;

- условный переход - простейшая реализация ветвления алгоритма в программе. Jcc Addr или Jcc @@Label -условный переход по адресу Addr или метке @@Label. Если условие, которому соответствует тип условного перехода, будет выполнено, то выполнение программы продолжится по адресу Addr или метке @@Label. В противном случае будет выполнена инструкция, следующая за условным переходом;

- заполнитель - данные или инструкции, обращения к которым не происходит в рамках рассматриваемого перехода;

- ХФ - хеш-функция - реализация алгоритма вычисления некоторой хеш-функции в машинных командах. Аргументами хеш-функции являются данные.

Общий вид используемых хеш-функций. Для хеш-связывания искомая функция должна по заданному аргументу (участкам исполняемого кода (ИК)) рассчитать адрес, на который необходимо перейти программе. Более сложные методики используют функции, которые выполняют такие расчеты для нескольких пар аргументов и функций. Тогда будем искать искомую ХФ в виде h (x) = c0 x° + c1x1 +... + c„_1x"-1 (mod p ) =

возможность рассчитать значения параметров хеш-функции. Рассмотрим систему уравнений

= YciX (modp)

(1)

co x0 + c1X0 + ■■■ + <VA = У0

и-1 .

(mod p)

(2)

+ c . x . = y

n-1 n-1 /и-

Будем искать ее решение в матричном виде:

( 0 1 x0 x0 xn-1 ^ 0 / \ c0

X = х0 X ■ ■ хИ-1 , C = c1

X° Xі xn-1 c

чЛи-1 Xn-1 ■■ Xn-1 1c”-1)

Y =

У0

У1

Уи-1

(3)

Система (2) будет иметь единственное решение, если выполнено условие взаимной простоты определителя главной матрицы системы (2) и модуля системы:

(е1(Х);р) = 1. (4)

Таким образом, модуль системы рассчитывается по соотношению (4). Этот модуль может быть взят как большее простое число, чем определитель главной матрицы системы. Он должен быть простым, так как существует необходимость расчета обратного элемента. В случае непростого модуля гарантировать существование обратного элемента нельзя, поскольку это кольцо. И здесь накладывается ограничение разрядности ячейки данных, которое может быть выполнено, так как большая часть расчетов ложится на установку системы безопасности.

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

где п - количество точек, которые рассчитывает функция (1); с - параметры функции.

Так как на стадии установки системы защиты пары аргументов и значений функций известны, то имеется

Рис. 1. Схема цепочечного хеш-связывания

Аргументами хеш-функции Hash являются участки кода ARG (в общем случае — программы, которые, кроме ИК, могут содержать и данные), причем в аргументы включаются не только инструкции предшествующего ХФ

i=0

блока, но и инструкции ХФ других блоков. После выполнения хеш-функции конкретизируется адрес, по которому будет осуществлен переход: если хешируемый исполняемый код не подвергался модификации, то переход будет осуществлен по корректному адресу, иначе программа перейдет по произвольному адресу и вскоре операционная система (ОС) в принудительном порядке завершит программу. Таким образом, система защиты выполняет свои функции и программа защищена от модификации. Порядок расположения блоков инструкций, расположения и объема заполнителя не критичен. Сам же заполнитель может являться невыполнимым кодом, напоминающим машинные инструкции, данными или другими блоками инструкций программы.

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

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

При увеличении количества добавленных в программу ХФ и объема хешируемого в них кода защищенность программы увеличивается, но это приводит к замедлению работы защищенной программы, хотя следует отметить, что регулировать соотношение «защищенность-скорость исполнения» все-таки возможно.

Итак, основными достоинствами метода цепочечного хэш-связывания являются затруднение анализа программного кода и необходимость снятия защиты путем отключения всех ХФ.

Естественное множественное условное хеш-связывание. Оно применяется для участков программы, содержащих условные переходы (рис. 2). На языках высокого уровня такие конструкции описываются как if (присутствует только один примитив условия), switch-case, case of и т. п.

Рис. 2. Создание естественного множественного условного хеш-связывания (участки, содержащие условные переходы, представлены в левой части рисунка)

Аргументами ХФ, кроме блоков инструкций, являются еще и данные, от которых зависит выбор ветки алгоритма. Блок данных, влияющий на то, на какую ветвь алгоритма будет осуществлен переход, выделяется из блока инструкций, предшествующего переходу, и является одним из аргументов ХФ. В такой ситуации простая статическая запись адреса приведет к неработоспособности альтернативных ветвей алгоритма. Предложенное выше решение снимает проблему взлома простым определением, куда перейдет программа после неявного перехода и задания впоследствии этого адреса явно. Контрпартнеру приходится проводить дополнительный анализ ХФ для выяснения первоначального вида условного перехода, так как неочевидно, при каких данных и на какую ветку алгоритма произойдет переход. Это усложняет написание средства для автоматизированного снятия защиты и увеличивает время анализа ХФ (см. рис. 2).

В составе ХФ должна содержаться функция, которая будет сужать все возможные значения Data в несколько точек. Определим эту функцию как g. Значение функции g обрабатывается так же, как и исполняемый код.

Hash(Ins, Data) = hash(Ins + g(Data)). (5)

В качестве алгоритма функции g можно взять, например, алгоритм проверки условия, предшествующий условному переходу, и добавить проецирование результата проверки (множество E = {0, 1}) в некоторое число (это самый простой и небезопасный вариант).

Для повышения защищенности имеет смысл комбинировать данный метод с цепочечным хеш-связыванием. Неавтоматизированный анализ и анализ с использованием отладки в случае нетривиальные функций g затруднителен, так как контрпартнеру придется либо ждать, пока ХФ не перейдет по всем корректным адресам хотя бы один раз (и так для каждого рассматриваемого условного перехода), либо затрачивать время на анализ каждой функции g с целью определения области ее значений.

Синтетическое условное хеш-связывание. Установка защиты на основе синтетического условного хеш-связывания начинается с поиска в блоке Block_P инструкции, оперирующей некоторой порцией данных DATA. Желательно, чтобы DATA не являлась константой относительно множества запусков программы. Далее создается несколько копий блока Block_N1, добавляется блок контроля корректности перехода (ККП) на блоки Block_N 1i и строится система переходов, восстанавливающая логику работы преобразуемого участка кода (рис. 3). DATA является одним из аргументов ХФ.

Блок Check не обязательно должен находиться непосредственно в начале блока Block_N1i. В зависимости от данных на входе ХФ будет выбрана та или иная ветвь синтетического условного перехода, и в каждом блоке ККП будет происходить проверка корректности выбора ветви. Если контрпартнер статически указал, на какой блок из множества должен происходить переход, то при попадании данных в «чужой» блок после проверки корректности перехода произойдет ошибка.

Рассмотрим математический аппарат формирования адреса перехода. Формула (5) выражает данный аппарат, однако в качестве функции g(Data) берется функция, обладающая следующим набором свойств:

- пусть VData є D, D = En, E = {0,1}^ g(Data)є A, причем A с A, A с Z и |A| = k <\A\ = p <~, т. e. функция проецирует любую точку данных на любую точку из ограниченного множества значений A, формирующих адреса перехода по формуле (1);

- аналитический анализ функции не может дать полных сведений о мощности множества A, но позволяет получить все сведения о множестве A;

- на стадии установки системы защиты все параметры функции, а особенно A, - известны.

- с использованием рекурсивного обхода.

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

V = V ■ , (6)

где а - среднее количество ветвей, исходящих из точки; п - уровень дерева; ¥0 - средние ресурсы, приходящиеся на один параллельный процесс или виртуальную машину (память и процессорное время).

Рис. 3. Создание синтетического условного хеш-связывания (блок ККП обозначен как блок «Check (DATA)»)

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

Представим процесс снятия защиты графически (рис. 4). Будем предполагать, что все условные переходы были защищены. Изобразим программу в виде орграфа (рис. 4, а), точками которого будут являться участки программы между многовариантными переходами ХФ, а дугами, исходящими из вершины, - возможные корректные переходы, осуществляемые после выполнения ХФ, находящейся в конце участка программы (точки орграфа). Такие переходы реализуются посредством синтетического и естественного множественного условного хеш-связывания. Выбор дуги, по которой будет осуществлен переход, зависит от данных, попадающих в программу из ОС. При наложении максимального варианта системы защиты программа является древоподобной структурой (рис. 4, б).

Для восстановления исполняемого кода необходимо обойти все ветви и определить тип перехода. Существует два основных метода снятия защиты (возможно и их комбинирование):

- с использованием виртуальных машин (параллельные вычислений);

Рис. 4. Граф переходов в программе: а - примерный реальной программы; б - древоподобный подграф программы

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

T = Т

I a

(7)

где Т0 - среднее количество времени, затрачиваемое на обработку линейной ветви алгоритма.

Отметим, что оба варианта снятия защиты сложны в техническом плане и потребуют написания специального и уникального программного обеспечения с большим временем разработки и стоимостью, скорее всего превышающей стоимость самой защищенной программы. Кроме того, оба варианта не гарантируют успеха.

Итак, авторами была разработана формальная и техническая основа нового метода защиты программного кода и реализовано несколько вариантов его внедрения в реальный объект защиты.

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

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

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

Представленная выше система защиты не привязана к какой-либо операционной системе и может применять-

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

Авторам не удалось найти аналогов данной системы защиты ни в сети Интернет, ни в открытой печати. Описанные выше механизмы реализованы программно и экспериментально проверены. Цальнейшие исследования будут проводиться в направлении формализации методов защиты программного кода и разработки новых (в том числе радикально модифицированных) защитных механизмов.

A. M. Kukartsev, I. A. Lubkin

METHOD OF PROTECTION COMPUTER PROGRAM’S CODE AGAINST UNAUTHORIZED MODIFICATION AND ANALYSIS USING HASHING

The paper deals with using selfmodification codes to protect computer programs against unauthorized modification. Mounted protection system for integrity control use hash-functions.

УЦК 681.32

К. В. Колесов

АНАЛИЗ НАДЕЖНОСТИ АЛГОРИТМА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ОРТОГОНАЛЬНОЙ СТРУКТУРЫ УЗЛОВЫМ МЕТОДОМ

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

Любую программу можно описать алгоритмом, определяющим последовательность действий. Сам алгоритм в этом случае будет представлять собой некоторую структуру, элементами которой являются отдельные подпрограммы, блоки команд или непосредственно сами команды. При длительном жизненном цикле программы возникает проблема ее надежности, поскольку программы, как и радиоэлектронные устройства, также подвергаются сбоям. А с учетом того что все большую долю стоимости современных аппаратно-программных средств определяет именно программная часть, то в настоящее время особо важной становится задача разработки методов анализа надежности этих средств. Причем желательно получение не только конкретных численных результатов показателей надежности, но и таких соотношений, которые бы позволяли оптимизировать имеющийся алгоритм и даже синтезировать структуру с заданными характеристиками. С этой точки зрения достаточно большой интерес представляет тензорный метод анализа, разработанный Г. Кроном [1].

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

одни и те же законы. Поэтому представляется возможным анализ простой системы, являющейся элементом сложной системы, с последующим переносом полученных результатов на всю систему. Увеличение же числа элементов не приводит к появлению каких-либо новых физических явлений.

Рассмотрим применение тензорного метода анализа для исследования надежности алгоритмов программного обеспечения (ПО) и представим вариант получения системы уравнений для аналитических расчетов надежности программного обеспечения, позволяющий выбрать оптимальную структуру алгоритма при заданных характеристиках надежности [2].

Методика. Система простейшего типа состоит из одномерных членов (резисторов, узлов связи, блоков), соединенных в определенных точках; силы накладываются вдоль этих членов на узлы. Подобные структуры называют сетями. Предполагается, что накладываемые электромагнитные величины мгновенно распространяются через всю сеть, т. е. рассматриваемые сети имеют сосредоточенные, а не распределенные параметры.

Отметим, что хотя исследование сетей и производится автором на языке электротехники, следует подчерк-

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