
Volatility 3 portado a Rust. Misma salida, mucho más rápido.
Un port del framework de análisis forense de memoria Volatility 3 de Python a Rust. Lee las mismas imágenes de memoria, ejecuta los mismos plugins con las mismas opciones e imprime la misma salida, byte por byte, bastante más rápido.
Este proyecto es un port de Volatility 3 y, por lo tanto, es una "Addition" bajo la Volatility Software License 1.0, por lo que se publica bajo esa misma licencia. El texto completo está en LICENSE y en línea en https://www.volatilityfoundation.org/license/vsl-v1.0. Cada archivo fuente conserva el aviso que registra de qué fue derivado.
Este proyecto no está afiliado ni respaldado por la Volatility Foundation. El nombre Volatility se usa únicamente para indicar de qué es un port.
Rust 1.85 o superior, luego:
cargo build --release
El binario se genera en target/release/vol-rs. No se necesita nada opcional. La descompresión de símbolos, RC4, DES, AES, la coincidencia YARA, la escritura de PNG y los archivos tar están todos integrados, mientras que la versión de Python recurre a pycryptodomex, yara-python y pillow. Las instrucciones se decodifican mediante capstone 5.0.6, la misma biblioteca que la versión de Python utiliza para las mismas columnas, compilada en lugar de instalada junto al programa.
./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
Todas las opciones que acepta la versión de Python también se aceptan aquí, con los mismos nombres y los mismos valores predeterminados, incluidos -o, -r, -s, -c, -e, --filters, --hide-columns, --save-config, --stackers y --single-swap-locations. Las opciones propias de cada plugin también coinciden, como muestran las páginas de ayuda: las 197 son idénticas a las de Python, carácter por carácter.
Los paquetes de símbolos se colocan en $XDG_DATA_HOME/vol-rs/symbols, o en ~/.local/share/vol-rs/symbols cuando esa variable no está definida. Un paquete ubicado en otro lugar se indica con --symbol-dirs o mediante la variable de entorno VOLRS_SYMBOL_PATH. Un kernel de Windows que ningún paquete describe se busca en el servidor de símbolos de Microsoft, y la base de datos encontrada allí se convierte en un archivo de símbolos que se conserva, de modo que la descarga ocurre una sola vez. La base de datos en sí se almacena en caché en ~/.cache/vol-rs y el archivo de símbolos se escribe junto a los paquetes.
Ambos lados se ejecutaron sobre las mismas capturas y se compararon, incluidos el encabezado y los saltos de línea finales:
| Captura | Plugins ejecutados | Idénticos |
|---|---|---|
| Windows 11 24H2, build 26100, volcado de fallos de 4,3 GB | 113 | 105 |
| Ubuntu 22.04, kernel 6.5.0-41, instantánea de VMware de 4,3 GB | 69 | 61 |
| Windows 10 19041, volcado de fallos de 2,0 GB | 114 | 112 |
| Windows XP, captura en bruto de 512 MB | 114 | 113 |
| Linux 3.2, captura en bruto de 512 MB | 60 | 60 |
A los ocho plugins que aceptan un patrón o una regla se les proporcionó uno, el mismo en ambos lados, en lugar de omitirlos. Tres de las diferencias encontradas de ese modo eran defectos de este port y están corregidos.
| Otra comprobación | Resultado |
|---|---|
| Archivos escritos por los plugins de extracción | 24.441 comparados, todos iguales |
| Páginas de ayuda de los plugins | 197 de 197 idénticas |
| Renderizadores | csv, json, jsonl, quick y pretty comparados en varios plugins, todos idénticos |
Las instrucciones se decodifican con la misma biblioteca que usa la versión de Python, compilada en la versión 5.0.6, que es la versión a la que se fijó la referencia para estas comparaciones. La versión 5.0.7 decodifica una forma de instrucción más, lo que cambia la forma en que se escriben aproximadamente el dos por ciento de las líneas de windows.mbrscan en la captura de Windows 10 y nada más.
Los símbolos de Windows para las capturas usadas aquí provienen de los paquetes de símbolos que publica la Volatility Foundation, leídos por ambas herramientas, excepto el kernel de Windows 11 24H2, que ningún paquete describe y cuya descripción se construye a partir de la base de datos que publica Microsoft. Para una captura anterior de Windows 10 19045, la descripción que este port construye de ese modo coincidió exactamente con la que construye la versión de Python a partir de la misma base de datos, en los 16 tipos base, 293 enumeraciones, 1.653 estructuras y 40.007 símbolos.
Las diez diferencias más amplias en cada captura. Cada cifra, y cada plugin comparado, está en BENCHMARKS.md.
| Plugin | Rust | Python | Más rápido |
|---|---|---|---|
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 | Más rápido |
|---|---|---|---|
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 | Más rápido |
|---|---|---|---|
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 | Más rápido |
|---|---|---|---|
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 |