Внутри винды, которая запущена под qemu tcg мы не ставим Procmon, Sysmon, дебаггеры и прочие анализирующие тулзы. Винда остается максимально чистой, а все наблюдение происходит снаружи, через QEMU TCG и офлайн-парсинг логов. Qemu Guest Agent тоже удаляется.
QEMU TCG пишет не красивый отчет, а низкоуровневый поток событий: выполненные блоки кода, syscall-события, обращения к памяти. На этом уровне в логе есть шум всей виртуальной машины: ядро Windows, службы, cmd/launcher, conhost, дочерние процессы и сам sample. В этом шуме мы должны найти образ/процесс целевой малвари и выделить конкретно ее действия. Сделать это можно по комбинации сисколов и определенных действий. Главная сложность — отделить поведение образца от шума операционной системы и превратить поток низкоуровневых событий QEMU TCG в понятную картину: какие файлы трогал sample, куда писал, какие ключи реестра менял, пытался ли инжектиться в другие процессы и оставлял ли следы закрепления.
Как это реально работает:
1. QEMU-плагин пишет сырой syscall-поток: PID, TID, CR3, image, syscall number, RIP, аргументы регистров и часть stack-аргументов.
2. Скрипт парсит
ntdll.dll из гостевой Windows и строит карту:
0x55 -> NtCreateFile
0x3A -> NtWriteFile
0x18 -> NtOpenKey
...
То есть syscall number превращается в человеческое имя:
NtCreateFile,
NtWriteVirtualMemory,
NtSetValueKey.
3. Затем события фильтруются до PID/image целевого sample
4. После этого идут правила. Сисколы:
NtCreateFile / NtOpenFile / NtReadFile / NtWriteFile
попадают в file activity. А
NtCreateKey / NtOpenKey / NtSetValueKey / NtDeleteValueKey
попадают в registry activity.
Да, для анализа обычной малвари это оверхэд. Но зато такой стеап может быть полезен и для анализа эксплоитов, особенно ядерных, так как можно видеть всю работу в ядре.