Информационная безопасность


Обфускация данных - часть 3


B | b1 | b2 ---------------- false | 0 | 0 true | 0 | 1 true | 1 | 0 false | 1 | 1

Тогда такой фрагмент кода (написан на С++):

bool B ; B = false ; if (B) {...}

будет представлен так:

short b1, b2 ; b1 = b2 = 1 ; // или b1 = b2 = 0 if (!(b1 & b2)) {...}

  • изменение представления (или кодирование). Например, целочисленную переменную "i", в ниже представленном фрагменте кода (написанном на С):

    ... int i = 1; ... while (i < 1000) { ... A[i] ... i++ ; }

    можно заменить, выражением "i` = c1*i + c2" где "c1,c2" являются константами, в результате, фрагмент выше приведенного кода измениться и будет сложен для восприятия:

    ... int i = 11; int c1 = 8, c2 = 3 ; ... while (i < 8003) { ... A[(i - 3)/8] ... i += 8 ; }

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

    • объединение переменных. Две или более переменных "v1,...,vk" могут быть объединены в одну переменную "V", если их общий размер ("v1,...,vk") не превышает размер переменной "V". Например, рассмотрим простой пример объединения двух коротких целочисленных переменных "X","Y" (размером 16 бит) в одну целочисленную переменную "Z" (размером 32 бита). Для этого воспользуемся формулой Z(X,Y) = 2^16 * Y + X

      которая позволит, пренебрегая сложением, определять значение Y, т.е. пусть X = = 12, Y = 4 => Z = 65536 * 4 + 12 = 262156, теперь зная "Z" для нахождения "Y" можно 262156 / 65536 = 4.000183105 или приблизительно 4. При осуществлении арифметических операций над значениями переменных "X", "Y" хранящихся в "Z" нужно учитывать выше приведенную формулу, т.е.: Z(X+n,Y) = 2^16 * Y + (X + n) = Z(X,Y) + n ; Z(X,Y-n) = 2^16 * (Y - n) + X = 2^16 * Y - 2^16 * n + X = = Z(X,Y) - 2^16 * n ; и т.д.


      - Начало -  - Назад -  - Вперед -