
Volatility 3, портированный на Rust. Тот же вывод, но гораздо быстрее.
Порт фреймворка криминалистического анализа памяти Volatility 3 с Python на Rust. Он читает те же образы памяти, запускает те же плагины с теми же опциями и выводит тот же результат, байт в байт, но заметно быстрее.
Этот проект является портом Volatility 3 и, следовательно, представляет собой "Addition" в соответствии с Volatility Software License 1.0, поэтому публикуется под той же лицензией. Полный текст находится в LICENSE и онлайн по адресу https://www.volatilityfoundation.org/license/vsl-v1.0. Каждый исходный файл сохраняет уведомление о том, из чего он был произведён.
Этот проект не связан с Volatility Foundation и не одобрен ею. Название Volatility используется только для того, чтобы указать, портом чего он является.
Rust 1.85 или новее, затем:
cargo build --release
Бинарный файл размещается в target/release/vol-rs. Ничего дополнительного не требуется. Распаковка символов, RC4, DES, AES, сопоставление YARA, запись PNG и tar-архивы — всё встроено, тогда как версия на Python обращается к pycryptodomex, yara-python и pillow. Инструкции декодируются с помощью capstone 5.0.6 — той же библиотеки, которую версия на Python использует для тех же столбцов, скомпилированной внутрь, а не установленной рядом.
./target/release/vol-rs -f memory.raw windows.pslist.PsList
./target/release/vol-rs -f memory.lime linux.bash.Bash
./target/release/vol-rs -f memory.raw -r csv windows.netscan.NetScan
./target/release/vol-rs windows.malfind.Malfind --help
./target/release/vol-rs --list-plugins
Каждая опция, которую принимает версия на Python, принимается и здесь, с теми же именами и теми же значениями по умолчанию, включая -o, -r, -s, -c, -e, --filters, --hide-columns, --save-config, --stackers и --single-swap-locations. Собственные опции каждого плагина также совпадают, что показывают страницы справки: все 197 из них идентичны питоновским, символ в символ.
Пакеты символов размещаются в $XDG_DATA_HOME/vol-rs/symbols или в ~/.local/share/vol-rs/symbols, если эта переменная не задана. Пакет, находящийся в другом месте, указывается с помощью --symbol-dirs или через переменную окружения VOLRS_SYMBOL_PATH. Ядро Windows, которое не описывается ни одним пакетом, ищется на сервере символов Microsoft, а найденная там база данных превращается в файл символов и сохраняется, так что загрузка происходит один раз. Сама база данных кэшируется в ~/.cache/vol-rs, а файл символов записывается рядом с пакетами.
Обе стороны запускались на одних и тех же дампах, и результаты сравнивались, включая обрамление заголовков и завершающие переводы строк:
| Дамп | Запущено плагинов | Идентично |
|---|---|---|
| Windows 11 24H2, сборка 26100, дамп аварийного завершения 4,3 ГБ | 113 | 105 |
| Ubuntu 22.04, ядро 6.5.0-41, снимок VMware 4,3 ГБ | 69 | 61 |
| Windows 10 19041, дамп аварийного завершения 2,0 ГБ | 114 | 112 |
| Windows XP, необработанный дамп 512 МБ | 114 | 113 |
| Linux 3.2, необработанный дамп 512 МБ | 60 | 60 |
Восьми плагинам, которые принимают шаблон или правило, оно было задано — одинаковое с обеих сторон, — а не оставлено без него. Три из найденных таким образом различий оказались дефектами этого порта и исправлены.
| Другая проверка | Результат |
|---|---|
| Файлы, записанные извлекающими плагинами | Сравнено 24 441, все равны |
| Страницы справки плагинов | 197 из 197 идентичны |
| Средства вывода | csv, json, jsonl, quick и pretty сравнены на нескольких плагинах, все идентичны |
Инструкции декодируются той же библиотекой, которую использует версия на Python, скомпилированной в версии 5.0.6 — именно к этой версии был привязан эталон для данных сравнений. Версия 5.0.7 декодирует ещё одну форму инструкций, что меняет написание примерно двух процентов строк windows.mbrscan на дампе Windows 10 и больше ничего.
Символы Windows для использованных здесь дампов берутся из пакетов символов, публикуемых Volatility Foundation, которые читают оба инструмента, за исключением ядра Windows 11 24H2, которое не описывается ни одним пакетом и описание которого строится из базы данных, публикуемой Microsoft. Для более раннего дампа Windows 10 19045 описание, которое этот порт строит таким образом, в точности совпало с описанием, которое версия на Python строит из той же базы данных, по всем 16 базовым типам, 293 перечислениям, 1 653 структурам и 40 007 символам.
Десять наибольших разрывов на каждом дампе. Каждая цифра и каждый сравниваемый плагин приведены в BENCHMARKS.md.
| Плагин | Rust | Python | Быстрее |
|---|---|---|---|
windows.malfind.Malfind | 0.494 s | 392 s | x793 |
windows.malware.suspicious_threads.SuspiciousThreads | 0.621 s | 488 s | x786 |
windows.malware.malfind.Malfind | 0.569 s | 393 s | x691 |
windows.suspicious_threads.SuspiciousThreads | 0.739 s | 461 s | x624 |
windows.hollowprocesses.HollowProcesses | 0.646 s | 326 s | x504 |
windows.malware.hollowprocesses.HollowProcesses | 0.661 s | 322 s | x487 |
layerwriter.LayerWriter | 0.044 s | 17.4 s | x395 |
configwriter.ConfigWriter | 0.046 s | 16.7 s | x363 |
windows.vadinfo.VadInfo | 1.36 s | 488 s | x358 |
windows.verinfo.VerInfo | 0.541 s | 159 s | x294 |
| Плагин | Rust | Python | Быстрее |
|---|---|---|---|
linux.sockstat.Sockstat | 6.36 с | 2030 с | x319 |
timeliner.Timeliner | 9.56 с | 1070 с | x112 |
linux.lsmod.Lsmod | 0.282 с | 29.0 с | x103 |
linux.psscan.PsScan | 1.09 с | 111 с | x102 |
linux.mountinfo.MountInfo | 0.697 с | 70.3 с | x101 |
yarascan.YaraScan | 0.909 с | 79.6 с | x88 |
linux.malware.netfilter.Netfilter | 0.6 с | 49.9 с | x83 |
linux.ptrace.Ptrace | 0.253 с | 20.4 с | x81 |
linux.pstree.PsTree | 0.213 с | 16.2 с | x76 |
linux.ip.Link | 0.22 с | 16.4 с | x74 |
| Плагин | Rust | Python | Быстрее |
|---|---|---|---|
windows.malware.suspicious_threads.SuspiciousThreads | 0.677 с | 346 с | x511 |
windows.suspicious_threads.SuspiciousThreads | 0.677 с | 343 с | x507 |
windows.malfind.Malfind | 0.734 с | 320 с | x436 |
windows.hollowprocesses.HollowProcesses | 0.565 с | 244 с | x432 |
windows.malware.malfind.Malfind | 0.73 с | 313 с | x429 |
windows.vadinfo.VadInfo | 0.983 с | 412 с | x419 |
windows.malware.hollowprocesses.HollowProcesses | 0.648 с | 240 с | x370 |
configwriter.ConfigWriter | 0.043 с | 14.5 с | x337 |
layerwriter.LayerWriter | 0.039 с | 11.9 с | x304 |
windows.registry.hivelist.HiveList | 0.038 с | 7.54 с | x198 |
| Плагин | Rust | Python | Быстрее |
|---|---|---|---|
windows.suspicious_threads.SuspiciousThreads | 0.184 с | 34.5 с | x188 |
windows.malware.suspicious_threads.SuspiciousThreads | 0.2 с | 33.2 с | x166 |
windows.malware.hollowprocesses.HollowProcesses | 0.209 с | 31.0 с | x148 |
windows.vadinfo.VadInfo | 0.263 с | 38.5 с | x146 |
windows.hollowprocesses.HollowProcesses | 0.207 с | 28.1 с | x136 |
windows.mftscan.ResidentData | 0.205 с | 27.6 с | x135 |
windows.malfind.Malfind | 0.203 с | 26.3 с | x130 |
windows.mftscan.MFTScan | 0.393 с | 48.2 с | x123 |
windows.malware.malfind.Malfind | 0.24 с | 28.2 с | x118 |
windows.verinfo.VerInfo | 0.215 с | 25.1 с | x117 |