Как проанализировать .exe-файл с помощью VirusTotal API и собрать метаданные

Как проанализировать .exe-файл с помощью VirusTotal API и собрать метаданные

Ты скачал файл — .exe, может быть, с форума, из письма или от коллеги. Он не запускается, или система ругается, или просто не доверяешь. Ты не хочешь запускать его на своём компьютере, но должен понять: это вредоносный код или просто старая программа с подозрительным поведением? VirusTotal API — твой инструмент, чтобы ответить на этот вопрос без риска.

Это не про «проверить на вирус» в браузере. Это про то, как автоматизировать анализ, собрать метаданные — кто создал, когда скомпилирован, какие библиотеки используются, какие домены вызываются — и сделать это системно, без кликов в интерфейсе. Ты не просто хочешь «зелёный» или «красный» результат. Ты хочешь понять почему он такой.

Что тебе нужно для начала

Ты не должен быть программистом, но должен уметь:

  • Запускать команды в терминале (Windows: PowerShell или CMD, macOS/Linux: Terminal);
  • Работать с JSON — хотя бы читать его;
  • Иметь API-ключ от VirusTotal (бесплатный, без регистрации платных тарифов).

API-ключ берёшь на virustotal.com — входишь в аккаунт, заходишь в «My API key», копируешь его. Бесплатный ключ даёт 500 запросов в сутки — этого хватит, чтобы проанализировать десятки файлов в день. Не делай массовый сканирующий бот — VirusTotal блокирует такие активности.

Шаг 1: Загрузи файл и получи ID анализа

Первое, что нужно сделать — отправить файл на анализ. VirusTotal не принимает файлы по URL, только через POST-запрос с содержимым файла.

Пример на Python (если ты не программист — не паникуй, я покажу, как сделать это в терминале без кода):

import requests

file_path = "your_file.exe"
api_key = "твой_ключ_здесь"

url = "https://www.virustotal.com/api/v3/files"
with open(file_path, "rb") as f:
    files = {"file": (file_path, f)}
    headers = {"x-apikey": api_key}
    response = requests.post(url, headers=headers, files=files)

analysis_id = response.json()["data"]["id"]
print("ID анализа:", analysis_id)

Если ты не хочешь писать код — используй curl в терминале:

curl -X POST "https://www.virustotal.com/api/v3/files" \
  -H "x-apikey: твой_ключ_здесь" \
  -F "file=@/путь/к/файлу.exe"

Ответ будет в формате JSON. Тебя интересует поле data.id. Это и есть ID анализа — уникальный идентификатор, по которому ты будешь запрашивать результаты. Не теряй его. Сохрани в текстовый файл.

Шаг 2: Жди, пока анализ завершится

Загрузка файла — это только начало. VirusTotal не анализирует мгновенно. Обычно 1–3 минуты. Иногда до 10, если очередь длинная.

Ты не можешь сразу запросить результаты — получишь ошибку «analysis in progress». Нужно ждать. Простой способ — сделать запрос каждые 20 секунд, пока статус не сменится на completed.

Запрос статуса:

curl -X GET "https://www.virustotal.com/api/v3/analyses/твой_анализ_id" \
  -H "x-apikey: твой_ключ_здесь"

Смотри в ответе на поле data.attributes.status. Пока там queued или running — жди. Как только появляется completed — переходи к следующему шагу.

Шаг 3: Собери метаданные из результата

Теперь ты получаешь полный отчёт. Он огромный — до 10–20 КБ. Но тебе нужны только ключевые поля. Вот что важно:

  • file_name — как файл назывался при загрузке. Иногда обрезается или искажается — проверяй, совпадает ли с ожидаемым именем.
  • type_description — что VirusTotal считает файлом: «PE32 executable», «DLL», «MSI» и т.д. Если ты ждал .exe, а тут «PDF», значит, файл подменён.
  • magic — магическое число в начале файла. Для PE-файлов — MZ. Если тут что-то другое — файл повреждён или подделан.
  • size — размер в байтах. Сравни с ожидаемым. Неожиданно маленький .exe (меньше 100 КБ) — подозрительно. Очень большой (больше 50 МБ) — возможно, вшитый установщик или майнер.
  • pe_info — если есть, это золотая жила. Тут:
    • compile_time — время компиляции. Часто совпадает с датой создания. Если файл «создан» в 2023, а дата компиляции — 2018 — подозрительно.
    • imported_dlls — какие DLL импортируются. kernel32.dll — нормально. advapi32.dll — нормально. А вот user32.dll с вызовом SetWindowsHookEx — тревожный признак. winhttp.dll + InternetConnect — возможный C2-контакт.
    • imphash — импорт-хеш. Если ты знаешь чистый файл, сравни хеши. Одинаковые импхеши — один и тот же бинарник, даже если переименован.
    • sections — количество и размер секций. Нормальный .exe — 2–5 секций. 10+ — подозрительно. Секции с именами вроде .mal, .pack, .crypt — явный признак упаковки.
  • times_submitted — сколько раз файл уже загружали. Если 50+ — значит, его уже разбирали. Читай комментарии других пользователей.
  • last_analysis_stats — сколько антивирусов сказали «вредоносный». Но не доверяй цифре 1/70 — если один антивирус (например, Kaspersky) выдал «Trojan», а остальные — «clean», это может быть ложное срабатывание. А вот 15/70 — уже серьёзно.
  • network — если есть поле contacted_ips или contacted_domains — это критично. Запомни их. Проверь через whois или Shodan. Домен вроде update-secure[.]xyz — почти всегда вредоносный.

Вот как выглядит пример полезных метаданных в JSON:

{
  "data": {
    "attributes": {
      "magic": "MZ",
      "size": 124928,
      "type_description": "PE32 executable (GUI) Intel 80386 Mono/.Net assembly",
      "compile_time": "2023-11-15T08:22:10Z",
      "imported_dlls": ["kernel32.dll", "user32.dll", "winhttp.dll"],
      "imphash": "e1e2a8c3d4f5b6a7c8d9e0f1a2b3c4d5",
      "sections": [
        { "name": ".text", "size": 81920 },
        { "name": ".rdata", "size": 16384 },
        { "name": ".data", "size": 12288 },
        { "name": ".rsrc", "size": 14336 }
      ],
      "contacted_domains": ["api-update[.]secure[.]xyz"],
      "contacted_ips": ["185.130.102.11"],
      "last_analysis_stats": {
        "harmless": 65,
        "malicious": 12,
        "suspicious": 1,
        "undetected": 2
      }
    }
  }
}

Запомни: импхеш и время компиляции — самые надёжные метаданные. Они не меняются при переименовании или упаковке. Даже если файл упакован в UPX, импхеш останется прежним — если не меняли код.

Что делать, если файл упакован?

Если ты видишь в отчёте много секций, странное имя секции или статистику: «12/70 антивирусов нашли вредоносный код» — скорее всего, файл упакован. Упаковка — не всегда зло. Иногда это просто способ уменьшить размер. Но вредоносные программы используют её, чтобы скрыть поведение от антивирусов.

Как понять, что это упаковка:

  • Слишком много секций (5+), особенно с именами вроде .UPX, .pack, .crypt;
  • Низкий импхеш — если ты знаешь чистый файл с тем же импхешем, но он не упакован — значит, здесь упаковка;
  • Маленький размер исходного файла, но большой размер после анализа — признак сжатия с распаковкой в памяти.

Если ты подозреваешь упаковку — ищи в отчёте поле unpacker. VirusTotal иногда определяет, какой упаковщик использовался: UPX, ASPack, Themida и т.д. Если там Themida — это почти всегда вредоносный код. Это платный упаковщик, который используют только серьёзные злоумышленники.

Сравнение: VirusTotal API vs веб-интерфейс

Зачем вообще использовать API, если можно просто залить файл на сайт?

Критерий Веб-интерфейс API
Автоматизация Нет — только вручную Да — можно сканировать сотни файлов в день
Получение метаданных Частично — нужно копировать вручную Полностью — можно парсить JSON
Сравнение нескольких файлов Невозможно Можно сравнивать импхеши, даты, IP-адреса
Интеграция с другими системами Нет Да — можно встроить в SIEM, скрипт мониторинга
Скорость Зависит от загрузки сайта Быстрее — прямой запрос без HTML-разбора
Ограничения 500 запросов/сутки То же — 500 запросов/сутки

Если ты анализируешь 1–2 файла в неделю — веб-интерфейс подойдёт. Если ты администратор, который получает десятки .exe-файлов в день от пользователей, или ты исследуешь вредоносное ПО — API не просто удобен, он необходим.

Частые ошибки

  1. Запрашиваешь результаты сразу после загрузки. Это самая распространённая ошибка. Ты ждёшь 2 секунды — и думаешь, что «анализ не работает». Нет, он ещё в очереди. Жди минимум 60 секунд.
  2. Доверяешь только цифре «X/70». Если 1 антивирус сказал «вредоносный», а остальные — «чисто», это может быть ложное срабатывание. Ищешь конкретные антивирусы, которые сработали. Например, если сработал Kaspersky, но не сработал Microsoft Defender — это может быть просто старая сигнатура. А если сработали Kaspersky, ESET, CrowdStrike — это уже тревожный сигнал.
  3. Игнорируешь импхеш. Ты думаешь, что если файл переименован — это новый файл. Нет. Импхеш — это хеш по импортируемым функциям. Он не меняется. Сравнивай его с базой известных угроз.
  4. Не проверяешь домены и IP. Файл может быть «чистым», но пытаться связаться с доменом вроде malware[.]xyz — это уже угроза. Проверяй их через whois или abuseipdb.com.
  5. Загружаешь один и тот же файл несколько раз. Это тратит твои лимиты. Сохраняй хеши (SHA-256) загруженных файлов — и проверяй, не был ли он уже проанализирован.

Как лучше сделать: практические рекомендации

  • Создай базу хешей. Сохраняй SHA-256 всех проанализированных файлов. Проверяй его перед загрузкой — если уже был, не загружай заново. Это сэкономит тебе 30–50% запросов.
  • Автоматизируй проверку доменов. После получения списка контактируемых доменов — отправляй их в whois через python-whois или curl whois.iana.org. Домены, зарегистрированные на 1 день — почти всегда вредоносные.
  • Сравнивай с известными угрозами. Используй базы вроде MalwareBazaar — там можно искать по импхешу. Если ты нашёл импхеш, который там есть — ты нашёл известный майнер или троян.
  • Создай простой скрипт-фильтр. Например: если last_analysis_stats.malicious > 5 и contacted_domains есть — отправляй уведомление. Если compile_time > 2023 и size < 50000 — помечай как подозрительный.
  • Не анализируй файлы с неизвестного источника в рабочей среде. Даже через API. Используй виртуальную машину или песочницу, если хочешь запустить файл после анализа.

Что выбрать в зависимости от ситуации

  • Ты — обычный пользователь, скачал файл с форума → Загрузи его на virustotal.com в браузере. Посмотри, сколько антивирусов сработало. Если 0–2 — можно осторожно запускать. Если 5+ — удали.
  • Ты — ИТ-специалист, получил .exe от клиента → Используй API. Собери метаданные: импхеш, время компиляции, импортируемые DLL. Проверь, не совпадает ли импхеш с известным вредоносным ПО. Если есть подозрительные домены — предупреди клиента.
  • Ты — аналитик угроз, обрабатываешь сотни файлов в день → Автоматизируй через API + базу хешей + скрипт фильтрации. Добавь в логи: дата, имя файла, импхеш, статус, IP/домены. Интегрируй с SIEM.
  • Ты подозреваешь, что файл упакован → Ищи sections и unpacker. Если Themida или VMProtect — почти наверняка вредоносный. Не запускай.

Что делать дальше

Ты теперь знаешь, как:

  • Загружать .exe-файл через VirusTotal API;
  • Ждать завершения анализа;
  • Извлекать метаданные — импхеш, время компиляции, DLL, домены;
  • Отличать ложные срабатывания от реальных угроз;
  • Автоматизировать процесс для работы с несколькими файлами.

Теперь — сделай это. Возьми один файл, который тебе кажется подозрительным. Загрузи его через curl. Подожди 2 минуты. Скачай JSON. Найди imphash. Скопируй его и вбей в поиск VirusTotal по импхешу. Посмотри, что там. Если ты увидишь хотя бы один известный троян — ты уже нашёл ответ.

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

Информация, представленная в этой статье, носит ознакомительный характер. Анализ файлов и принятие решений о их безопасности требует профессионального подхода. При работе с подозрительными файлами используй изолированные среды и консультируйся с кибербезопасностными специалистами.

Оцените статью
PEFile — Безопасность и технологии простым языком