
محلل سريع (وآمن) لتنسيق سجل أحداث XML لويندوز (EVTX)
محلل عبر المنصات لصيغة سجل أحداث Windows XML

هل تفضل خيارًا بدون تثبيت؟ مستكشف EVTX كامل الميزات يعمل مباشرة في متصفحك، مدعومًا بنفس نواة Rust المترجمة إلى WebAssembly.
👉 جربه الآن: https://omerbenamram.github.io/evtx/
كل شيء يحدث محليًا – الملفات لا تغادر جهازك أبدًا. أبرز الميزات:
.evtx (أو النقر للتصفح) – يتعامل مع سجلات كبيرة جدًا!EventData الديناميكية – جميعها مدعومة بـ DuckDB-WASMيتم تقديم العارض بشكل ثابت من GitHub Pages؛ بعد التحميل الأول يعمل بالكامل دون اتصال.
cargo install evtxevtx_dump (أداة ثنائية):الأداة الثنائية الرئيسية المقدمة مع هذه الحزمة هي evtx_dump، وتوفر وسيلة سريعة لتحويل ملفات .evtx إلى صيغ إخراج مختلفة.
بعض الأمثلة:
evtx_dump <evtx_file> يفرغ محتويات سجلات evtx بتنسيق XML.evtx_dump -o json <evtx_file> يفرغ محتويات سجلات evtx بتنسيق JSON.evtx_dump -f <output_file> -o json <input_file> يفرغ محتويات سجلات evtx بتنسيق JSON إلى ملف معين.cat <evtx_file> | evtx_dump -o jsonl - يقرأ ملف EVTX من الإدخال القياسي (مفيد للأنابيب/فك الضغط).يمكن دمج evtx_dump مع fd لمعالجة دفعية مريحة للملفات:
fd -e evtx -x evtx_dump -o jsonl سيقوم بمسح مجلد وتفريغ جميع ملفات evtx إلى ملف واحد بتنسيق jsonlines.fd -e evtx -x evtx_dump '{}' -f '{.}.xml' سينشئ ملف xml بجوار كل ملف evtx، لجميع الملفات في المجلد بشكل متكرر!xargs (أو gxargs على mac) و jq: fd -a -e evtx | xargs -I input sh -c "evtx_dump -o jsonl input | jq --arg path "input" '. + {path: \$path}'"ملاحظة: بشكل افتراضي، سيحاول evtx_dump استخدام تعدد الخيوط، مما يعني أن السجلات قد تُعاد خارج الترتيب.
لفرض الاستخدام أحادي الخيط (والذي سيضمن الترتيب أيضًا)، يمكن تمرير -t 1.
يمكن لسجلات EVTX أن تشير إلى تعريفات القوالب المخزنة في ملفات ثنائية للمزود (EXE/DLL/SYS). يستطيع evtx_dump استخراج تلك القوالب إلى ذاكرة تخزين مؤقتة غير متصلة واستخدامها وقت العرض.
ملاحظة: تتطلب هذه الوظيفة بناء evtx_dump مع ميزة Cargo wevt_templates (قد تتضمنها الإصدارات الثنائية بالفعل).
.wevtcache محمول واحد):
evtx_dump extract-wevt-templates --input <provider.dll> --output /tmp/wevt_cache.wevtcache --overwriteevtx_dump --wevt-cache /tmp/wevt_cache.wevtcache <log.evtx>أدوات المساعدة في التصحيح:
TemplateInstance لسجل (JSONL):
evtx_dump dump-template-instances --input <log.evtx> --record-id <ID> | head -n1evtx_dump apply-wevt-cache --cache /tmp/wevt_cache.wevtcache --template-guid <GUID> --evtx <log.evtx> --record-id <ID>انظر docs/wevt_templates.md للتفاصيل والخلفية (issue #103).
use evtx::EvtxParser;
use std::path::PathBuf;
// Change this to a path of your .evtx sample.
let fp = PathBuf::from(format!("{}/samples/security.evtx", std::env::var("CARGO_MANIFEST_DIR").unwrap()));
let mut parser = EvtxParser::from_path(fp).unwrap();
for record in parser.records() {
match record {
Ok(r) => println!("Record {}\n{}", r.event_record_id, r.data),
Err(e) => eprintln!("{}", e),
}
}
يتم تمكين الإصدار المتوازي عند التجميع مع ميزة "multithreading" (ممكّنة افتراضيًا).
عند استخدام تعدد الخيوط - يكون evtx أسرع بشكل ملحوظ من أي محلل آخر متاح. بالنسبة لأداء النواة الواحدة، فهو الأسرع والمحلل الوحيد عبر المنصات الذي يدعم مخرجات XML و JSON.
تم قياس الأداء على جهازي باستخدام hyperfine (أداة قياس إحصائية).
أجري الاختبارات على معالج AMD Ryzen 3900X ذو 12 نواة.
تشغيل القياس: يونيو 2026 (evtx 0.12.2).
النظام: Arch Linux (Linux 7.0.11-arch1-1 x86_64).
Commit القياس: 99a6def.
تم إعادة قياس أعمدة evtx — و pyevtx-rs، روابط Python الخاصة بنا، والتي تغلف نفس نواة Rust — في يونيو 2026 على نفس الجهاز، بعد تنفيذ إعادة كتابة القوالب المترجمة (انظر docs/compiled-templates.html). كلاهما هما بنيات PGO التي تُشحن لنظامي Linux/macOS (الملف الثنائي للإصدار وعجلة PyPI؛ التفاصيل أدناه). pyevtx-rs مقيد بـ Python marshaling لكل سجل (قاموس واحد لكل سجل) وليس بالمحلل، لذلك لا يرى تسريع النواة الكامل. أرقام المنافسين المتبقية (libevtx، velocidex/evtx، golang-evtx، python-evtx) منقولة بدون تغيير من تشغيل يناير 2026 على نفس الجهاز — أدوات خارجية لم يتغير أداؤها.
المكتبات التي تم قياسها:
python-evtx(https://github.com/williballenthin/python-evtx) - مع CPython و PyPypyevtx-rs(https://github.com/omerbenamram/pyevtx-rs) / evtx(https://pypi.org/project/evtx/) - روابط Python لهذه المكتبةlibevtx(https://github.com/libyal/libevtx)golang-evtx(https://github.com/0xrawsec/golang-evtx.git) - JSON فقط (يستخدم تعدد الخيوط)evtx(https://github.com/Velocidex/evtx) - JSON فقط.evtx (هذه المكتبة)ملاحظة: الأرقام المعروضة هي قياسات real-time (الوقت الذي يستغرقه الاستدعاء حتى الاكتمال). قياسات user-time تكون أعلى عند استخدام تعدد الخيوط/المعالجات المتعددة، بسبب حمل المزامنة.
مع 8 خيوط - يكون evtx أسرع بأكثر من 7000x من python-evtx عند تفريغ سجلات xml.
يصل الإنتاج الآن إلى التشبع عند حوالي 8 خيوط على هذه العينة بحجم 30MB: أصبح التحليل أحادي الخيط سريعًا بما يكفي (حوالي 3.8x أسرع من أرقام يناير 2026، على نفس الجهاز) بحيث لم يعد 30MB يحمل ما يكفي من العمل لإبقاء جميع النوى المنطقية الـ 24 مشغولة — 24 خيطًا ليس أسرع من 8 (كلاهما ضمن ضوضاء القياس، لذا يسلط الجدول الضوء على العمود 8 خيوط كنقطة تشبع). عند تلك النقطة، يكون evtx أسرع بحوالي 65x من golang-evtx، والذي يستخدم استراتيجية تعدد خيوط مماثلة.
الأرقام أعلاه تأتي من بناء موجه بالملف الشخصي (./build_pgo.sh): يقوم بتدريب ثنائي مزود بأدوات القياس على مجموعة العينات، ثم يعيد البناء بهذا الملف الشخصي. تقوم CI بتشغيل هذا لثنائيات إصدار Linux (x86_64) و macOS، لذا يعكس الجدول الأداة التي ينزلها معظم الناس (الإخراج مطابق بايت لبناء عادي). يبلغ تحسين PGO حوالي 2–5% من الإنتاجية أحادية الخيط مقارنة بـ cargo build --release --features fast-alloc العادي (JSON 77.6 → 75 ms، XML 73.0 → 71 ms)؛ عند 8+ خيوط، يكون عبء العمل مقيدًا بالتشبع، لذا فإن PGO هناك ضمن ضوضاء القياس.
إذا حدث خطأ في المحلل على أي من هذه العقد، فلا تتردد في فتح مشكلة أو إرسال بريد إلكتروني مع عينة.
مرخص تحت أحد الخيارين التاليين
حسب اختيارك.
ما لم تذكر صراحةً خلاف ذلك، فإن أي مساهمة تقدمها عمدًا لإدراجها في العمل، كما هو محدد في ترخيص Apache-2.0، ستكون مرخصة بشكل مزدوج كما هو مذكور أعلاه، دون أي شروط أو أحكام إضافية.
| evtx (1 thread) | evtx (8 threads) | evtx (24 threads) | libevtx (C) | velocidex/evtx (go) | golang-evtx (uses multiprocessing) | pyevtx-rs (CPython 3.14.5) | python-evtx (CPython 3.13.11) | python-evtx (PyPy 7.3.19) |
|---|
| 30MB evtx (XML) | 71.6 ms ± 1.8 ms | 20.7 ms ± 1.0 ms | 22.1 ms ± 1.7 ms | 2.439 s ± 0.035 s | No support | No support | 204.6 ms ± 5.7 ms | 2m41.075s (ran once) | 40.096s (ran once) |
| 30MB evtx (JSON) | 75.1 ms ± 2.1 ms | 20.5 ms ± 0.8 ms | 20.1 ms ± 0.9 ms | No support | 5.467 s ± 0.038 s | 1.344 s ± 0.005 s | 223.1 ms ± 4.7 ms | No support | No support |