Читайте также: |
|
В процессе «запутывания» программного обеспечения числовые константы (как целочисленные, так и вещественные) должны быть заменены вычисляющими их арифметико-логическими выражениями. Замене подлежат числовые константы, передаваемые в качестве операндов следующим инструкциям языка CIL:
- ldc.i4 – загрузка целых чисел типа int32;
- ldc.i8 – загрузка целых чисел типа int64;
- ldc.r4 – загрузка вещественных чисел типа float32;
- ldc.r8 – загрузка вещественных чисел типа float64.
Участвовать в арифметико-логических выражениях, вычисляющих числовые константы, будут инструкции языка CIL, разделённые на три типа:
1) инструкции для загрузки и сохранения значений;
Инструкции для загрузки и сохранения значений выполняют копирование значений на стек вычислений и сохранение значений со стека вычислений в память.
Кроме перечисленных выше, в спецификации CLI определена пара инструкций для чисто стековых манипуляций:
- dup – копирование значения на вершине стека;
- pop – удаление значения с вершины стека.
2) арифметические инструкции;
Бинарные арифметические операции потребляют со стека вычислений два операнда. Их действие можно записать как result:= value1 op value2.
Некоторые бинарные операции могут использоваться для операндов различных типов. Другими словами, в коде инструкции не содержится информации о типах ее операндов, так как эти типы определяются на этапе JIT-компиляции. При этом применение бинарной операции не допускается, если тип одного ее операнда – целый, а другого – с плавающей запятой.
К числу инструкций, выполняющих бинарные арифметические операции, относятся:
- add – сложение;
- sub – вычитание;
- mul – умножение;
- div – деление;
- div.un – деление беззнаковых целых чисел;
- rem – остаток от деления;
- rem.un – остаток от деления беззнаковых целых чисел;
- shl – сдвиг целых чисел влево;
- shr – сдвиг целых чисел со знаком вправо;
- shr.un – сдвиг целых чисел без знака вправо;
- and – побитовое И;
- or – побитовое ИЛИ;
- xor – побитовое Исключающее ИЛИ.
К числу инструкций, выполняющих унарные арифметические операции, относятся:
- neg – изменение знака числа;
- not – побитовое НЕ (для целых чисел).
3) инструкции для организации передачи управления.
Для начала рассмотрим инструкции, выполняющие сравнение значений своих операндов. Результатом сравнения являются числа 0 или 1 (типа int32). Число 0 обозначает ложь, а число 1 – истину.
К числу инструкций, выполняющих сравнение значений своих операндов, относятся:
- ceq – сравнение на равенство;
- cgt – сравнение на «больше»;
- clt – сравнение на «меньше»;
- cgt.un – сравнение на «больше» беззнаковых целых чисел или неупорядоченных чисел с плавающей запятой (два числа с плавающей запятой называются неупорядоченными, если хотя бы одно из них равно NaN);
- clt.un – сравнение на «меньше» беззнаковых целых чисел или неупорядоченных чисел с плавающей запятой.
Помимо рассмотренных методов к обфускации констант можно отнести сжатие метаданных, а также удаление их части из сборки (например, могут быть удалены объявления перечисляемых типов данных, если заменить места их использования в байт-коде фактическими значениями перечислений).
Кроме обфускации числовых констант, в процессе «запутывания» программного обеспечения строковые константы должны быть закодированы.
Алгоритм обфускации строк представлен далее на рисунке 5.
Рисунок 5 – Алгоритм обфускации строк
Дата добавления: 2015-09-10; просмотров: 103 | Поможем написать вашу работу | Нарушение авторских прав |