Метод и средства защиты исполняемого программного кода от динамического и статического анализа
Download 482 Kb.
|
Аранов, Владислав Юрьевич
- Bu sahifa navigatsiya:
- Определение 4.2. Функция feP
- (Хо+aiXi+(Х2Х2+...+(ХпХп
- Функции Классы булевых функций
- X V у = хлу XOR: X Ф y=xyvxy =1"у ЛХр
- Набор инструкций конкретной виртуальной машины
- Повышение скрытности алгоритма с использованием теории скрытности
- 1 = 1, А, выбирается из имеющегося арсенала с равными вероятностями p
- S(m) = A-log 2 A-(A-m)-log 2 (A-m)
49
50 AND, NOT, XOR В этом случае, команда OR выражается двумя способами: OR: х v у = х л у OR: xvу = (хлу) Ф(хФу) XOR, AND, OR NOT: -пх = х Ф 1 XOR, AND NOT: —>x = x Ф 1 OR: x vy = ((x© 1)л(уФ 1)Ф 1 XOR, OR NOT: -ix = x Ф 1 AND: x л у = ((x Ф 1) v (у Ф 1)) Ф 1 Инструкции сравнения Аналогично с логическими инструкциями, инструкции сравнения так же могут быть выражены друг через друга. Рассмотрим полные наборы операций сравнения. 1) Выразим для этого набора все остальные операции сравнения. Для остальных наборов операции сравнения, не вошедшие в набор, выражаются аналогично. х > У ~ ->(х<у)л ->(х=у) X >= У ~ ->(х<у) X <= У * (x (»<”“ = ”) 3) (“!=”,“>”) (“ != ”, “ < ”) (“>=”,“ = ”) (“>=”,“ = ”) (“>”“ = ”) Выше приведен список минимальных функционально-полных наборов инструкций сравнения. Очевидно, что при добавлении к ним дополнительных инструкций свойство функциональной полноты сохраняется, но набор инструкций изменяется. 51
«Избыточные» инструкции К этому классу инструкций относятся инструкции циклического сдвига и пара инструкций (add, sub). Циклический сдвиг Действительно, инструкции циклического сдвига выражаются через инструкции правого и левого сдвига. Так циклический сдвиг влево на s бит может быть выражен следующим образом: int roti(int a, int s) { return (a< } И циклический сдвиг вправо на s бит следующим образом: int rotr(int a, int s) { return (a>>s) | (a<< sizeof(a)-s); } Пара инструкций add/sub Пара сложение/ вычитание так же является избыточной, так как эти команды выражаются друг через друга. х + у = х - (-у) X - у = X + (-у) Набор инструкций конкретной виртуальной машины Прежде всего, все инструкции, входящие в виртуальную машину, берутся только с одним произвольным размером операндов. Затем, из классов инструкций, приведенных в разд.5.1., выбираем только по одному функционально-полному набору. Таким образом, мы получаем набор инструкций, достаточный для того, чтобы сопоставить любой инструкции LLVM, участвующей в исходной программе, одну или несколько команд вычислительной машины. Затем, увеличиваем этот набор инструкций до двухсот произвольными инструкциями, чтобы набор инструкций виртуальной машины по их количеству был аналогичен набору инструкций ассемблера. Это поможет запутать злоумышленника, который захочет оценить состав команд виртуальной машины. 52 Таким образом, мы максимизируем функцию стоимости анализа (сложность расшифровки), а так же минимизируем функцию затрат (размер исходного исполняемого файла увеличивается не значительно) Повышение скрытности алгоритма с использованием теории скрытности За счет использования виртуализированного и исполняемого ПИОК кода возможно общее повышение скрытности алгоритма. Если рассматривать алгоритм обфускации в рамках теории скрытности то можно рассматривать полезные действия, совершаемые алгоритмом, как симптомы состояний [15] инструкций машинного кода, которые подвергаются обфускации. Таким образом при замене кода на обфусцированный происходит добавление новых симптомов, скрывающих целевые. Известно, что потенциальная энтропийная скрытность множества симптомов вычисляется В А по формуле S(Y) - -^PCyJlogj Р(у}), где Р(у}) = Р} = ^lP(xl)P(yJ /х,), определяется по У=1 ,=1 формуле полной вероятности, где значения P(yj /хг) = /)/, - условная вероятность симптома у} при состоянии объекта х,. В нашем случае симптомами является информация доступная непосредственно отладчику, а состояние - это изменение состояний определённых целевым алгоритмом. Очевидно, что увеличение состояний приводит к повышению неопределенности, но остается вопрос как это происходит и как это влияет на кривую снятия неопределённости при анализе в зависимости от параметров обфускации. В теории скрытности вводится понятие арсенальной скрытности при этом под арсеналом зачастую понимается весь возможный набор параметров, предназначенный для реализации алгоритма. Таким образом, в качестве арсенала выбирается число команд процессора, исполняющего обфусцированный код. Очевидно, что это число может быть весьма велико. Будем считать, что набор команд конкретной виртуальной машины х,, 1 = 1, А, выбирается из имеющегося арсенала с равными вероятностями pt = 1/А. При этом условии потенциальная арсенальная скрытность (А-скрытность) для виртуальной машины определяется выражением^ = - log 2 (1/^4) = log2 А, где А — общее число возможных команд виртуальной машины. Групповая же скрытность виртуальной машины тогда будет вычисляться из соотношения S(m) = A-log2 A-(A-m)-log2(A-m)—wlog2 m + — log2 , L J —— — , A - общее 2тт(л — m)m 53 число возможных команд виртуальной машины, а т - число команд конкретной виртуальной машины. Очевидно, что максимум этой функции достигается при т — Из этого можно сделать вывод, что желательно иметь максимально большое число разнообразных команд и оптимально использовать половину из них в конкретно выбранной виртуальной машине. К сожалению, с практической точки зрения данные теоретические соображения не являются разумными, так вступают в противоречие с имеющимися фактами: чем больше число команд для процессора - тем медленнее идет кодогенерация. Таким образом выбор неоправданно большой группы команд т, для конкретной виртуальной машины может привести к следующим негативным последствиям: Медленной кодогенерации кода виртуальной машины Раскрытию всего арсенала команд при исследовании защищенного кода. Зачастую отсутствуют временные рамки на исследование защищенного кода, поэтому наш арсенал (общий набор команд виртуальной машины будет раскрыт тем раньше, чем большее число команд используется в группе. Таким образом мы можем прийти к следующим выводам: Необходимо создавать генераторы виртуальных машин с максимально большим числом команд. Для наилучшей защиты одной виртуальной машины, число команд должно выбираться равным половине общего числа команд. В случае, если при помощи одного набора команд защищается множество алгоритмов, необходимо в каждом наборе использовать возможно меньшее число команд. Download 482 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling