Нейтрализация систем защиты от несанкционированного использования

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

0908:0140 CMP BYTE PTR [А76С],00

0908:0145 JNZ 014B

0908:0148 CALL OC50

0908:014B MOV AH, 18

Первая строка данного кода проверяет значение, содержащееся в ячейке памяти с адресом A76C. Если в памяти содержится значение 00, команда сравнения поставит флаг Z процессора в положение «включен», а если любое другое значение – в положение «выключен».

Во второй строке кода на основании результатов выполнения команды сравнения, команда условного перехода JNZ принимает решение, производить ли переход. Команда JNZ выполнит переход на четвертую строку кода, если флаг Z «выключен» Таким образом, вызов подпрограммы, которая выводит на экран предупреждения, в третьей строке будет обойден. Если же флаг Z «включен», переход не произойдет, и вызов будет выполнен.

Третья строка кода содержит вызов некоторой подпрограммы, который злоумышленник и собирается нейтрализовать.

Четвертая строка кода – некая следующая команда в программе.

Таким образом, задача злоумышленника состоит в том, чтобы обойти вызов подпрограммы в третьей строке. Для этого существует несколько способов. Например, можно заменить команду условного перехода JNZ 014В на команду безусловного перехода JMP 014В. В этом случае вызов третьей строки будет обойден независимо от того, что содержится в памяти по адресу, на который ссылается первая строка кода. В этом случае модификация кода подсистемы защиты сведется к модификации одного единственного байта.

Можно также внести такие изменения, чтобы заменить команду JNZ 014В на инверсную ей JZ 014В, т.е. переход будет сделан, когда в памяти содержится 00. Возможна замена CMP BYTE PTR [A76C],00 на команду JMP 014В. В последнем случае требуется дополнить команду JMP 014В командой NOP для выравнивания размера кода команды. Наконец, возможна замена вызова процедуры CALL OC50 в третьей строке на 3 команды NOP.

Вышеупомянутые методы обхода команды вызова подпрограммы достаточно просты, даже примитивны, поскольку они изменяют лишь конечный результат – не происходит нежелательных для злоумышленника действий со стороны блока ответной реакции, но ничего не делается для того, чтобы изменить саму ситуацию – убрать проверку системой защиты некоторого условия.