![]() |
«Что нам стоит антивирь построить?!» (2 часть)
Сканируем файл
В этой части статьи мы коснемся, пожалуй, самого сложного, но в тоже время интересного момента создания «домашнего» антивируса. Мы займемся написанием процедуры, которая как раз и будет отличать обычный файл от вируса. Но не спешите открывать Delphi, как всегда придется сначала почитать теорию – а что делать без теории никуда:). Для начала нашей процедуре нужно передать имя файла (разумеется, не только имя, но и полный путь до него), которой мы будем проверять на «вшивость». Затем рассчитаем его контрольную сумму. Открываем базу, в которой хранятся сигнатуры вирусов, и начинаем сравнивать с полученной. Если не равны, то переходим к следующей и.т.д. до тех пор, пока все сигнатуры не кончатся. Если ни одна сигнатура не подошла, значит, файл чист, можем переходить к другому (если речь идет о проверки всего HDD). Если же контрольные суммы сошлись, то считываем номер строки сошедшейся сигнатуры, переходим на такою же строку только уже в базе с именами. Считываем ее значение. И, наконец, выдаем пользователю мессагу, что найден вирус – такой то, файл - такой-то. Удалить или нет? (ну, разумеется, всю информацию забиваем в отчет). С первого взгляда все нет так уж просто, как я обещал. Но не так страшен черт, как его малюют. Свидетельством этого является код, приведенный ниже: Код:
procedure CheckFile(FileCrc: string);Теперь то вы должны понять, почему в качестве базы использовались текстовики. Но как я уже ранее говорил, вы можете использовать абсолютно любой формат базы, можете использовать мой, можете придумать свой формат, главное чтобы вам с ним было удобно работать! [Примечание] 1)Переменная canceled(глобальная) была введена, для того чтобы можно было прервать процесс сканирования. Это необходимо в том случае если программа «зависнет» на проверки файла. Если честно, у меня такой ситуации пока еще не возникало, но подстраховаться не мешает. 2) Удаление вируса производилось за счет стандартной функции окошек DeleteFile. Разумеется, если файл занят, то ничего удалить у нас не получится. Да и вообще не стоит доверять Windows Поэтому я бы рекомендовал написать что-нибудь свое, способное удалить запущенное приложение (например, искать процесс с таким же именем как у вируса, а потом его закрывать и только после этого пытаться удалять) 3) Для красоты я выводил имя файла, которое сканируется в данный момент, поэтому, как ты уже мог заметить в самой процедуре путь до вируса мы узнаем через label3. Если вам это не нравится, вы можете создать глобальную переменную и работать уже с ней. 4) А вот две функции необходимые для работы нашей процедуры: Код:
function ApplicationPath: string; // определяем директорию программыКод:
function GrabLine(const baza: string; ALine: Integer): string;Глобальный поиск Для полного счастья нам осталось научить наш антивирус проверять весь компьютер на наличие заразы. Как всегда начнем с того, что нам нужно. Если вы хоть раз работали с FindFirst, то должны знать что она ищет файлы в строго заданном каталоге. Отсюда следует, что сначала нам необходимо получить все локальные диски, а потом подставлять их в процедуру поиска. Ну что, не буду тянуть и сразу предлагаю разобрать вот эту простенькую процедуру: Код:
procedure GetHDD;Код:
procedure ScanDir(Dir: string);Постскриптум Минусом данного сканера является отсутствие монитора, способного в реальном времени обнаружить и обезвредить вирус. В дальнейшем (если аудитория этого захочет) я постараюсь осветить и этот вопрос. А пока придется довольствоваться тем, что есть или не ждать моей статьи, а придумать все самому. Еще одним серьезным недостатком является то, что большинство вирусов в природе «обработаны» упаковщиками и разными крипторами. Если один и тот же вирус был упакован разными упаковщиками (мдя… масло масляное), то наш сканер обломается. Поэтому тем, кому захотелось устранить данный недостаток придется прочитать не один десяток крекерских статей, повествующих о таком сложном процессе как распаковка. [Не лирическое отступление] Хотелось бы сказать по поводу распаковки. Ясен пень, что у каждого пакера\криптрора\протектор а свой алгоритм сжатия\защиты. Поэтому, если мы хотим что бы наш антивирус мог действительно искать вирусы, то придется писать распаковщик каждому пакеру\криптрору\протектор у… Согласитесь работа не из приятных! А во-вторых нужно в своей базе иметь сигнатуры наших пакеров, если вирус будет упакован неизвестной «защитой», то наш антивирус опять же идет лесом(именно так работают все современные антивирусы - очень печально). И как же быть в таком случи? Ответ прост: Сделать универсальный распаковщик?(именно так я и поступил). Почему бы не использовать технологию крэкеров (всмысле не печенье, а людей, которые ломают софт). В общем суть такова: находим Оригинальную Точку Входа(кто не знает что это такое goto cracklab.ru ), снимаем дамп упакованной проги, правим его,- вот и все. Знающие люди скажут что еще надо восстановить таблицу импорта, но зачем нужен лишний геморрой? Мы просто будем сканировать дамп в районе точки входа, и отсутствие таблицы импорта нам не как не помещает. В этом процессе самое сложное – это найти оригинальную точку входа, в общем я не стал выпендриваться(придумыват велосипед) и взял плугин к одной известной крэкерской программе, которая собственно этим и занимается. А упакованность файла я проверял такой методикой как энтропия(опять же если не знаете что это такое goto cracklab.ru or wasm.ru). В итоге получился вполне путный распаковщик, который снимает почти все пакеры, и справляющийся с некоторыми протекторами. И опять же это тема отдельной статьи. И если тебя уважаемый читатель увлекла данная тема и ты хочешь увидеть продолжение статьи, то присылай все свои вопросы и пожелания мне на ящик. А мне остается только откланиться на этой позитивной ноте и пожелать вам удачи в этом нелегком труде… Исходники к статье http://sa-sec.org/sas_ub1.gif |
В целом не плохо для людей, которые задают вопрос - "Как работает антивирус"
Но есть масса но: "находим Оригинальную Точку Входа" - не так это и просто бывает... Для поиска точки входа зачастую придется отдать управление программе, то-есть все что будет будет до нее может содержать злонамеренный код и твой антивирус его не проверит, так как он берется за дело после получение OEP. ИМхо сейчас важнее не сигнатурный сканер а ХИПС(Эвристик+Проактивка+Д верительные политики). Сигнатурный поиск отмирает... ПС. 1) после нахождения OEP стоит еще раз проверить энтропию(и попытаться найти сигнатуру еще одного OEP) - файл может быть упакован несколько раз. 2)Базу сигнатру точек входа можно взять из файла userdb.txt (В комплекте с PeId) или из PeSniff 3) В сканере стоит прикрутить дизасемблер длин, и добавить фильтр мусорных инструкций (даже без крутого пакера имея исходный код, твой антивирус промолчит, если встретит вирусную сигнатуру разбавленную мусором) 4) Перехвати хотябы CreateProcess для реализации монитора... ПС2 - это не притензии - это рекомендации :-) Короче если тебе интересно доделать это до какого-то осмысленного конца - стучи в аську :-) |
собсно, афтор статья не я :) но я ему уже передал))
|
Наверное на построение уйма времени уходит!?
|
кто автор статьи?норм так написана
|
я ещё года 3 назад предлагал свой (античат) антивирус написать, но не актуально, есть прекрасные антивирусы.
Зачем велосипёд изобретать? против ТС не выступаю, но статья хороша только в теории изучения работы антивируса, применение её на практике, себя не оправдает. |
| Время: 03:06 |