Cyber Security Academy · Урок

Поиск по строкам и шестнадцатеричным данным

Сопоставление артефактов вредоносного ПО

Урок 3 из 413 шагов

«Поиск по строкам и шестнадцатеричным данным» — бесплатный урок Cyber Security Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cyber Security Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cyber Security Academy содержит 4 уроков всего.

От образца к правилу

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

Рабочий процесс таков: проведите первичный анализ образца, извлеките строки и структурные признаки, отделите полезные признаки от шума, составьте правило rule, а затем проверьте его и на образцах семейства, и на чистой выборке перед развёртыванием.

Извлечение возможных строк

Начните с утилиты strings, чтобы вывести последовательности печатных символов, включая текст в ASCII и UTF-16 (широком формате). Вредоносные программы для Windows часто хранят строки в широком формате.

Просмотрите результат в поисках URL-адресов серверов управления, имён мьютексов, путей к реестру, нестандартных сообщений об ошибках, путей PDB и необычно конкретного текста. Игнорируйте типовые строки среды выполнения и компилятора.

strings -a sample.bin > ascii.txt
strings -e l sample.bin > wide.txt   # UTF-16LE
grep -iE 'http|mutex|\\\\pipe\\\\|\.pdb' ascii.txt wide.txt

Выбор устойчивых строк

Не каждая строка подходит для правила rule. Выбирайте артефакты, которые автору сложно изменить без значительных усилий:

  • Жёстко заданные имена мьютексов или каналов, уникальные для семейства
  • Нестандартные маркеры протокола или ключи конфигурации
  • Необычные отладочные сообщения или сообщения об аварийном завершении
  • Встроенные пути PDB, раскрывающие среду сборки

Избегайте шаблонного кода библиотек, распространённых имён программных интерфейсов и строк версий, общих для легитимных программ: они создают ложные срабатывания.

strings:
  $mutex = "Global\\Zx7yQ_lock" wide
  $cfgkey = "x0r_cfg_begin" ascii
  $pdb = "C:\\build\\loader\\release\\loader.pdb"

Обход простой обфускации

Многие семейства применяют XOR или иным образом слегка кодируют строки. Если открытых строк мало, ищите закодированный вид или процедуру декодирования.

Можно вычислить байты, полученные XOR-кодированием известного открытого текста, и искать их либо использовать модификатор xor YARA, чтобы автоматически сопоставлять строку с любым однобайтным ключом XOR.

strings:
  // matches "http://" under any single-byte XOR key
  $u = "http://" xor
  // or a fixed key range
  $k = "config" xor(0x01-0xff)

Поиск по шестнадцатеричным шаблонам

Если строки обфусцированы, а код — нет, ищите шаблоны байтов в собственной логике вредоносной программы: процедуру расшифровки, цикл распаковки или уникальную константу.

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

strings:
  // XOR decrypt loop with wildcarded counter/address
  $decrypt = { 8A ?? 34 ?? 88 ?? 4? 4? 75 ?? }

Практическое применение подстановок и переходов

Искусство поиска по шестнадцатеричным шаблонам заключается в выборе байтов для замены подстановками. Слишком жёсткий шаблон перестанет работать после повторной компиляции, а слишком свободный будет совпадать со всем подряд.

  • Заменяйте подстановками относительные смещения и непосредственные значения, которые меняются при компиляции
  • Оставляйте коды операций фиксированными, поскольку алгоритм стабилен
  • Используйте переходы [n-m], когда длина инструкций различается

Стремитесь сделать шаблон достаточно длинным для уникальности, обычно не менее 8 значимых байтов, но сохраняйте гибкость там, где это необходимо.

strings:
  $stub = { 55 8B EC 83 EC [1-4] E8 ?? ?? ?? ?? 33 C0 }

Структурные признаки и PE

Статические признаки, не ограничивающиеся необработанными байтами, позволяют задавать надёжные условия с небольшим числом ложных срабатываний. С помощью модуля pe можно искать:

  • imphash — хэш таблицы импорта, часто стабильный в разных сборках семейства
  • имена секций — нестандартные упаковщики добавляют характерные секции
  • определённые imports — VirtualAllocEx + WriteProcessMemory + CreateRemoteThread указывают на внедрение
import "pe"
condition:
  pe.imphash() == "4e3a9f..." or
  for any s in pe.sections : ( s.name == ".x0rsec" )

entropy как признак

Упакованные или зашифрованные области имеют высокую entropy. Модуль math измеряет её, позволяя отмечать образцы, секция полезной нагрузки которых выглядит зашифрованной, что характерно для упаковщиков.

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

import "math"
condition:
  math.entropy(0, filesize) >= 7.2 and $loader_stub

Объединение признаков

Самые надёжные правила требуют нескольких независимых признаков, чтобы одно случайное совпадение не вызывало срабатывание. Сочетайте строку, шаблон кода и структурный признак.

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

condition:
  uint16(0) == 0x5A4D and
  filesize < 800KB and
  $mutex and
  $decrypt and
  pe.imports("kernel32.dll", "CreateRemoteThread")

Именование, метаданные и версии

Поисковое правило rule полезно только тогда, когда другие специалисты могут ему доверять и поддерживать его. Дайте каждому правилу rule ясное имя с пространством имён и заполните meta.

  • Запишите хэши образцов, на основе которых создано правило
  • Укажите семейство, автора, дату и ссылку
  • Увеличивайте поле версии, когда уточняете логику

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

meta:
  family = "X0rLoader"
  author = "ir-team"
  date = "2026-06-04"
  hash = "9f1c...e2"
  version = "2"

Проверяйте перед тем, как доверять

Всегда проверяйте новое правило rule на двух выборках:

  • Истинно положительные срабатывания — каждый известный образец семейства должен совпадать
  • Легитимные программы — большая чистая выборка, включающая системные двоичные файлы и распространённые приложения, не должна давать совпадений и должна использовать NOT

Одно ложное срабатывание на DLL Windows может привести к изоляции критически важных файлов во всей инфраструктуре. Запустите проверку, подсчитайте результаты, изучите пропущенные и найденные образцы, а затем уточните правило перед широким развёртыванием.

yara -r family.yar /malware_corpus/   # expect all to hit
yara -r family.yar /clean_corpus/     # expect zero hits

Быстрая проверка

Выберите наиболее устойчивый признак.

Итоги

Практический поиск с помощью YARA от начала до конца:

  • Извлекайте строки в ASCII и широком формате; сохраняйте устойчивые артефакты — мьютексы, ключи конфигурации и пути PDB
  • Обходите лёгкую обфускацию с помощью модификатора исключающего ИЛИ или закодированных шаблонов
  • Ищите шаблоны байтов кода, например процедуры расшифровки или распаковки, когда строки скрыты
  • Заменяйте подстановками изменчивые байты, сохраняйте коды операций и используйте переходы для переменной длины
  • Используйте PE imphash, секции и imports, а также entropy как структурные признаки
  • Сочетайте несколько признаков, чтобы противостоять ложным срабатываниям и обходу обнаружения
  • Всегда проверяйте правило на выборках семейства и легитимных программ перед развёртыванием

Далее: запуск этих правил во всей инфраструктуре.

Можно начать бесплатно

Изучай Cyber Security Academy с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
76
Уроки
303

Часто задаваемые вопросы

Урок «Поиск по строкам и шестнадцатеричным данным» бесплатный?

Да — полный текст урока «Поиск по строкам и шестнадцатеричным данным» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cyber Security Academy, подпишись на CoddyKit PRO. Курс Cyber Security Academy содержит 4 уроков всего.

Чему я научусь в уроке «Поиск по строкам и шестнадцатеричным данным»?

Сопоставление артефактов вредоносного ПО Ты практикуешь Cyber Security Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cyber Security Academy?

Предыдущий опыт не требуется. Cyber Security Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Поиск по строкам и шестнадцатеричным данным»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cyber Security Academy?

Да. Каждый урок Cyber Security Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Для чего нужен YARA
  2. Синтаксис правил YARA
  3. Поиск по строкам и шестнадцатеричным данным
  4. Масштабирование и автоматизация сканирования
← Назад к Cyber Security Academy