Как проверить .exe-файл на наличие известных вредоносных строк в ресурсе

Ситуация знакомая: скачал программу, хочется запустить, но внутри что-то не даёт покоя. Антивирус может молчать, а файл выглядит подозрительно. Или вы разработчик и хотите убедиться, что ваш бинарник не содержит случайно встроенных вредоносных паттернов. В любом случае, задача конкретная — найти в .exe-файле строки, которые совпадают с известными вредоносными сигнатурами, и принять решение. Расскажу, как это сделать на практике, без теоретических экскурсов.

Что такое «вредоносные строки в ресурсе» и почему это важно

Вредоносные строки — это фрагменты текста или бинарные последовательности, которые встречаются в малвари: URL-адреса командных центров, хэши паролей, имена системных функций, используемых для инъекций, сигнатуры конкретных семейств малвари. Они могут быть спрятаны в секциях ресурсов .exe-файла — в строковых таблицах, диалогах, иконках, манифестах.

Простой антивирус ищет по хэшам всего файла и поведенческим признакам. Но если вы хотите целенаправленно проверить конкретный .exe на наличие определённых паттернов — например, после анализа другого файла вы получили список индикаторов компрометации (IOC) и хотите применить их к новому файлу — тут нужен другой подход.

Где именно в .exe прячутся строки

PE-файл (Portable Executable — формат .exe в Windows) состоит из заголовков и секций. Строки могут находиться в нескольких местах:

  • .rdata — секция только для чтения, здесь хранятся строковые константы, имена DLL, сообщения об ошибках.
  • .rsrc — секция ресурсов: строки в таблицах (String Tables), данные диалогов, манифесты, встроенные файлы.
  • .data — изменяемые данные, иногда строки попадают сюда.
  • Overlay — данные, приписанные после формального конца файла.

Для поиска вредоносных строк вас в первую очередь интересуют .rdata и .rsrc, потому что именно там малварь чаще всего хранит URL, команды, пути к файлам и прочие текстовые артефакты.

Способ 1: Утилита strings (Sysinternals / GNU Binutils)

Самый быстрый и доступный способ — извлечь все печатные строки из файла и отфильтровать их. Утилита strings делает именно это: проходит по бинарнику и вытаскивает последовательности печатных символов длиннее заданного порога.

Вариант А: Sysinternals Strings

Скачайте Strings от Sysinternals. Работает из командной строки:

strings.exe -n 8 suspicious_file.exe > output.txt

Флаг -n 8 означает минимальную длину строки — 8 символов. Это отсекает мусор. Результат сохраняется в текстовый файл, который уже можно искать вручную или автоматически.

Вариант Б: GNU strings (Linux / WSL)

Если вы работаете в Linux или используете WSL:

strings -n 8 suspicious_file.exe > output.txt

# Только из определённой секции:
strings -n 8 -t x suspicious_file.exe | grep rdata

Дальше — ищем по вашим сигнатурам:

grep -i -f signatures.txt output.txt

Где signatures.txt — файл с вашими индикаторами: по одной строке на каждую сигнатуру.

Способ 2: Поиск по ресурсам напрямую — Resource Hacker и CFF Explorer

Если вам нужен именно ресурсный раздел, а не весь файл, лучше использовать инструменты для разбора PE-структуры.

Resource Hacker

Бесплатная утилита Resource Hacker (angusj.net/resourcehacker). Открывает .exe, показывает дерево ресурсов: строковые таблицы, диалоги, битмапы, манифесты. Вы можете вручную просмотреть каждую таблицу и увидеть все строки.

Порядок действий:

  1. Откройте файл в Resource Hacker.
  2. Разверните узел String Table.
  3. Просмотрите содержимое каждой таблицы — строки видны сразу.
  4. Сравните с вашим списком вредоносных сигнатур.

CFF Explorer

Более мощный инструмент для анализа PE-файлов. Показывает структуру секций, ресурсов, импорта. Полезен, если нужно понять, в какой именно секции находится подозрительная строка и как она туда попала.

  1. Откройте файл в CFF Explorer.
  2. Перейдите в раздел Resource Editor.
  3. Просмотрите строковые ресурсы.
  4. Для глубокого анализа — смотрите Section Headers, чтобы понять смещения.

Способ 3: Автоматизированный поиск по базе сигнатур

Когда файлов много или сигнатур больше десятка, ручной просмотр не работает. Нужна автоматизация.

Скрипт на Python

Простой скрипт, который извлекает строки из .exe и ищет совпадения по вашей базе:

import re
import sys

def extract_strings(filepath, min_length=6):
    with open(filepath, 'rb') as f:
        data = f.read()
    
    # ASCII строки
    ascii_pattern = rb'[\x20-\x7e]{' + str(min_length).encode() + rb',}'
    ascii_strings = re.findall(ascii_pattern, data)
    
    # UTF-16LE строки (стандарт для Windows)
    utf16_pattern = rb'(?:[\x20-\x7e]\x00){' + str(min_length).encode() + rb',}'
    utf16_strings = re.findall(utf16_pattern, data)
    
    result = []
    for s in ascii_strings:
        result.append(s.decode('ascii'))
    for s in utf16_strings:
        result.append(s.decode('utf-16-le', errors='ignore'))
    
    return result

def search_signatures(strings, sig_file):
    with open(sig_file, 'r', encoding='utf-8') as f:
        signatures = [line.strip() for line in f if line.strip()]
    
    matches = []
    for s in strings:
        for sig in signatures:
            if sig.lower() in s.lower():
                matches.append((sig, s))
    
    return matches

if __name__ == '__main__':
    strings_found = extract_strings(sys.argv[1])
    matches = search_signatures(strings_found, sys.argv[2])
    
    for sig, found in matches:
        print(f'[{sig}] => {found}')

Использование:

python check_exe.py suspicious_file.exe signatures.txt

Скрипт простой, но рабочий. Если нужно обрабатывать сотни файлов — оберните в цикл по директории.

YARA — промышленный стандарт

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

Пример правила:

rule Suspicious_URL_In_Resources {
    meta:
        description = "Ищем подозрительный URL в ресурсе"
        author = "analyst"
    
    strings:
        $url = "http://evil-c2-server.com/panel" ascii wide
        $cmd = "cmd.exe /c" ascii wide nocase
        $reg = "CurrentVersion\\Run" ascii wide
    
    condition:
        url or (cmd and $reg)
}

Ключевое слово wide означает поиск в UTF-16LE (стандарт для Windows-ресурсов), ascii — в ANSI. Без флага wide вы пропустите большинство строк в ресурсах .exe-файла Windows.

Запуск:

yara64.exe suspicious_rule.yar target_file.exe

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

Сравнение инструментов

Инструмент Сложность Что находит Когда использовать
strings (Sysinternals / GNU) Низкая Все печатные строки по всему файлу Быстрая первичная проверка, один-два файла
Resource Hacker Низкая Строки только в ресурсных секциях Нужно посмотреть именно ресурсы визуально
CFF Explorer Средняя Полная структура PE, включая ресурсы Глубокий анализ, нужно понимать контекст строки
Python-скрипт Средняя Любые строки, с кастомной фильтрацией Нужна автоматизация под свои условия
YARA Высокая Сигнатуры с условиями, логикой, контекстом Регулярная проверка, много файлов, промышленный подход

Что делать в зависимости от вашей ситуации

Ситуация 1: Один файл, нужно быстро проверить

Запустите strings, сохраните вывод, откройте в текстовом редакторе и ищите по ключевым словам. Если знаете конкретный URL или команду — просто Ctrl+F. Пяти минут достаточно.

Ситуация 2: Нужно проверить ресурсы конкретно

Откройте файл в Resource Hacker. Строковые таблицы — это именно то, что вам нужно. Просмотрите вручную или экспортируйте и обработайте скриптом.

Ситуация 3: Регулярная проверка файлов на рабочем месте

Напишите YARA-правила под ваши индикаторы компрометации и запускайте по расписанию. Или используйте Python-скрипт, который обходит папку и проверяет каждый .exe по вашей базе сигнатур.

Ситуация 4: Вы получили IOC от аналитиков и нужно применить

Возьмите список IOC (URL, домены, хэши строк), оформите в виде YARA-правила или текстового файла для grep. Проверьте все подозрительные файлы в системе. Если нашли — изолируйте машину и вызывайте инцидент-响应 команду.

Частые ошибки при проверке

  • Поиск только в ASCII. В Windows большинство строк в ресурсах хранятся в UTF-16LE. Если вы ищете только в ASCII, пропустите половину находок. Всегда добавляйте поиск в wide (YARA) или декодируйте UTF-16 (скрипты).
  • Слишком короткий порог длины. strings -n 3 выдаст тысячи бессмысленных обрывков. Ставьте минимум 6–8 символов.
  • Проверка только секции .rsrc. Малварь может прятать строки в .rdata или даже в оверлее. Проверяйте весь файл.
  • Одна сигнатура — приговор. Найденная строка ещё не значит, что файл вредоносный. Например, cmd.exe /c используется и легитимными программами. Смотрите на контекст: что ещё есть в файле, куда ведёт URL, какие функции импортируются.
  • Игнорирование ложносрабатываний антивируса. Если антивирус не ругается, это не значит, что файл чист. Сигнатурный антивирус может не знать о новой малвари. Ручная проверка по ресурсам — дополнение, а не замена.

Как лучше организовать проверку

Если вы системно подходите к задаче, вот что рекомендую:

  1. Соберите базу сигнатур. Источники: отчёты по малвари (VirusTotal, Any.Run, публичные IOC-фиды), ваши собственные находки. Храните в текстовом файле или YARA-правилах.
  2. Автоматизируйте извлечение строк. Скрипт на Python или YARA — на ваш выбор. Главное, чтобы процесс был воспроизводимым и быстрым.
  3. Фильтруйте результаты. Не каждое совпадение — инцидент. Настройте белые списки для известных ложносрабатываний.
  4. Документируйте. Если нашли совпадение — запишите, какая строка, в какой секции, с каким смещением. Это пригодится при эскалации.
  5. Проверяйте в контексте. Строка в ресурсе + подозрительный импорт + сетевой трафик = картина инцидента. Одна строка — просто данные.

Итог

Проверка .exe на вредоносные строки в ресурсе — это не магия, а рутинная задача разбора PE-структуры и поиска совпадений. Начните с strings для быстрого обзора, используйте Resource Hacker для визуального осмотра ресурсов, и если задача повторяется — переходите на YARA или собственные скрипты. Главное правило: всегда ищите и в ASCII, и в UTF-16LE, и всегда смотрите на контекст находки, а не на одно совпадение.

Если нашли подозрительное совпадение — не спешите удалять файл. Сначала изолируйте его (переместите в защищённую папку или на машину без сети), задокументируйте находку и только потом принимайте решение об удалении или дальнейшем анализе.

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