![]() |
«Что нам стоит антивирь построить?!» (1 часть)
Такой штукой как антивирус сейчас никого не удивить. Каждый пользователь считает своим долгом иметь у себя на компьютере такую зверушку. И готов спорить пока вы читаете данные строки вашу систему постоянно мониторит какой-нибудь Касперский, а быть может Nod32… Но вы никогда не задумывались как работают программы такого рода ? И не появлялось ли желание собрать такую «штуку» самому? Если да, эта статья именно для вас. В ней я рассмотрел методику создания простейшего, повторяюсь простейшего антивирусного сканера(но вполне рабочего) способного обнаружить и уничтожить львиную долю вредоносного по.
Немного теории Не буду заниматься разного рода «болтологией» на тему что такое вирус, какие они бывают, и что случается, если они попадают на компьютер. Не маленькие, должны уже сами все это знать:) А если не знаете, то спросите Google или Yandex. Наш сканер будет искать вирусы, которые не умеют заражать другие файлы, а под эту категорию попадают: черви, трояны, логические бомбы, кейлогеры. Вы спросите почему? Дело в том, что для обнаружения файлового вируса, в первую очередь необходимо нехилое знание assembler’a, для того, что бы узнать алгоритм работы вредоносной программы. Как мы будем бороться с вирусом, если не знаем, как он устроен? Во-вторых, нужно знание структуры PE-файла. А это дело непростое, особенно на языках высокого уровня, таких как Delphi.(в нашем случаи мы обойдемся простым расчетом контрольной суммы) И, в-третьих, мы же являемся начинающими. Сразу попытаться взять «быка за рога» у нас не получиться. Я не хочу сказать, что это невозможно, просто надо всегда с чего-то начинать, а, как правило, начинают с простейшего. Теперь мы разобрались, какой антивирус будем делать, и пора бы перейти к самому главному – к алгоритму его работы. Как вы знаете у любого антивируса есть своя база, в которой он хранит сигнатуры известных ему вредоносных программ (по сути, это называется контрольной суммой). Так вот это и позволяет ему отличать вирус от обычной программы. Контрольная сумма (crc) – некое число (оно может быть 16-,32-,64-битным, да хоть 512-битным. Все зависит от фантазии разработчика), которое характерно для участка кода. То есть у каждого файла своя контрольная сумма. Не существует универсального способа подсчета crc, на самом деле их очень много, но мы рассмотрим те, которые подходят для наших целей. Наш антивирус умеет считать контрольные суммы. Что еще ему нужно? Правильно, ему нужны файлы crc которых он будет сверять с сигнатурами из базы. А чтобы найти файлы для сканера существуют очень удобные api функции, о которых ты наверно не раз слышал: FindFirst, FindNext, FindClose. Они позволят нам устроить глобальный поиск по всему жесткому диску. Останется только навешать разного рода украшений, таких как окошко, сигнализирующее о том, что мы нашли вирус, противный звук, предназначенный все для того же, статистику и отчет о сканировании, и «домашний» антивирус готов. От слов к делу: CRC В нашем случаи выбор алгоритма расчета контрольной суммы особой роли не сыграет. Если конечно мы не собираемся делать коммерческий продукт, ведь тогда придется разрабатывать свой вариант подсчета crc(мы же не хотим отваливать проценты автору алгоритма) Если все же нашлись желающие попробовать написать платный антивирус, то советую почитать «Элементарное руководство по CRC-алгоритмам обнаружения ошибок» автор:Ross N. Williams. Причем наш вариант должен быть очень надежным. Но т.к. в этой статье просто рассматриваются основные методики создания простейшего антивирусного сканера, то мы не будем изобретать велосипед и воспользуемся уже готовым разработками. К счастью таких в Интернете очень много. Следующая функция является простой и быстрой реализации контрольной суммы: Код:
function FastCheckSum(FileName: string): DWORD;Код:
function sampleCRC(filename: string): dword;Антивирусная база Антивирусная база – это сердце любого антивируса. Благодаря ней он спасает нас злых ][акеров которые так и норовят угнать наши пароли от аськи, мыла, . Я долго думал как же «прикрутить» к нашему антивирусу базу. Хранить сигнатуры и имена вирусов в самом Exe’шнике? Нет, это уж слишком примитивно! Надо что бы пользователь при желании мог ее обновить. В общем, немного подумав, я пришел к такому выводу, что проще всего все это дело хранить в текстовом файле.Да-да, именно в текстовом файле. И сейчас вы поймете почему. Идея состоит в следующем: у нас есть два текстовых файла – в одном хранятся сигнатуры, а в другом имена вирусов. http://sa-sec.org/im_cat/36/image001.jpg Файлы антивирусной базы. В vb.vdb хранятся сигнатуры, а в vn.vdb имена вирусов Несложно догадаться, по какому принципу они там расположены.(См. скриншот) Первой сигнатуре соответствует первое имя, второй второе и.т.д. Когда мы будем писать процедуру сканирования вы поймете, зачем я сделал такой выбор, а пока сделаем простенькую утилиту, при помощи которой будем добавлять новые вирусы в базу. Для начала кинем на форму два компонента Edit , два компонента Button, и один Open Dialog. В обработчике нажатия кнопки, которая будет добавлять сигнатуру в базу, напишем следующий код: Код:
procedure TForm1.AddToBaseClick(Sender: TObject);Код:
typeТеперь разберемся с OpenDialog. Кто знает для чего он нужен, могут пропустить этот абзац, а кто нет - читайте. Значит так, по нажатию второй кнопки должно вылезти диалоговое окно с выбором файла – зловредного вируса. Конечно, в Edit можно вводить вручную, но это так нудно. В обработчике нажатия кнопки наберите следующий код: Код:
procedure TForm1.Button2Click(Sender: TObject);Код:
procedure TForm1.FormCreate(Sender: TObject);http://sa-sec.org/sas_ub1.gif |
Упс, продублировалась. Моды иль адм - удалите, плз.
|
| Время: 04:40 |