Основы разработки антивирусного сканера

Сканнерами называют программы, которые проверяют файлы на предмет зараженности их известными программе вирусами.

Прочитав эту статью, я не гарантирую, того, что вы в тот же момент станете умнейшим вирусным аналитиком, эта область программирования достаточно необычна и тяжела для понимания. Сталкиваясь с ней (областью) «вплотную» в первый раз очень тяжело сразу «взять быка за рога». Но в этой статье я попытаюсь изложить основы, так что вполне возможно, то, что будет описано ниже вы, уже знали.

Прежде чем читать статью, необходимо удостовериться, что ваш уровень знаний ассемблера не ограничивается умением писать красивые интерфейсы и менюшки, в антивирусных программах это не главное. Конечно без удобного (дружелюбного) интерфейса ваша разработка не будет востребована. Но все же, необходимо иметь некоторые понятия о:
* Контрольные суммы участков данных, что это такое и примерный алгоритм расчета
* Вирусы и троянские кони в бинарных файлах (исполняемых файлах), а так же написанные на скриптовых языках (VBS, JavaScript)
* Методы работы с файлами (поиск, запись, чтение и тд)
2. Простейшие вирусы

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

Вирусы это очень сложные программы, их можно разделить на множество видов, но мы ограничимся всего двумя. Разделим вирусы на простейшие и файловые вирусы. Файловые вирусы это те, которые умеют заражать файлы различных форматов (загрузочные – PE, документы, файлы помощи и еще множество других), обычно эти вирусы написаны на языке ассемблера, и для их обнаружения необходимо очень хорошо знать структуру файлов, которые они поражают. Под понятием простейших вирусов я подразумеваю различных червей и сюда же можно приписать троянских коней.

Файловый вирус – вирус, который распространяется через зараженные файлы различных форматов, обычно исполняемых. Т.е. кто-то кому-то передал программу, один из исполняемых файлов которой был заражен вирусом.

Червь – вирус, который распространяется самостоятельно (не поражая какие либо файлы), обычно через глобальные сети, путем рассылки себя в письмах; авторами червей часто являются хакеры и для своего распространения черви используют различные дырки в операционных системах.

Троянские кони – программы, у которых отсутствуют функции самостоятельного распространения (т.е. они распространяются различными людьми специально), но обязательно присутствуют различные деструктивные функции.

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

Деструкция в троянских конях – это алгоритмы, которые могут совершать различные пакости, начиная от форматирования жесткого диска или перезаписи flashbios и заканчивая воровством «важных» файлов (паролей для доступа в интернет) с компьютера пользователя.

3. Методы детектирования

Главное, что черви и троянские кони не умеют заражать другие файлы, по этому всегда распространяются в одном и том же виде. Т.е. в виде не изменяющегося файла. Допустим, у нас имеется файл с вирусом-червем, который занимает 10 килобайт. Червь распространяется в виде исполняемого файла PortableExecutable. Нам необходимо написать программу антивирус против этого червя.
* Программа будет искать PE-файлы в указанном каталоге
* Каждый найденный файл размером 10 килобайт и больше будет открываться
* Первые 10кб будут считываться, и сверяться с теми, которые были взяты из «тела» вируса
* Если содержимое будет совпадать, то значит перед нами червь и нужно его вылечить
Мы составили примитивный алгоритм детектирования вируса червя. Теперь допустим, таким способом ваша программа опознает, и лечит 100 вирусов. В качестве сигнатуры (данных, по которым определяется зараженность объекта тем или иным вирусом) используется полный вирусный код, допустим для каждого вируса по 10 кб. В результате вирусная база (база данных программы содержащая алгоритмы по детектированию и лечению вирусов) программы будет занимать 1 мегабайт, а это очень много. Крупнейшие антивирусные программы детектируют несколько десятков тысяч самых разнообразных вирусов, и их вирусные базы занимают всего несколько мегабайт.

Детектирование (обнаружение) вирусов, не изменяющих своей структуры, является примитивнейшим занятием. И так сигнатура для детектирования вирусов может занимать всего 3 двойных слова, т.е. 12 байт и быть очень надежной, если использовать контрольные суммы …

4. Контрольные суммы и технология их расчета

Контрольная сумма это 32 битное число (очень редко 16 битное), которое характеризует определенный участок кода. Есть множество способов подсчета контрольной суммы, для лучшего восприятия этого термина рассмотрим пример примитивнейшего подсчета:

Например, у нас есть участок кода, состоящий из 5 байт (десятичная система): 001 004 000 005 100

По нашему примитивному подсчету, контрольная сумма его будет равняться 1+4+0+5+100=110. Т.е. прочитав контрольную сумму другого участка, мы получим другое значение. Однако, используя столь примитивный алгоритм расчета, контрольные суммы совершенно отличающихся участков могут совпадать, для этого используются более продвинутые процедуры подсчета.
-----------------------
; подсчет контрольной суммы участка кода “sbuf”, длины “dlen”
; после подсчетов контрольная сумма будет
«положена» в “crc_buf”
calculate_crc
proc crc_buf: dword, sbuf:
dword, dlen: dword
push eax ecx edx ebx esi edi
cld
mov esi,sbuf
mov edi,dlen
mov ecx,-1
mov edx,ecx

next_byte:
sub eax,eax
sub ebx,ebx
lodsb
xor al,cl
mov cl,ch
mov ch,dl
mov dl,dh
mov dh,8

next_bit:
shr ebx,1
rcr eax,1
jnc no_carry
xor eax,8320h
xor ebx,0edb8h

no_carry:
dec dh
jnz next_bit
xor ecx,eax
sub edx,ebx
dec edi
jnz next_byte
not edx
not ecx
mov eax,edx
ror eax,cl
add eax,ecx
mov edi,crc_buf
mov word ptr [edi],dx
mov word ptr [edi+2],cx
pop edi esi ebx edx ecx eax
ret

endp


Комментарии к алгоритму расчета контрольной суммы (crc) отсутствуют потому, что достаточно понимать смысл подсчета crc, стандарта подсчета не существует, а описывать операции, производимые в этой процедуре достаточно тяжело и бессмысленно. Со временем будет появляться опыт в подобных вещах и если будет необходимо, то вы и сами разберетесь в коде.

5. Использование контрольных сумм для детектирования вирусов

Если необходимо подсчитать контрольную сумму участка в несколько килобайт, то это конечно не мгновенная процедура. Если считать контрольную сумму каждого найденного файла то процесс проверки не будет проходить так быстро как хотелось бы.

Возьмем в качестве примера вирус BAT.Sys.602, распространяющийся в виде файла BAT, написанного на примитивном языке Batch, входящим в комплект операционной системы DOS. Внешне вирус-червь представляет собой обычный текст.

Для опознавания наличия этого вируса в BAT-файлах совсем не обязательно считать контрольную сумму всего вирусного кода, достаточно взять участок кода, состоящий из нескольких строк. Так же просто необходимо запомнить их расположение в вирусном файле и длину этих строк (всех вместе). Допустим, нам приглянулись строки 4 и 5.

Как мы видим, строка 4 начинается в файле со смещения 75 (4Bhex) и заканчивается 150 (96 hex). Т.е. размер двух строк составляет 75 байт.

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

Вашему вниманию предлагается пример программы, которая считает контрольную сумму участка кода выбранного выше (смещение 75, длина 75 байт) в файле ‘sys.bat’ …
; компилировать: tasm32 –ml getcrc32.asm
; tlink32 -Tpe -c -x getcrc32.obj,,, import32
;
.386P
.model flat, stdcall
extrn
extrn
extrn
extrn
extrn
extrn
include

FILE_BEGIN
OPEN_EXISTING
GENERIC_READ
ExitProcess:near
ReadFile:near
CreateFileA:near
CloseHandle:near
GetFileSize:near
SetFilePointer:near
crc_proc.inc

equ 0
equ 3
equ 80000000h
; список API использующихся программой
; здесь находится вышеуказанная процедура
; подсчета контрольной суммы
; для перевода указателя
; открыть файл уже существующий
; чтение данных из файла
ENTRY_SIZE
equ 1+260+4+318
; размер одной ячейки для процесса поиска
.data
; сегмент данных
number
handle
crc32_buf
crc32_code_loc
crc32_code_len
file_name
buffer
dd ?
dd ?
dd ?
dd 75
dd 75
db ‘sys.bat’,0
db 1000 dup (?)

; файловый номер
; для хранения посчитанной crc участка кода
; местоположение участка кода в файле
; длина участка кода
; файл с которым будем работать
; буфер для хранения участка кода
.code
; сегмент кода
start:
push 0 0
push OPEN_EXISTING
push 0 0
push GENERIC_READ
push offset file_name
call CreateFileA
cmp eax,-1
jnz read_file
; откроем существующий файл ‘sys.bat’
; для чтения

; если все прошло успешно, продолжим
error_opening:

--------------------------------------------
jmp exit
; «обработчик» ошибки открытия файла
read_file:
mov handle,eax
push 0 eax
call GetFileSize
mov ecx,dword ptr [crc32_code_loc]
add ecx,dword ptr [crc32_code_len]
cmp ecx,eax
jle set_pointer
push handle
call CloseHandle
jmp exit
; сохраним файловый номер в “handle”
; eax – размер открытого файла в байтах
; ecx – расположение участка в файле
; ecx – смещение на конец участка
; если смещение на конец участка меньше
; чем размер файла, значит файл подходит
; иначе не тот файл
; закроем файл
; выйдем в ОС
set_pointer:
push FILE_BEGIN
push 0
push crc32_code_loc
push handle
call SetFilePointer




тут! Только для вас: кожгалантерея сумки или сумки 2008 с доставкой. Только россия.; отели в подмосковье, пансионаты; внутриканальные слуховые аппараты аудиограмма; Плазменный телевизор купить в Киеве