
فولاتيليتي 3 مُنقَل إلى Rust. نفس المخرجات، أسرع بكثير.
نقل إطار عمل التحليل الجنائي للذاكرة Volatility 3 من Python إلى Rust. يقرأ نفس صور الذاكرة، ويشغّل نفس الإضافات بنفس الخيارات، ويطبع نفس المخرجات، بايتًا ببايت، وبسرعة أكبر بكثير.
هذا المشروع هو نقل لـ Volatility 3، وبالتالي فهو "إضافة" (Addition) بموجب ترخيص Volatility Software License 1.0، لذا يُنشر تحت نفس الترخيص. النص الكامل موجود في LICENSE وعلى الإنترنت على https://www.volatilityfoundation.org/license/vsl-v1.0. يحتفظ كل ملف مصدري بالإشعار الذي يسجّل المصدر الذي اشتُقّ منه.
هذا المشروع غير تابع لمؤسسة Volatility ولا معتمد منها. يُستخدم اسم 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 مطابقة لتلك الخاصة بـPython، حرفًا بحرف.
تُوضع حزم الرموز في $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 GB | 113 | 105 |
| Ubuntu 22.04، النواة 6.5.0-41، لقطة VMware بحجم 4.3 GB | 69 | 61 |
| Windows 10 19041، تفريغ أعطال بحجم 2.0 GB | 114 | 112 |
| Windows XP، التقاط خام بحجم 512 MB | 114 | 113 |
| Linux 3.2، التقاط خام بحجم 512 MB | 60 | 60 |
أُعطيت الإضافات الثماني التي تأخذ نمطًا أو قاعدة نمطًا واحدًا، نفسه على كلا الجانبين، بدلًا من استبعادها. وكانت ثلاث من الفروقات التي وُجدت بهذه الطريقة عيوبًا في هذا المنفذ وقد أُصلحت.
| فحص آخر | النتيجة |
|---|---|
| الملفات المكتوبة بواسطة إضافات الاستخراج | 24,441 تمت مقارنتها، وكلها متساوية |
| صفحات مساعدة الإضافات | 197 من 197 متطابقة |
| أدوات العرض | csv وjson وjsonl وquick وpretty قُورنت على عدة إضافات، وكلها متطابقة |
تُفكّك التعليمات بواسطة المكتبة نفسها التي يستخدمها إصدار Python، والمُجمّعة في الإصدار 5.0.6، وهو الإصدار الذي ثُبّتت عليه المرجعية لهذه المقارنات. ويُفكّك الإصدار 5.0.7 صيغة تعليمة إضافية واحدة، مما يغيّر طريقة كتابة نحو اثنين بالمئة من أسطر windows.mbrscan في التقاط Windows 10 ولا شيء غير ذلك.
تأتي رموز Windows لعمليات الالتقاط المستخدمة هنا من حزم الرموز التي تنشرها مؤسسة Volatility، وتقرأها كلتا الأداتين، باستثناء نواة 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 |
| Plugin | Rust | Python | Faster |
|---|---|---|---|
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 | Faster |
|---|---|---|---|
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 | Faster |
|---|---|---|---|
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 |
| Plugin | Rust | Python | Faster |
|---|---|---|---|
linux.library_list.LibraryList | 0.525 s | 917 s | x1747 |
linux.pscallstack.PsCallStack | 0.31 s | 98.8 s | x319 |
linux.lsmod.Lsmod | 0.059 s | 9.58 s | x162 |
linux.malware.check_idt.Check_idt | 0.11 s | 15.2 s | x138 |
linux.check_idt.Check_idt | 0.115 s | 15.1 s | x131 |
linux.tty_check.tty_check | 0.114 s | 14.3 s | x125 |
linux.malware.tty_check.Tty_Check | 0.129 s | 15.0 s | x116 |
linux.malware.check_modules.Check_modules | 0.055 s | 5.74 s | x104 |
linux.kallsyms.Kallsyms | 0.278 s | 28.9 s | x104 |
linux.capabilities.Capabilities | 0.056 s | 5.82 s | x104 |
هذه الفروق متعمدة، ولن تتغير: