
Исследуйте любой дамп памяти. Найдите скрытое. Форензика ядра Linux + Windows из одного статического Rust-бинарника — Python не требуется.
Инструмент для криминалистики памяти, который сам профилирует ядро Windows — и сверяется процесс-за-процессом с Volatility 3.
mem4n6 читает все распространённые форматы дампов (LiME, AVML, ELF core, crash-дампы Windows, файлы гибернации, сохранённые состояния VMware, kdump, raw…) и обходит процессы, потоки, модули, сетевые соединения и внедрённую память — из одного статического бинарника, который вы компилируете один раз и копируете куда угодно, без Python, без рантайма, без предварительно подготовленного каталога символов. В Windows он строит собственный профиль: находит ntoskrnl в физической памяти, считывает его PDB GUID из записи CodeView, подбирает соответствующий ISF Volatility-3, восстанавливает базу ядра при современном KASLR и реконструирует PsActiveProcessHead из таблицы символов — та же цепочка само-профилирования, которую используют Volatility 3 и MemProcFS, реализованная заново на Rust.
Поскольку планка для инструмента доказательной ценности — корректность, обход процессов сверяется с независимой эталонной реализацией — Volatility 3 — на реальном образе Windows 10 объёмом 2 ГБ (согласие эталона — веское свидетельство, а не доказательство; исходные байты — истина в последней инстанции):
windows.pslist on DESKTOP-SDN1RPT.mem | mem4n6 против Volatility 3 |
|---|---|
| Процессы совпали | 94 / 94 общих PID — точные PID, PPID, имя, время создания |
| Пропущены (vol3 нашёл, mem4n6 — нет) | 0 |
| Ложные срабатывания (mem4n6 нашёл, vol3 — нет) | 0 |
mem4n6 совпадает с Volatility 3 точно — включая восстановление 11 процессов, осиротевших из-за смазывания при живой съёмке, с помощью двунаправленного обхода ActiveProcessLinks. Второй независимый оракул (MemProcFS) подтверждает чистое подмножество — его список из 77 процессов process_list полностью содержится в наборе mem4n6, при этом процессов, известных только MemProcFS, ноль (детали). См. docs/validation.md: полный дифференциальный анализ и шаги воспроизведения.
Установите с помощью cargo install mem4n6 или возьмите готовый статический бинарник из последнего релиза — сборки Linux являются static-PIE (musl: копируйте куда угодно, без glibc), рядом также есть macOS, Windows и checksums.txt с SHA-256.
Или соберите из исходников (~одна команда):```bash git clone https://github.com/SecurityRonin/memory-forensic.git cd memory-forensic && cargo build --release ./target/release/mem4n6 --help
Эта dev-сборка динамически линкует libc; чтобы локально воспроизвести полностью статический бинарник релиза, добавьте таргет musl: `rustup target add x86_64-unknown-linux-musl && cargo build --release --target x86_64-unknown-linux-musl`.```bash
# Inspect any dump — format, ranges, embedded metadata (no symbols needed)
mem4n6 info win10.mem
# Windows process tree. The ISF is resolved from the kernel's own PDB GUID;
# raw .mem dumps take the page-table base via --cr3 (crash dumps carry their own).
mem4n6 ps --symbols ntkrnlmp.json --cr3 0x1ad000 --tree win10.mem
# Linux process tree from a LiME capture
mem4n6 ps --symbols linux.json --tree memdump.lime
# Air-gapped lab? Never touch the network for symbols:
mem4n6 ps --symbols ntkrnlmp.json --offline win10.mem
Файлы символов — это ISF JSON — те же пакеты, что использует Volatility 3, поэтому существующий кэш символов работает как есть.
mem4n6, насколько нам известно, — единственная Rust-реализация полной цепочки дамп → сканирование ядра → PDB-GUID → разрешение символов → DTB. Родословная техники — сервер символов WinDbg, pdbparse Брендана Долан-Гавитта, Rekall, Volatility 3 и MemProcFS Ульфа Фриска — хорошо известна; mem4n6 реализует её с нуля по методу clean-room и сверяет результат с эталоном. MemNixFS привносит ту же идею память-как-файловая-система в Linux-дампы — монтирование и просмотр, с символами, извлекаемыми из собственного BTF ядра, когда ISF отсутствует; ячейки n/a выше отмечают различие в охвате (образы Linux и UX файловой системы, в отличие от проверенного на Windows CLI-обходчика mem4n6), а не пробел. Якорь boot low-stub / PROCESSOR_START_BLOCK опирается на доклад Алекса Ионеску Getting Physical (REcon 2017).
git clone https://github.com/SecurityRonin/memory-forensic.git cd memory-forensic cargo build --release ./target/release/mem4n6 --help
---
## Краткий справочник```bash
# Show dump format and physical memory ranges
mem4n6 info memdump.dmp
# Process tree with threads and DLLs
mem4n6 ps --symbols ntkrnlmp.json --tree --threads --dlls memdump.dmp
# Network connections (json / csv / table)
mem4n6 net --symbols ntkrnlmp.json --output json memdump.dmp
# Kernel integrity checks (SSDT, IDT, callbacks, hooks)
mem4n6 check --symbols ntkrnlmp.json --ssdt --callbacks memdump.dmp
# Linux syscall hook and malfind scan
mem4n6 check --symbols linux.json --hooks --malfind memdump.lime
# String extraction with YARA rules
mem4n6 strings --rules ./yara-rules/ --min-length 8 memdump.dmp
# Hash lookup against NSRL (known-good) and MalwareBazaar (known-bad)
mem4n6 hash --lookup memdump.dmp
# Extract framebuffer screenshot from live memory dump
mem4n6 framebuf --symbols linux.json --png screen.png memdump.dmp
# Recover files from tmpfs mounts + detect memfd fileless ELF execution
mem4n6 check --symbols linux.json --tmpfs-recovery --memfd memdump.lime
# Detect EDR bypass: direct syscalls, ETW patching, AMSI/DSE bypass
mem4n6 check --symbols ntkrnlmp.json --direct-syscalls --etw-patch --amsi-bypass memdump.dmp
# Novel kernel interface abuse: io_uring, netfilter hooks, perf_event
mem4n6 check --symbols linux.json --io-uring --netfilter --perf-event memdump.lime
# Cross-artifact ATT&CK correlation across all walkers
mem4n6 correlate --symbols ntkrnlmp.json --output json memdump.dmp
Файлы символов представляют собой ISF JSON, совместимые с пакетами символов Volatility 3.
mem4n6 check --symbols linux.json --hooks --idt --syscalls memdump.lime
Кроме того, инъекция шаблонов на стороне сервера может использоваться как трамплин для расширения поверхности атаки, например, путём поиска полной цепочки уязвимостей.
#### JWT-атаки
Модуль JWT-атак включает различные атаки, которые могут использоваться против реализаций JWT для обхода механизмов аутентификации и авторизации. Сюда входят следующие атаки:
- Атака с подменой алгоритма
- Атака с путаницей ключей
- Атака с использованием алгоритма None
- Манипуляция утверждениями JWT
Модуль JWT-атак содержит ряд пользовательских расширений, например для работы с распространёнными JWT-пейлоадами, используемыми [редактором JWT от PortSwigger](https://portswigger.net/burp/documentation/desktop/tools/event-listener), и автоматизации JWT-пейлоадов.
#### GraphQL
Модуль GraphQL помогает расширить поверхность атаки для реализаций GraphQL и предоставляет набор инструментов статического и динамического анализа для реализаций GraphQL. Это включает следующее:
- [GraphQL Voyager](https://github.com/APIs-guru/graphql-voyager) представляет любой GraphQL API в виде интерактивного графа.
- [GraphQL Playground](https://github.com/graphql/graphql-playground) — поддержка IDE для разработки GraphQL.
- [InQL](https://github.com/doyensec/inql) — это инструмент тестирования безопасности, который упрощает проверку безопасности технологии GraphQL;
- Опциональная интроспекция GraphQL и импорт схемы для поддоменов.
Для расширения поверхности атаки для реализаций GraphQL набор расширений Burp предоставляет возможность:
- Определять конечные точки GraphQL путём анализа всего проекта.
- Предоставлять надёжный конструктор GraphQL-запросов.
#### Дополнительные модули
- Модуль сканирования CMS включает сканеры для обнаружения конфигураций WordPress, Drupal, Joomla и возможных ошибок конфигурации в установленных плагинах.
- Модуль сканирования Log4Shell для обнаружения [уязвимости Log4Shell](https://nvd.nist.gov/vuln/detail/CVE-2021-44228).
- Модуль Test Upload Cabinet для тестирования произвольной загрузки файлов.```
[HOOK] sys_call_table[59] execve → 0xffffffffc0a2f3d0 (outside kernel text)
[HOOK] ftrace_ops[0] target: vfs_read → 0xffffffffc0a2f410 (module: libymv_ko)
[HOOK] security_inode_getattr → 0xffffffffc0a2f450 (LSM hook patched)
Три типа хуков — таблица системных вызовов, ftrace и LSM — все разрешаются в один и тот же модуль ядра. Сопоставление со списком модулей подтверждает, что его нет в наборе известных доверенных модулей.
Сопоставление по шаблону имени не обнаруживает перекомпилированные или переименованные варианты руткитов. Анализ динамических символов ELF выявляет их независимо от имени:```bash mem4n6 check --symbols linux.json --elf-hooks memdump.lime
Error: the input chunk is empty — there is no content to translate.```
[ROOTKIT] /tmp/.x/libhider.so signals=[elf.hooks.process_hiding, elf.hooks.pam_credential_theft]
exports: readdir64, getdents64, pam_get_item, pam_authenticate
MITRE: T1014 (Rootkit), T1556.003 (Modify Authentication Process)
loaded in 100% of processes (23/23)
[ROOTKIT] /tmp/.x/libhider.so .rodata match: "UID:%d:" (Father PAM hook format string, weight=90)
memf-linux сканирует каждую библиотеку, отображённую в памяти процесса, на предмет:
.rodata (например, UID:%d:, silly.txt), которые сохраняются после удаления символов и смены имёнmem4n6 check --symbols ntkrnlmp.json --dpapi-keys memdump.dmp
mem4n6 check --symbols ntkrnlmp.json --browser-cookies memdump.dmp
⚠️ Input content is missing. Please provide the Markdown text to translate.```
[DPAPI] GUID={A1B2C3D4-...} blob_len=680 source=lsass.exe
[COOKIE] msedge.exe domain=.github.com name=user_session value=secretvalue...
[COOKIE] chrome.exe (v10-encrypted) — key material required for decryption
Обходчики учётных данных Windows охватывают:
g_MasterKeyCache в LSASS, извлекает GUID + зашифрованный blob для каждого кэшированного мастер-ключаv10/v20 + 12-байтовый nonce); расшифровываются при наличии ключевого материалаmem4n6 framebuf --symbols ntkrnlmp.json --png screen.png memdump.dmp
Извлекает кадровый буфер из дампа памяти живой системы или дампа гибернации и сохраняет его в виде PNG. Работает как в Linux (обход `drm_framebuffer` в DRM/KMS), так и в Windows (кадровый буфер сеанса через сканирование пула `win32k`). Полезен для фиксации состояния экрана на момент снятия дампа без загрузки образа.
---
## Восстановление файлов, которые никогда не попадали на диск
Злоумышленники, использующие tmpfs или `memfd_create(2)`, не оставляют артефактов в файловой системе — бинарный файл существует только в ОЗУ.```bash
# Recover inodes and file content from Linux tmpfs/ramfs mounts
mem4n6 check --symbols linux.json --tmpfs-recovery memdump.lime
# Detect ELF binaries running from anonymous memfd file descriptors
mem4n6 check --symbols linux.json --memfd memdump.lime
Please provide the content of chunk 25 so I can translate it into Russian.``` [TMPFS] /tmp/.x (dev=tmpfs) 3 inodes recovered inode 12: ELF x86_64 size=847KB sha256=deadbeef... (no disk copy) inode 13: config.sh size=1.2KB content recovered inode 14: keys.txt size=512B content recovered
[MEMFD] pid=2341 (python3) fd=4 name="" size=3.4MB ELF x86_64 No path on disk — binary executed entirely from anonymous memory. MITRE: T1620 (Reflective Code Loading)
восстановление tmpfs обходит таблицу ядра `vfsmount` и восстанавливает содержимое inode из страниц page-cache. Детектирование memfd проходит по таблице открытых файловых дескрипторов каждого процесса и помечает анонимные inode, созданные с помощью `memfd_create(2)`.
---
## Обнаружение обхода EDR и подавления журналирования
Современные атакующие инструменты пропатчивают инструментарий безопасности Windows в памяти, чтобы обойти обнаружение, не затрагивая диск.```bash
# Direct syscalls — Syswhispers/Hell's Gate bypass Win32 API entirely
mem4n6 check --symbols ntkrnlmp.json --direct-syscalls memdump.dmp
# ETW patching — log suppression via ret/xor at ETW write functions
mem4n6 check --symbols ntkrnlmp.json --etw-patch memdump.dmp
# AMSI bypass — script-scanning suppression via amsi.dll patch
mem4n6 check --symbols ntkrnlmp.json --amsi-bypass memdump.dmp
# DSE bypass — Driver Signature Enforcement disabled for unsigned drivers
mem4n6 check --symbols ntkrnlmp.json --dse-bypass memdump.dmp
Примечание: Будущие релизы этого инструмента не будут публиковаться на Rubygems. Для загрузки и обновлений, пожалуйста, посетите страницу релизов на GitHub.
--wait и --wait-fail для медленных соединений[ETW-PATCH] svchost.exe (PID 1200) EtwEventWrite → ret at offset +0 Expected: 4C 8B DC Got: C3 90 90 (patched to immediate return) MITRE: T1562.006 (Impair Defenses: Indicator Blocking)
[AMSI-BYPASS] powershell.exe (PID 4412) AmsiScanBuffer → xor eax,eax / ret MITRE: T1562.001 (Impair Defenses: Disable or Modify Tools)
[DSE-BYPASS] g_CiEnabled=0 CipInitialize patch detected MITRE: T1014 (Rootkit), T1553.006 (Subvert Trust Controls)
---
## Злоупотребление новыми интерфейсами ядра Linux
Помимо классических перехватов системных вызовов, современные руткиты злоупотребляют более новыми подсистемами ядра. `memory-forensic` охватывает все три:```bash
mem4n6 check --symbols linux.json --io-uring --netfilter --perf-event memdump.lime
Please provide the Markdown content to translate.``` [IO_URING] pid=3311 (malware) ring at 0x7f0000000000 ops=1024 pending SQPOLL thread pinned to cpu=0 — I/O continues without process context MITRE: T1071 (Application Layer Protocol)
[NETFILTER] NF_INET_PRE_ROUTING hook[0] → 0xffffffffc0b31240 (outside kernel text) Module not in module list — DKOM-hidden or manually unmapped MITRE: T1014 (Rootkit)
[PERF-EVENT] pid=1 (systemd) type=HARDWARE cpu=-1 overflow_handler patched → 0xffffffffc0b31500 MITRE: T1056 (Input Capture)
---
## Индикаторы побега из контейнера```bash
mem4n6 check --symbols linux.json --container-escape memdump.lime
Входной фрагмент пуст — переводить нечего.``` [CONTAINER-ESCAPE] pid=8801 (bash) shares host user namespace uid_map: 0 0 4294967295 (full host UID range — privileged mapping) cgroup: / (host root cgroup, not namespaced) mount ns: host (same as pid 1) MITRE: T1611 (Escape to Host)
Обходит пространства имён user, mount, PID, net и cgroup для каждого процесса и помечает процессы, которые должны быть изолированы, но совместно используют пространства имён уровня хоста — структурный признак побега из контейнера, независимо от того, как он был совершён.
---
## Межартефактная корреляция ATT&CK
`memf-correlate` объединяет результаты всех обходчиков во временную шкалу, оценивает аномалии по степени серьёзности и сопоставляет каждую из них с техниками MITRE ATT&CK, не запуская обходчики по одному:```bash
mem4n6 correlate --symbols ntkrnlmp.json --output json memdump.dmp > findings.json
Please provide the Markdown content to translate.```json { "technique": "T1055.012", "name": "Process Hollowing", "severity": "critical", "evidence": [ { "source": "vad", "detail": "svchost.exe VAD 0x140000–0x160000 RWX, no backing file" }, { "source": "ldrmodules","detail": "module in VAD but absent from InLoadOrderList" }, { "source": "iat_hooks", "detail": "CreateRemoteThread IAT entry patched → 0x14001a30" } ], "process": { "name": "svchost.exe", "pid": 1200, "ppid": 508 } }
Process, network, module, hook, and credential walker results are correlated by process and time before scoring — producing ATT&CK-tagged findings rather than per-walker output that an analyst must join manually.
---
## Поддерживаемые форматы памяти
| Формат | Источник | Автоопределение |
|---|---|---|
| LiME (`.lime`) | Модуль ядра Linux | Да |
| AVML v2 | Azure AVML | Да |
| ELF Core | QEMU, `gcore` | Да |
| Аварийный дамп Windows (`.dmp`) | DumpIt, WinDbg | Да |
| Hiberfil.sys | Гибернация / быстрый запуск Windows | Да |
| VMware State (`.vmss`, `.vmsn`) | VMware Workstation / ESXi | Да |
| kdump / diskdump | `makedumpfile` | Да |
| Raw / flat | Любой запасной вариант | Да |
Формат определяется по заголовкам файлов — флаги не требуются.
---
## Что отличается
Ближайшие альтернативы — **Volatility 3** (Python, плагинная архитектура), **MemProcFS** (C с привязками Rust, в первую очередь Windows), **Rekall** (Python, не поддерживается) и **MemNixFS** (C++, дампы Linux, монтируемые как файловая система). Приведённое ниже сравнение отражает официальное ядро и известный репозиторий плагинов каждого инструмента. MemNixFS нацелен на образы *Linux* с пользовательским интерфейсом файловой системы, поэтому он разделяет с mem4n6 восстановление файлов из page-cache, но имеет `n/a` в строках о самопрофилировании Windows и обходе EDR.
### Паритет — возможности, общие со зрелыми инструментами
| | memory-forensic | Volatility 3 | MemProcFS | MemNixFS | Rekall |
|--|:-:|:-:|:-:|:-:|:-:|
| Обходчики ядра Linux и Windows | ✅ | ✅ | Windows-first | Linux-only | ✅ |
| Перечисление процессов, модулей, сети | ✅ | ✅ | ✅ | ✅ | ✅ |
| Обнаружение внедрённой памяти | ✅ | ✅ | ✅ | ✅ | ✅ |
| Совместимость с пакетами символов ISF | ✅ | ✅ | — | ✅ | — |
| Работает на Linux / macOS | ✅ | ✅ | Частично | Linux + Win | ✅ |
| Активно поддерживается | ✅ | ✅ | ✅ | ✅ | — |
| Свободный и открытый | ✅ | ✅ | ✅ | без лицензии | ✅ |
### Возможности, отсутствующие в официальных дистрибутивах других инструментов
| | memory-forensic | Volatility 3 | MemProcFS | MemNixFS | Rekall |
|--|:-:|:-:|:-:|:-:|:-:|
| Единый статический бинарник — без Python, без рантайма | ✅ | — | — | частично | — |
| Библиотечный API для встраивания в инструменты на Rust | ✅ | — | ✅ | — | — |
| Поведенческая идентификация руткитов в ELF | ✅ | — | — | — | — |
| Восстановление файлов из tmpfs / ramfs | ✅ | — | — | ✅ | — |
| Обнаружение бесфайлового выполнения через memfd | ✅ | — | — | — | — |
| Обнаружение прямых системных вызовов / обхода EDR | ✅ | plugin? | — | n/a | — |
| Обнаружение обхода ETW / AMSI / DSE | ✅ | plugin? | — | n/a | — |
| Злоупотребление io_uring / netfilter / perf\_event | ✅ | — | — | — | — |
| Индикаторы побега из контейнера | ✅ | — | — | — | — |
| Извлечение ключей DPAPI и cookie Chrome | ✅ | plugin? | — | n/a | — |
| Доказательства доступа к папкам из shellbags в памяти ‡ | ✅ | — | — | n/a | — |
| Скриншот фреймбуфера | ✅ | plugin? | — | — | — |
| Межартефактная корреляция ATT&CK | ✅ | — | — | — | — |
| Безопасный вывод — RFC 4180, защита от внедрения формул, очистка bidi | ✅ | — | — | — | — |
> **`plugin?`** — Возможность может существовать в экосистеме сообщества Volatility 3, но отсутствует в официальном ядре и репозитории плагинов на момент написания. Проверьте, прежде чем делать выводы.
>
> **‡ Shellbags из памяти** — Volatility 2 извлекал shellbags из ОЗУ (общественный плагин `shellbags`, сначала Kovar, затем Lo); Volatility 3 так и не перенёс его, поэтому восстановление shellbags только из памяти ухудшилось при переходе vol2→vol3. mem4n6 напрямую обходит `Shell\BagMRU` в кусте `UsrClass.dat`/`NTUSER.DAT`, размещённом в памяти, — восстанавливая возможность эпохи vol2 для случая, когда доступна только RAM (диск не снимался), или для подтверждения куста на диске. Обычный путь, когда диск *доступен*, — смонтировать образ и запустить SBECmd / RegRipper на файле куста; обход памяти сворачивает двухшаговый процесс «выгрузить куст, затем разобрать» в один. Валидация — **tier-2**: эталонная истина получена с помощью `regipy` на кусте, извлечённом из `citadeldc01.mem` — для случая Szechuan не существует опубликованного стороннего эталонного набора shellbag, так что это самостоятельно выведенный оракул (реальный инструмент + реальный образ), а не сторонний ключ.
---
## Доверяй, но проверяй
Инструмент, разбирающий **недоверенные, контролируемые атакующим** образы памяти, обязан не лгать и не падать. mem4n6 создан под эту планку:
- **Отсутствие паник благодаря линту на враждебном вводе.** Пути разбора запрещают `unwrap`/`expect`/`panic!` и непроверенное индексирование (`clippy::unwrap_used`/`expect_used` = deny); каждое чтение длины, смещения и указателя проверяется на выход за границы и корректно деградирует — размазанный список процессов возвращает то, что удалось найти, а не прерывается. (API построителей паникуют при ошибке программиста — отсутствующем обязательном поле — по построению, но никогда из-за содержимого дампа.)
- **Безопасность памяти по умолчанию.** `unsafe_code = "deny"` для всего workspace; единственный `unsafe` — ограниченные файловые отображения `memmap2` (дамп, pagefile и база корректных хэшей), каждое из которых отдельно обосновано — отсюда бейдж *ограниченный (только mmap)*, а не *запрещённый*.
- **Проверено на независимом оракуле, а не только на наших собственных фикстурах.** Обходчик процессов Windows сверяется с Volatility 3 на реальном образе Win10 объёмом 2 ГБ — полное совпадение по каждому общему процессу, ноль ложных срабатываний ([`docs/validation.md`](https://github.com/securityronin/memory-forensic/blob/HEAD/docs/validation.md)).
- **Безопасный вывод.** Каждый канал (таблица/CSV/JSON) применяет экранирование по RFC 4180, защиту от внедрения формул в электронные таблицы и удаление bidi/управляющих символов, прежде чем контролируемые атакующим строки попадут в ваш терминал или конвейер.
---
## Использование библиотеки```rust
use mem4n6_format::open;
use mem4n6_core::vas::{TranslationMode, VirtualAddressSpace};
use mem4n6_core::object_reader::ObjectReader;
use mem4n6_symbols::isf::IsfResolver;
// Open any supported format — detected from file headers
let dump = open("memdump.dmp")?;
let symbols = IsfResolver::from_file("ntkrnlmp.json")?;
// Walk the x86_64 4-level page table
let vas = VirtualAddressSpace::new(dump.clone(), TranslationMode::X64, cr3);
let reader = ObjectReader::new(vas, Box::new(symbols));
// Walk EPROCESS list
for proc in reader.eprocess_list()? {
println!("{} (PID {})", proc.image_name()?, proc.pid()?);
}
issen — подкоманда issen mem4n6 управляет сбором памяти и формированием отчётов по триажу непосредственно из этого рабочего пространства.
Эндрю Кейс и Volatility Foundation, с чьим форматом ISF и архитектурой плагинов этот проект совместим на уровне символов.
Брендан Долан-Гэвитт, чьи исследования DKOM и сокрытия процессов на основе VAD легли в основу обходчиков обнаружения скрытых процессов.
Ульф Фриск / MemProcFS, чья модель «файловая система как интерфейс к памяти» и дизайн криминалистического режима повлияли на то, как эта библиотека предоставляет восстановленные артефакты.
jam1garner за binrw — декларативный разбор бинарных форматов, который делает слой форматов безопасным и читаемым.
S12 — статья Kernel Dynamic Offset Resolution Using PDB Symbols, в которой описана полная цепочка: сканирование дампа в поисках PE-образа ntoskrnl, извлечение GUID CodeView PDB и получение соответствующего PDB с msdl.microsoft.com в рантайме. Эта техника напрямую вдохновила реализацию AutoProfile в memf-symbols.
Алекс Ионеску — Getting Physical With USB Type-C: Windows 10 RAM Forensics and UEFI Attacks (REcon Brussels 2017), в которой задокументировано, что HalpLowStub из HAL — это недокументированный PROCESSOR_START_BLOCK — якорь в нижней области физической памяти (обнаруживается сканированием по сигнатуре в диапазоне 0x1000–0x100000), содержащий CR3/DTB ядра и подсказку о виртуальном адресе ядра (kernel-VA). Это основа для find_low_stub и восстановления DTB и базового адреса ядра без заголовков в memf-symbols.
Microsoft Symbol Server (msdl.microsoft.com) за размещение публичных PDB-файлов для каждой сборки ядра Windows — апстрим, который делает возможным разрешение символов в рантайме без заранее подготовленных файлов символов.
Политика конфиденциальности · Условия использования · © 2026 Security Ronin Ltd.
| mem4n6 | Volatility 3 | MemProcFS | MemNixFS |
|---|
| Развёртывание | Rust · один статический бинарный файл | Python · интерпретатор + зависимости | C(+Rust) · библиотеки | C++ · монтирование файловой системы |
| Самостоятельное профилирование Windows (сканирование → PDB GUID → символы) | ✅ | ✅ | ✅ | n/a — Linux-дампы |
| DTB без заголовка через boot low stub + база ядра с гранулярностью страниц | ✅ | самоссылающаяся PML4 + сканирование образа | ✅ low stub | n/a — Linux |
| Автономный / изолированный режим символов | ✅ --offline | пакет ISF или сеть | символы / сеть | ✅ BTF-from-dump |
Без паник на недоверенных дампах (запрет unsafe; unwrap/expect запрещены на путях разбора) | ✅ | — | — | — (C++) |
| Сверено с Volatility 3 | ✅ (docs/validation.md) | — (эталон) | — | — |
| Crate | Purpose |
|---|
memf-format | Определение формата и провайдеры физической памяти. Парсеры для LiME, AVML, ELF Core, Windows Crash Dump, hiberfil.sys, VMware state, kdump и необработанных плоских образов. |
memf-core | Обход таблиц страниц (x86_64 4-level/5-level, AArch64, x86 PAE/non-PAE), высокоуровневый ObjectReader для обхода структур ядра, доступ к файлу подкачки, декомпрессия LZO и кодирование скриншотов из фреймбуфера в PNG (в паре с обходчиками фреймбуфера Linux EFI/VESA и Windows win32k). |
memf-linux | Обходчики ядра Linux: список процессов task_struct, сетевые соединения, модули ядра, открытые файлы, программы eBPF, обнаружение хуков ftrace/IDT/syscall, перечисление namespace и cgroup, обнаружение процессов, скрытых DKOM, индикаторы побега из контейнера, анализ динамических символов ELF и поведенческое профилирование руткитов LD_PRELOAD, обнаружение глобальной распространённости библиотек и ещё ~45 обходчиков. |
memf-windows | Обходчики ядра Windows NT: перечисление EPROCESS/ETHREAD, списки DLL и драйверов, таблицы дескрипторов, сетевые сокеты, сканирование тегов пула, таблицы обратных вызовов, SSDT, ETW, буфер обмена, кэш DNS, билеты Kerberos, извлечение мастер-ключей DPAPI из LSASS g_MasterKeyCache, обнаружение зашифрованных AES-GCM cookie Chrome v10/v20, ключи BitLocker, хэши SAM/NTLM, обнаружение внедрённой памяти и ещё ~55 обходчиков. |
memf-strings | Извлечение строк (ASCII, UTF-8, UTF-16LE) с классификацией по регулярным выражениям на категории IoC: URL-адреса, IP-адреса, домены, ключи реестра, адреса криптокошельков, приватные ключи, команды оболочки. |
memf-symbols | Разрешение символов из ISF JSON, BTF (Linux) и PDB-файлов. Включает AutoProfile — разрешение структур ядра Windows без конфигурации: сканирует дамп на наличие ntoskrnl, загружает точный PDB с msdl.microsoft.com, разбирает его и возвращает SymbolResolver. Файл символов не требуется. |
memf-correlate | Перекрёстная корреляция артефактов с тегированием техник MITRE ATT&CK, реконструкцией дерева процессов, оценкой аномалий и построением временной шкалы. |
forensic-hashdb | Базы хэшей с нулевым количеством ложных срабатываний: поиск заведомо известных хороших файлов по NSRL/CIRCL, поиск заведомо известных вредоносных файлов по MalwareBazaar/VirusShare и встроенные хэши уязвимых драйверов Windows из loldrivers.io. |