Пишем свой антивирус с нуля часть 2

Март 25, 2024, 15:03 - Время чтения: 2 минуты

Как и обещал в предыдущей статье - вот простейший сканер:

import os
import hashlib
from sqlalchemy import create_engine, Column, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

db_path = "file_hashes.db"

engine = create_engine(f"sqlite:///{db_path}")
Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()

class FileHash(Base):
    __tablename__ = "file_hashes"
    id = Column(String, primary_key=True)
    filename = Column(String)
    sha256 = Column(String)

Base.metadata.create_all(engine)

def calculate_sha256(file_path):
    hasher = hashlib.sha256()
    with open(file_path, "rb") as f:
        for chunk in iter(lambda: f.read(4096), b""):
            hasher.update(chunk)
    return hasher.hexdigest()

def add_file_to_db(file_path):
    filename = os.path.basename(file_path)
    sha256 = calculate_sha256(file_path)

    existing_hash = session.query(FileHash).filter_by(sha256=sha256).first()

    if existing_hash:
        print(f"Файл {file_path} уже существует в базе данных.")
        return
    file_hash = FileHash(id=sha256, filename=filename, sha256=sha256)
    session.add(file_hash)
    session.commit()
    print(f"Файл {file_path} успешно добавлен в базу данных.")

def scan_directory(directory):
    n = 0
    v = 0
    for root, dirs, files in os.walk(directory):
        for filename in files:
            file_path = os.path.join(root, filename)
            sha256 = calculate_sha256(file_path)

            existing_hash = session.query(FileHash).filter_by(sha256=sha256).first()
            n += 1
            if existing_hash:
                v += 1
                print(f"{file_path}: Вероятно вирус!")
    return n, v

if __name__ == "__main__":
    directory_to_scan = "/test/"
    n, v = scan_directory(directory_to_scan)

    print(f"Просканировано: {n} файлов")
    print(f"Найдено: {v} угроз")

Для теста написал неприятную программку которая сильно кушает процессорное время:

#include <stdlib.h>

int main() {
    for (;;) { fork(); free(malloc(4096)); }
    return -3;
}

Лучше не запускать её, но я скомпилировал и проверил :) Теперь нужно добавить в базу это недоразумение:

if __name__ == "__main__":
    directory_to_scan = "/test/"
    add_file_to_db('/test/a.out')
    n, v = scan_directory(directory_to_scan)

    print(f"Просканировано: {n} файлов")
    print(f"Найдено: {v} угроз")

Вот примерный вывод программы:

Файл /test/a.out успешно добавлен в базу данных.
/test/a.out: Вероятно вирус!
Просканировано: 4 файлов
Найдено: 1 угроз

В следующей статье будет более наглядный и правильный пример антивирусной программы


Пишем свой антивирус с нуля часть 1

Май 28, 2023, 10:05 - Время чтения: ~1 минут

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

Решить эту проблему помогают антивирусы - программы, способные защитить ваш компьютер от вредоносных программ. Однако, вместо того чтобы покупать готовый антивирус, можно попробовать написать свой собственный.

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

Вот основные типы вирусов:

Вирус

  • Это программа, которая может внедряться в другие исполняемые файлы. При запуске зараженного файла он выполняет свой вредоносный код.
  • Он также может распространяться по сети или через внешние носители, такие как флеш-накопители.

Червь

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

Троян

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

Кроме этого, есть и другие типы вредоносных программ, такие как spyware (шпионские программы), adware (рекламное ПО) и многие другие. Но наиболее распространенными являются вирусы, черви и трояны.

Давайте разработаем концепцию антивируса, который будет искать вирусы с использованием методов сигнатур и хэш-сумм.

Язык программирования

Мы будем использовать язык Python, так как он обладает простым синтаксисом и удобен для работы с файловой системой. Позже перепишем его на C.

Платформа

Наш антивирус будет работать на операционных системах Windows и Linux в основном.

Функциональность

Наш антивирус будет иметь следующие функции:

  • Сканирование файлов: мы будем искать вредоносные программы в файлах по определенным путям, используя два метода - сигнатуры и хэш-суммы.
  • Добавление новых сигнатур: если антивирус не может найти совпадение, то пользователь сможет добавить новую сигнатуру для поиска.
  • Обновление базы данных: мы будем регулярно обновлять базу данных сигнатур и хэш-сумм из централизованного хранилища.
  • Уведомление о найденной угрозе: после сканирования антивирус сообщит пользователю о найденных вредоносных программах.
  • Карантин: в случае обнаружения вируса, мы поместим инфицированный файл в карантин для дальнейшего анализа или удаления.

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

Мы будем использовать два метода для поиска вирусов:

  • Сигнатуры: мы будем искать совпадения сигнатур - уникальными последовательностями байтов, которые характеризуют конкретную вредоносную программу.
  • Хэш-суммы: мы будем вычислять хэш-суммы файлов и сравнивать их с хэш-суммами из базы данных. Если хэш-суммы совпадают, то файл может быть заражен вирусом.

Таким образом, наш антивирус будет отслеживать вредоносные программы, используя несколько методов, что повышает его эффективность.

В следующей статье напишем простейший сканер и протестируем на самописном вирусе.