"С.П.Расторгуев, А.Е.Долгин "Как защитить информацию" (пособие по борьбе с хакерами)" - читать интересную книгу автора

Включение в алгоритм элементов случайности делает "внешность"
задачи непредсказуемой. Пример этого способа приведен на прилагаемой
дискете.

ИЗМЕНЕНИЕ КОДИРОВКИ
Более сложный способ - модификация кодов команд с изменением
характера выполняемых операций (рис. 5.1). Делается это так.
Написанный на ассемблере и уже отлаженный модуль транслируется в
объектный код с получением листинга. На листинге, не обращая внимания
на мнемонику, ищем участки с похожими закономерностями изменения
величин кодов команд (вот где пригодится опыт решения математических
задач, типа "найди закономерность", из популярных журналов). Затем
выделяем найденные участки в отдельную подпрограмму и, используя
подмеченную закономерность, составляем алгоритм ее преобразования в
коды первого участка, второго, третьего... Этот алгоритм встраиваем
вместо участков и по завершению преобразования подпрограммы - передаем
ей управление. Как правило, с первой попытки полной аналогии с изъятым
блоком не получается, поэтому нужно поманипулировать командами,
переставить их местами, может быть - добавить лишние (тем не менее не
нарушающими общего алгоритма), что-то заменить эквивалентной
последовательностью.

ПРОХОД "СВОИМ ХОДОМ" ПО ДАННЫМ
Несмотря на кажущуюся простоту, одновременное использование
некоторых байт как операторов и операндов является "высшим пилотажем"
в программировании. Способ пришел от программистов для 8-разрядных
процессоров типа Z80, К580 и др. Дело в том, что у них основные коды
однобайтовых пересылок и букв совпадают, к тому же у компьютеров с МП
Z80 маловато ОЗУ (приходится его экономить). Вот и используют участки
осмысленного текста - как для появляющихся на экране сообщений, так и
для загрузки нужных регистров. Разумеется, некоторые буквы оказываются
лишними при прогоне участка, как кода программы. Но, с другой стороны,
вслед за "сообщением" можно поставить несколько команд, корректирующих
результаты ненужных операций. Пример приведен в распечатке листинга
игры "Jetpac" фирмы "Ultimate" для компьютера "Spectrum-48" на рис.
5.2 (для МП Z80). По ходу космической игры в верхней части экрана
появляются надписи: "1UP" (результат 1 игрока), "HI" (лучший результат
за всю игру) и "2UP" (2 игрок). При анализе текста программы
выяснилось, что эти надписи образуют отдельную подпрограмму,
осуществляющую пересылки некоторого значения из ячейки ОЗУ (адрес
0D055h) в стек и из аккумулятора в эту же ячейку (то есть сложный
обмен значениями между регистром A, стеком и ОЗУ).
Впрочем, то что легко программируется для 8-разрядных
процессоров, вызывает определенные трудности на 16-разрядных: и
характер операций у "буквенных" кодов другой, и однобайтовых команд
мало (с двух - трехбайтовыми разбираться еще сложнее). Тем не менее,
после некоторой тренировки можно и этот способ взять на вооружение.

ЗАМЕНА БЛОКОВ
Традиционный подход при использовании ветвления заключается в