Вирусы в BAT-файлах
Среди огромного количества файловых вирусов, заражающих выполнимые файлы в формате COM и EXE, существует несколько вирусов, способных заражать пакетные файлы. Для этого используется весьма изощренный способ. Мы рассмотрим его на примере вируса BAT.Batman. При заражении пакетного файла в его начало вставляется текст следующего вида:
@ECHO OFF
REM [...]
copy %0 b.com>nul
b.com
del b.com
rem [...]
В квадратных скобках [...] схематично показано расположение байт, которые являются ассемблерными инструкциями или данными вируса. Команда @ECHO OFF отключает вывод на экран названий выполняемых команд. Строка, начинающаяся с команды REM, является комментарием и никак не интерпретируется.
Команда copy %0 b.com>nul копирует зараженный командный файл в файл B.COM. Затем этот файл запускается и удаляется с диска командой del b.com.
Самое интересное, что выполнимый файл B.COM, созданный вирусом, до единого байта совпадает с зараженным командным файлом. Но командный файл состоит из команд операционной системы, а выполнимый COM-файл - из команд центрального процессора. Как же работает такая программа? Если переименовать любой текстовый файл в выполнимый, просто заменив его расширение на COM, он, конечно же, не будет работать. В лучшем случае компьютер просто зависнет.
Оказывается, что если интерпретировать первые две строки зараженного BAT-файла как программу, она будет состоять из команд центрального процессора, которые фактически ничего не делают.
Текст BAT-файла | Команды ассемблера | Описание команд | |||||||
@ECHO OFF | @ | 40h | INC AX | Увеличить на единицу значение регистра AX | |||||
E | 45h | INC BP | Увеличить на единицу значение регистра BP | ||||||
C | 43h | INC BX | Увеличить на единицу значение регистра BX | ||||||
H | 48h | DEC AX | Уменьшить на единицу значение регистра AX | ||||||
O | 4Fh | DEC DI | Уменьшить на единицу значение регистра DI | ||||||
20h | AND [BX+46],CL | Сравнить значение регистра CL со значением ячейки памяти | |||||||
O | 4Fh | ||||||||
F | 46h | ||||||||
F | 46h | INC SI | Увеличить на единицу значение регистра SI | ||||||
0Dh | OR AX,520A | Записать в регистр AX результат логической операции ИЛИ между текущим значением AX и 520Ah | |||||||
0Ah | |||||||||
REM | R | 52h | |||||||
E | 45h | INC BP | Увеличить на единицу значение регистра BP | ||||||
M | 4Dh | DEC BP | Уменьшить на единицу значение регистра BP | ||||||
20h | AND [SI],DH | Записать в регистр AX результат логической операции И между значением регистра DH и значением ячейки памяти | |||||||
34h |
Центральный процессор выполняет эти команды, а затем начинает выполнять настоящий код вируса, записанный после признака комментария REM. Получив управление, вирус перехватывает прерывания операционной системы и оставляет себя резидентным в оперативной памяти компьютера.
Резидентная часть вируса следит за записью данных в файлы. Если первая строка, записываемая в файл, содержит команду @echo, вирус считает, что записывается командный файл и заражает его.