
Volatility 3, portiert auf Rust. Gleiche Ausgabe, viel schneller.
Eine Portierung des Volatility-3-Frameworks für Memory-Forensik von Python nach Rust. Es liest dieselben Speicherabbilder, führt dieselben Plugins mit denselben Optionen aus und gibt dieselbe Ausgabe aus – Byte für Byte – nur ein gutes Stück schneller.
Dieses Projekt ist eine Portierung von Volatility 3 und daher ein „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 enthält den Hinweis, woraus sie abgeleitet wurde.
Dieses Projekt ist weder mit der Volatility Foundation verbunden noch von ihr 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 ist nichts Optionales erforderlich. Symbol-Dekomprimierung, RC4, DES, AES, YARA-Abgleich, x86-Disassemblierung, PNG-Erstellung und Tar-Archive sind alle eingebaut, wo die Python-Version auf pycryptodomex, yara-python, capstone und pillow zurückgreift.
./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 eigenen Optionen jedes Plugins stimmen überein, wie die Hilfeseiten zeigen: Alle 197 sind mit den Python-Versionen identisch, Zeichen für Zeichen.
Symbolpakete gehören nach $XDG_DATA_HOME/vol-rs/symbols bzw. ~/.local/share/vol-rs/symbols, wenn diese Variable nicht gesetzt ist. Ein Paket an anderer Stelle wird mit --symbol-dirs oder über die Umgebungsvariable VOLRS_SYMBOL_PATH benannt. Windows-Symbole werden bei Bedarf vom Microsoft-Symbolserver abgerufen und unter ~/.cache/vol-rs zwischengespeichert.
Beide Seiten wurden gegen dieselben Aufnahmen ausgeführt und verglichen, einschließlich Header-Rahmen und abschließender Zeilenumbrüche:
| Prüfung | Ergebnis |
|---|---|
| Windows-Plugins ohne Argumente | 99 von 100 identisch |
Die acht Dateien, die nicht gleich waren, sind die beiden unter „Bekannte Unterschiede“ unten aufgeführten Fälle. Sieben sind Teildateien, die die Python-Version auf der Festplatte hinterlässt, nachdem sie meldet, dass sie sie nicht ausgeben konnte – diese Portierung erstellt sie nicht –, und eine ist ein Tarball, dessen Inhalt übereinstimmt, dessen Zeitstempel jedoch den jeweiligen Ausführungszeitpunkt festhalten.
Die beiden Plugins, die in diesen Zählungen fehlen, sind diejenigen, die die Python-Version auf dem Testrechner nicht abschließen kann. windows.memmap.Memmap wird nach 7,8 Millionen Zeilen vom Out-of-Memory-Killer beendet, und linux.pscallstack.PsCallStack wird vor seinem Ende beendet. In beiden Fällen wird jede Zeile, die die Python-Version zuerst schreiben konnte, exakt reproduziert.
Über alle Plugins hinweg, die ohne Argumente laufen, benötigt der Windows-Durchlauf hier 273 Sekunden gegenüber 5723 Sekunden und der Linux-Durchlauf 68 Sekunden gegenüber 3130 Sekunden.
Die zehn größten Abstände auf jeder Aufnahme, von allen Plugins, die ohne Argumente laufen:
BENCHMARKS.md enthält den Rest: jedes Plugin auf beiden Aufnahmen, die Läufe mit Argumenten und den Rechner, auf dem die Zahlen gemessen wurden.
Eine Handvoll Dinge können nicht übereinstimmen, und jedes ist beabsichtigt:
linux.pagecache.RecoverFs stempelt jede Datei im Tarball, den es schreibt, mit dem Zeitpunkt der Plugin-Ausführung, sodass keine zwei Läufe übereinstimmen – nicht einmal zwei Python-Läufe. Die Tabelle stimmt überein, ebenso der entpackte Baum.--save-config und timeliner --record-config erfassen jede Einstellung, die das Abbild beschreibt, nicht jedoch die Prüfungen der Python-Version, ob eine importierte Komponente neu genug ist, da diese Portierung keine solchen Prüfungen hat, die es aufzuzeichnen gäbe.linux.mountinfo --mount-format verbindet ein Python-Set, sodass sich die Spaltenreihenfolge zwischen zwei Python-Läufen ändert. Diese Portierung listet zuerst die Mount-Optionen und danach die Dateisystem-Optionen auf, in der Reihenfolge, in der der Kernel sie hält.frameworkinfo und isfinfo beschreiben das Tool und nicht das Abbild, daher melden sie die eigenen Layer, Plugins und Symboldateien dieser Portierung.windows.dumpfiles hinterlässt nicht die Teildateien, die die Python-Version erstellt, bevor sie entdeckt, dass sie sie nicht lesen kann. Die Tabellen stimmen überein, die Verzeichnisse unterscheiden sich um diese Dateien.--help, die das Cache-Verzeichnis benennt, nennt den eigenen Cache dieser Portierung.Alles unten ist portiert und baut, wurde aber noch nicht gegen echte Beweismittel ausgeführt:
Volatility 3 ist das Werk der Volatility Foundation und ihrer Mitwirkenden. Dies ist eine Portierung ihres Designs, ihres Plugin-Satzes und ihres Ausgabeformats, und sie existiert, weil dieses Werk offen ist.
| Linux-Plugins ohne Argumente | 56 von 57 identisch |
| Läufe mit Argumenten | 43 von 43 identisch |
| Von extrahierenden Plugins geschriebene Dateien | 1.747 verglichen, jede Datei, die beide Tools schrieben, ist gleich |
| Hilfeseiten der Plugins | 197 von 197 identisch |
| Plugin | Rust | Python | Schneller |
|---|
windows.malware.suspicious_threads.SuspiciousThreads | 0,47 s | 281,6 s | x599 |
windows.suspicious_threads.SuspiciousThreads | 0,50 s | 259,1 s | x518 |
windows.malware.hollowprocesses.HollowProcesses | 0,52 s | 257,9 s | x496 |
windows.suspended_threads.SuspendedThreads | 0,090 s | 42,0 s | x467 |
windows.malware.malfind.Malfind | 0,52 s | 236,5 s | x455 |
windows.hollowprocesses.HollowProcesses | 0,59 s | 263,0 s | x446 |
windows.debugregisters.DebugRegisters | 0,090 s | 37,0 s | x411 |
windows.malfind.Malfind | 0,65 s | 239,7 s | x369 |
windows.vadinfo.VadInfo | 0,99 s | 329,7 s | x333 |
windows.verinfo.VerInfo | 0,99 s | 150,7 s | x152 |
| Plugin | Rust | Python | Schneller |
|---|
linux.library_list.LibraryList | 1,99 s | 788,7 s | x396 |
linux.kallsyms.Kallsyms | 2,41 s | 161,6 s | x67 |
linux.netfilter.Netfilter | 0,89 s | 56,3 s | x63 |
linux.lsof.Lsof | 0,89 s | 55,6 s | x62 |
linux.sockstat.Sockstat | 1,60 s | 97,2 s | x61 |
linux.check_idt.Check_idt | 0,82 s | 49,7 s | x61 |
linux.malware.netfilter.Netfilter | 1,07 s | 62,0 s | x58 |
linux.pagecache.Files | 1,67 s | 93,4 s | x56 |
linux.kthreads.Kthreads | 0,87 s | 47,2 s | x54 |
linux.proc.Maps | 2,53 s | 135,4 s | x54 |