Энциклопедия компьютерных вирусов

         

Код расшифровщика


Вирус использует довольно простой алгоритм за/расшифровки своего тела: очередное слов вируса XORится с ключем, после чего тот сдвигается вправо/влево на 1 такт.

Однако вызов подпрограммы расшифровки и сам ее код выглядят значительно сложнее. В целом этот код можно разделить на 3 блока: PUSH-блок, блок загрузки регистров и блок расшифровки.

PUSH-блок заталкивает 7 регистров в стек: PUSH AX,BX,CX,DX,DI,DS,ES. Однако эти команды (7 байт кода) равномерно и в случайном порядке разбросаны среди 'пустых' команд типа NOP, CLC, STD и т.д. - итого 14 байт кода - длина PUSH-блока. Особенностью вируса является также то, что после расшифровки он соответственно порядку в PUSH-блоке корректирует команды POP regs, которые расположены внутри расшифрованного кода.

Функция блока загрузки регистров заключается в том, что регистр SI принимает значение базы вируса, а регистры ES и DS принимают значение регистра CS. Эти коды также не являются постоянными и выбираются из нескольких вариантов (в одном из них - ошибка, но об этом позже).

Блок расшифровки также не является постоянным. В качестве регистра-ключа случайным образом выбирается один из регистров DX или BX. Коды команд расшифровки могут быть переставлены между собой.

Итого всего различных вариантов расшифровщика (не считая количество возможных ключей) - около

15 2.3x10 .



Содержание раздела