Теория и практика защиты программ


         

Далее мы точно определим, как


Далее мы точно определим, как осуществить доступ к виртуальной ячейке или к макету i. Отметим, что после шага 1 виртуальные ячейки от 1 до m (также как и макеты от m+1 до m+
) сортируются согласно их меток (т.е., t(·)). Таким образом, фактический доступ в перемешанную память на шаге 2 выполняется двоичным поиском необходимой метки. А именно, предположим, что мы хотим получить доступ к элементу iÎ{1,...,m+
}. Затем, вместо того, чтобы непосредственно достичь фактической ячейки p(i), как предлагается выше, мы выполняем двоичный поиск метки p(i). Этот двоичный поиск заканчивается на фактической ячейке p(i). Помимо этого другие фактические операции доступа, выполняемые во время поиска, полностью определены p(i). Таким образом, эти дополнительные фактические операции доступа не открывают никакой информации противнику.

Далее описываются две альтернативных реализации шага 3. Первый вариант - реверсия модели доступа на шаге 2. Второй вариант – полная сортировка фактической памяти (то есть, все m+2
 слов, включая память зщт) дважды, как описано в алгоритме. Первая сортировка выполняется в соответствии с ключом (v,s), где v - виртуальный адрес (¥ - для макетов) и sÎ{0,1} указывает, исходит ли это слово из памяти зщт

или из перемешанной памяти. Таким образом, сортируемый список имеет виртуальные адреса, появляющиеся так, чтобы некоторые из них появляются в двойном экземпляре один за другим (одна версия из памяти зщт, а другая из перемешанной памяти). Затем, мы сканируем этот список и для каждого виртуального адреса, появляющегося в дубликате, маркируется второе местонахождение (возникающее из перемешанной памяти) также как и макет (т.е., ¥). В заключение, мы снова полностью сортируем память, но на сей раз виртуальными адресами. Фактически, эта дополнительная сортировка не нужна, поскольку память будет подвергнута пересортировке когда-либо при следующем выполнении шага 1.

Далее следует детальное описание шага 2.

Содержание  Назад  Вперед