Защита информации в системах дистанционного обучения с монопольным доступомРефераты >> Программирование и компьютеры >> Защита информации в системах дистанционного обучения с монопольным доступом
DWORD AddRegAndConst[] = { EO_ADD, EOP_REG , 1, EOP_CONST, 0x12345 };
Для наглядной демонстрации, как происходит выполнение кода в виртуальной машине при шифровании/расшифровании данных, приведем отрывок из отладочного отчета. Каждое действие в отладочном режиме протоколируется в файле uniprot.log. Благодаря этому, было легко отлаживать механизм генерации полиморфных алгоритмов и саму работу алгоритмов. Дополнительным результатом создания механизма протоколирования стала возможность показать, как происходит выполнение алгоритма шифрования расшифрования. Ниже приведен отрывок из файла uniprot.log, относящийся к процессу шифрования данных. С целью сокращения объема текста, убраны дублирующийся вывод внутри цикла. Также при генерации этого алгоритма были выставлена вложенность шифрования равная единицы и почти убраны холостые блоки.
=== Start TranslateOperations ===
mov RAND ==> REG_2
xchg REG_2 VAR_16 <==> REG_2 VAR_16
mov CONST ==> VAR_11
dec VAR_11 ==> VAR_11
cmp VAR_11 CONST
jnz CONST
mov RAND ==> REG_6
xchg VAR_14 VAR_12 <==> VAR_14 VAR_12
mov CONST ==> VAR_15
add VAR_15 VAR_18 ==> VAR_15
mov RAND ==> REG_4
mov CONST ==> VAR_19
add VAR_19 VAR_9 ==> VAR_19
add REG_8 REG_7 ==> REG_8
xchg REG_2 VAR_13 <==> REG_2 VAR_13
Эта часть повторяется много раз:
mov RAND ==> REG_6
xor REF_VAR_11 VAR_14 ==> REF_VAR_11
mov RAND ==> REG_4
mov RAND ==> REG_9
xor REF_VAR_11 VAR_15 ==> REF_VAR_11
sub VAR_11 CONST ==> VAR_11
mov RAND ==> REG_7
dec VAR_14 ==> VAR_14
cmp VAR_14 CONST
jnz CONST
…………
mov RAND ==> REG_1
add REG_9 REG_6 ==> REG_9
test_time1 VAR_10
OK TIME (continue)
exit
3.2.3. Генератор полиморфного кода
3.2.3.1. Блочная структура полиморфного кода
Основу генератора полиморфного кода составляют таблицы выбора. Как уже было описано ранее, алгоритм шифрования и расшифрования состоит из восьми обязательных функциональных блоков. Каждый блок хоть и выполнит строго определенную функцию, но может быть реализован многими способами. Причем с использованием различных виртуальных регистров и виртуальных ячеек памяти. Возможные комбинации реализации блока описаны в специальных таблицах следующего вида, о которых будет сказано позднее.
//--------------------------------------------------------------
// Блок N5. (x1)
// Служит для организации цикла.
// ES_VARIABLE_0 – ячейка, которая может быть занята под счетчик.
// ES_REG_0 - регистр, который может быть занят под счетчик.
// ES_ADDRESS_0 - куда осуществить переход для повтора цикла.
BLOCK_START(05_00)
EO_DEC, EOP_VAR, ES_VARIABLE_0,
EO_CMP, EOP_VAR, ES_VARIABLE_0, EOP_CONST, 0,
EO_JNZ, EOP_CONST, ES_ADDRESS_0
BLOCK_END(05_00)
BLOCK_START(05_01)
EO_DEC, EOP_REG, ES_REG_0,
EO_CMP, EOP_REG, ES_REG_0, EOP_CONST, 0,
EO_JNZ, EOP_CONST, ES_ADDRESS_0
BLOCK_END(05_01)
BLOCKS_START(05)
BLOCK(05_00)
BLOCK(05_01)
BLOCKS_END(05)
BLOCKS_SIZE_START(05)
BLOCK_SIZE(05_00)
BLOCK_SIZE(05_01)
BLOCKS_SIZE_END(05)
//--------------------------------------------------------------
Под полиморфизмом понимается не только выбор и сочетание произвольного набора блоков, но и их расположение в памяти. Стоит отметить, что просто построение алгоритма из набора различных блоков достаточно сложная процедура. Так как необходимо учитывать использование виртуальных регистров и виртуальной памяти, используемых в разных блоках по разному. Например, использование определенного регистра в качестве счетчика во втором блоке автоматически приводит к учету этой особенности и назначению этого регистра во всех других блоках.
Как было сказано ранее, алгоритмы шифрования и расшифрования генерируются одним алгоритмом и функционально различаются только блоками преобразований данных. На этом их схожесть заканчивается. Коды алгоритма шифрования и расшифрования могут быть совершенно непохожи друг на друга и состоять из разного набора инструкций виртуальной машины.
Вернемся к распределению блоков в памяти. Помимо того, что каждый алгоритм состоит из произвольного набора функциональных блоков, эти блоки не имеют фиксированного места расположения. Скажем, что под весь алгоритм выделено 200 байт, а размер всех блоков в сумме составляет 100 байт. В результате положение этих блоков как бы "плавает" от одного сгенерированного алгоритма к другому. Должно выполняться лишь одно условие: соблюдение четкой последовательности расположения блоков. То есть, адрес расположения блока с большим номером не может быть меньше, чем адрес блока с меньшим номером. Для большей наглядности приведем рисунок 6.
Рисунок 6. Расположение функциональных блоков в памяти.
Белым цветом показаны все функциональные блоки. Серым цветом отмечены пустые места, которые будут заполнены произвольными холостыми блоками.
Может получиться, например, и такая картина распределения блоков, когда между некоторыми нет промежутка заполняемого холостыми блоками. Такая ситуация показана на рисунке 7.
Рисунок 7. Плотное расположение функциональных блоков в памяти.
Как функциональные блоки, так и холостые, могут иметь различную длину. После случайного расположения функциональных блоков происходит заполнение пустых пространств между ними холостыми блоками. Причем, существуют холостые блоки длиной 1, для того чтобы можно было заполнить пустые места в любом случае. Размер памяти, выделенный под создаваемый код алгоритма, выбирается произвольно. В данной версии он лежит в пределах от 160 до 200 байт. Это с запасом покрывает максимально необходимый размер памяти, необходимый для размещения 8 самых больших функциональных блоков из всех возможных, и оставляет место под холостые блоки. Более большой полиморфный код хоть и будет сложнее для анализа, но это может существенно замедлить процесс шифрования и расшифрования. По этому лучше всего придерживаться разумного баланса.
3.2.3.2. Алгоритм генерации полиморфного кода
Опишем теперь пошагово как работает генератор полиморфного кода.
1. На первом этапе выбираются характеристики будущих алгоритмов. К ним относятся: a) размер памяти, выделенной под код; б) в каких регистрах или ячейках будут располагаться указатели на модифицируемый код; г) сколько раз будут повторяться функциональные блоки 3 и 4; д) в каких регистрах или ячейках будут располагаться счетчики циклов; При этом количество повторений блоков 3 и 4 должно быть одинаковым и для алгоритма шифрования и для алгоритма расшифрования, так как каждой команде преобразования данных при шифровании должна быть сопоставлена обратная команда в алгоритме расшифрования.
2. Виртуальная память, используемая в алгоритме, заполняется случайными значения.