
Volatility 3, portiert auf Rust. Gleiche Ausgabe, viel schneller.
Eine Portierung des Memory-Forensik-Frameworks Volatility 3 von Python nach Rust. Es liest dieselben Speicherabbilder, führt dieselben Plugins mit denselben Optionen aus und gibt dieselbe Ausgabe Byte für Byte aus, nur deutlich schneller.
Dieses Projekt ist eine Portierung von Volatility 3 und daher eine „Addition" im Sinne der Volatility Software License 1.0, weshalb es unter derselben Lizenz veröffentlicht wird. Der vollständige Text befindet sich in LICENSE und online unter https://www.volatilityfoundation.org/license/vsl-v1.0. Jede Quelldatei behält den Hinweis, aus dem hervorgeht, wovon sie abgeleitet wurde.
Dieses Projekt ist nicht mit der Volatility Foundation verbunden und wird von ihr nicht unterstützt. Der Name Volatility wird nur verwendet, um anzugeben, wovon dies eine Portierung ist.
Rust 1.85 oder neuer, dann:
cargo build --release
Die Binärdatei landet unter target/release/vol-rs. Es wird nichts Optionales benötigt. Symboldekomprimierung, RC4, DES, AES, YARA-Matching, PNG-Schreiben und tar-Archive sind alle integriert, während die Python-Version auf pycryptodomex, yara-python und pillow zurückgreift. Anweisungen werden von capstone 5.0.6 dekodiert, derselben Bibliothek, die die Python-Version für dieselben Spalten verwendet, einkompiliert statt daneben installiert.
./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
Jede Option, die die Python-Version akzeptiert, wird auch hier akzeptiert, mit denselben Namen und denselben Standardwerten, einschließlich -o, -r, -s, -c, -e, --filters, --hide-columns, --save-config, --stackers und --single-swap-locations. Auch die Optionen der einzelnen Plugins stimmen überein, wie die Hilfeseiten zeigen: alle 197 von ihnen sind identisch mit denen der Python-Version, Zeichen für Zeichen.
Symbolpakete gehören nach $XDG_DATA_HOME/vol-rs/symbols oder, wenn diese Variable nicht gesetzt ist, nach ~/.local/share/vol-rs/symbols. Ein Paket an einem anderen Ort wird mit --symbol-dirs oder über die Umgebungsvariable VOLRS_SYMBOL_PATH angegeben. Ein Windows-Kernel, den kein Paket beschreibt, wird auf dem Microsoft-Symbolserver nachgeschlagen, und die dort gefundene Datenbank wird in eine Symboldatei umgewandelt und aufbewahrt, sodass der Abruf nur einmal erfolgt. Die Datenbank selbst wird unter ~/.cache/vol-rs zwischengespeichert, und die Symboldatei wird neben den Paketen abgelegt.
Beide Seiten wurden gegen dieselben Captures ausgeführt und verglichen, einschließlich Header-Rahmung und abschließender Zeilenumbrüche:
| Capture | Ausgeführte Plugins | Identisch |
|---|---|---|
| Windows 11 24H2, Build 26100, 4,3 GB Crash Dump | 113 | 105 |
| Ubuntu 22.04, Kernel 6.5.0-41, 4,3 GB VMware-Snapshot | 69 | 61 |
| Windows 10 19041, 2,0 GB Crash Dump | 114 | 112 |
| Windows XP, 512 MB Raw-Capture | 114 | 113 |
| Linux 3.2, 512 MB Raw-Capture | 60 | 60 |
Den acht Plugins, die ein Muster oder eine Regel benötigen, wurde eines übergeben, auf beiden Seiten dasselbe, statt sie auszulassen. Drei der so gefundenen Abweichungen waren Fehler in diesem Port und sind behoben.
| Weitere Prüfung | Ergebnis |
|---|---|
| Von extrahierenden Plugins geschriebene Dateien | 24.441 verglichen, alle gleich |
| Plugin-Hilfeseiten | 197 von 197 identisch |
| Renderer | csv, json, jsonl, quick und pretty bei mehreren Plugins verglichen, alle identisch |
Anweisungen werden von derselben Bibliothek dekodiert, die die Python-Version verwendet, eingebunden in Version 5.0.6, also der Version, auf die die Referenz für diese Vergleiche festgelegt war. Version 5.0.7 dekodiert eine weitere Anweisungsform, was die Schreibweise von etwa zwei Prozent der Zeilen von windows.mbrscan beim Windows-10-Capture verändert und sonst nichts.
Windows-Symbole für die hier verwendeten Captures stammen aus den Symbolpaketen, die die Volatility Foundation veröffentlicht und die von beiden Werkzeugen gelesen werden, mit Ausnahme des Windows-11-24H2-Kernels, den kein Paket beschreibt und dessen Beschreibung aus der von Microsoft veröffentlichten Datenbank erstellt wird. Bei einem früheren Windows-10-19045-Capture stimmte die Beschreibung, die dieser Port auf diese Weise erstellt, exakt mit der überein, die die Python-Version aus derselben Datenbank erstellt, über alle 16 Basistypen, 293 Enumerationen, 1.653 Strukturen und 40.007 Symbole hinweg.
Die zehn größten Abstände bei jedem Capture. Jede Zahl und jedes verglichene Plugin steht in BENCHMARKS.md.
| Plugin | Rust | Python | Schneller |
|---|---|---|---|
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 |
| Plugin | Rust | Python | Schneller |
|---|---|---|---|
linux.sockstat.Sockstat | 6,36 s | 2030 s | x319 |
timeliner.Timeliner | 9,56 s | 1070 s | x112 |
linux.lsmod.Lsmod | 0,282 s | 29,0 s | x103 |
linux.psscan.PsScan | 1,09 s | 111 s | x102 |
linux.mountinfo.MountInfo | 0,697 s | 70,3 s | x101 |
yarascan.YaraScan | 0,909 s | 79,6 s | x88 |
linux.malware.netfilter.Netfilter | 0,6 s | 49,9 s | x83 |
linux.ptrace.Ptrace | 0,253 s | 20,4 s | x81 |
linux.pstree.PsTree | 0,213 s | 16,2 s | x76 |
linux.ip.Link | 0,22 s | 16,4 s | x74 |
| Plugin | Rust | Python | Schneller |
|---|---|---|---|
windows.malware.suspicious_threads.SuspiciousThreads | 0,677 s | 346 s | x511 |
windows.suspicious_threads.SuspiciousThreads | 0,677 s | 343 s | x507 |
windows.malfind.Malfind | 0,734 s | 320 s | x436 |
windows.hollowprocesses.HollowProcesses | 0,565 s | 244 s | x432 |
windows.malware.malfind.Malfind | 0,73 s | 313 s | x429 |
windows.vadinfo.VadInfo | 0,983 s | 412 s | x419 |
windows.malware.hollowprocesses.HollowProcesses | 0,648 s | 240 s | x370 |
configwriter.ConfigWriter | 0,043 s | 14,5 s | x337 |
layerwriter.LayerWriter | 0,039 s | 11,9 s | x304 |
windows.registry.hivelist.HiveList | 0,038 s | 7,54 s | x198 |
| Plugin | Rust | Python | Schneller |
|---|---|---|---|
windows.suspicious_threads.SuspiciousThreads | 0,184 s | 34,5 s | x188 |
windows.malware.suspicious_threads.SuspiciousThreads | 0,2 s | 33,2 s | x166 |
windows.malware.hollowprocesses.HollowProcesses | 0,209 s | 31,0 s | x148 |
windows.vadinfo.VadInfo | 0,263 s | 38,5 s | x146 |
windows.hollowprocesses.HollowProcesses | 0,207 s | 28,1 s | x136 |
windows.mftscan.ResidentData | 0,205 s | 27,6 s | x135 |
windows.malfind.Malfind | 0,203 s | 26,3 s | x130 |
windows.mftscan.MFTScan | 0,393 s | 48,2 s | x123 |
windows.malware.malfind.Malfind | 0,24 s | 28,2 s | x118 |
windows.verinfo.VerInfo | 0,215 s | 25,1 s | x117 |