
विंडोज XML इवेंट लॉग (EVTX) प्रारूप के लिए एक तेज़ (और सुरक्षित) पार्सर
Windows XML EventLog प्रारूप के लिए एक क्रॉस-प्लेटफ़ॉर्म पार्सर

क्या आप शून्य-इंस्टॉल विकल्प पसंद करते हैं? एक पूर्ण-सुविधा संपन्न EVTX एक्सप्लोरर सीधे आपके ब्राउज़र में चलता है, जो उसी Rust कोर द्वारा संचालित है जो WebAssembly में संकलित है।
👉 अभी आज़माएं: https://omerbenamram.github.io/evtx/
सब कुछ स्थानीय रूप से होता है – फ़ाइलें कभी आपकी मशीन नहीं छोड़तीं। मुख्य विशेषताएं:
.evtx फ़ाइलें (या ब्राउज़ करने के लिए क्लिक करें) – बहुत बड़े लॉग को भी संभालता है!EventData फ़ील्ड पर फ़ैक्टेड फ़िल्टर – सभी DuckDB-WASM द्वारा समर्थितदर्शक GitHub Pages से स्थिर रूप से परोसा जाता है; पहले लोड के बाद यह पूरी तरह से ऑफ़लाइन काम करता है।
cargo install evtx का उपयोग करके स्रोतों से निर्माण करेंevtx_dump (बाइनरी उपयोगिता):इस crate के साथ प्रदान की गई मुख्य बाइनरी उपयोगिता 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 - stdin से EVTX फ़ाइल पढ़ेगा (पाइपिंग/डीकंप्रेसन के लिए उपयोगी)।evtx_dump को फ़ाइलों के सुविधाजनक बैच प्रोसेसिंग के लिए fd के साथ जोड़ा जा सकता है:
fd -e evtx -x evtx_dump -o jsonl एक फ़ोल्डर को स्कैन करेगा और सभी evtx फ़ाइलों को एक एकल jsonlines फ़ाइल में डंप करेगा।fd -e evtx -x evtx_dump '{}' -f '{.}.xml' फ़ोल्डर में सभी फ़ाइलों के लिए प्रत्येक evtx फ़ाइल के बगल में एक xml फ़ाइल बनाएगा!xargs (या मैक पर gxargs) और 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 देखें (मुद्दा #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 (सांख्यिकीय माप उपकरण) का उपयोग करके बेंच किया गया था।
मैं 12-कोर AMD Ryzen 3900X पर परीक्षण चला रहा हूं।
बेंच रन: जून 2026 (evtx 0.12.2)।
सिस्टम: Arch Linux (Linux 7.0.11-arch1-1 x86_64)।
बेंचमार्क कमिट: 99a6def।
evtx कॉलम — और pyevtx-rs, हमारे अपने Python बाइंडिंग, जो उसी Rust कोर को लपेटते हैं — को जून 2026 में इसी मशीन पर, संकलित-टेम्पलेट पुनर्लेखन के आने के बाद (देखें docs/compiled-templates.html) पुनः मापा गया। दोनों PGO बिल्ड हैं जो Linux/macOS के लिए भेजे जाते हैं (रिलीज़ बाइनरी और PyPI व्हील; विवरण नीचे)। pyevtx-rs प्रति-रिकॉर्ड Python मार्शलिंग (प्रति रिकॉर्ड एक dict) द्वारा सीमित है, पार्सर द्वारा नहीं, इसलिए यह पूर्ण कोर गति नहीं देखता है। शेष प्रतियोगी आंकड़े (libevtx, velocidex/evtx, golang-evtx, python-evtx) उसी हार्डवेयर पर जनवरी 2026 के रन से अपरिवर्तित लिए गए हैं — बाहरी उपकरण जिनका प्रदर्शन नहीं बदला है।
बेंच की गई लाइब्रेरी:
python-evtx(https://github.com/williballenthin/python-evtx) - CPython और PyPy के साथpyevtx-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 xml लॉग डंप करते समय python-evtx से 7000x से अधिक तेज़ है।
थ्रूपुट अब इस 30MB नमूने पर लगभग 8 थ्रेड पर संतृप्त हो जाता है: सिंगल-थ्रेडेड पार्सिंग इतनी तेज़ हो गई है (उसी मशीन पर जनवरी 2026 की संख्याओं की तुलना में ~3.8x तेज़) कि 30MB में अब सभी 24 लॉजिकल कोर को व्यस्त रखने के लिए पर्याप्त काम नहीं है — 24 थ्रेड 8 से तेज़ नहीं है (दोनों माप शोर के भीतर हैं, इसलिए तालिका संतृप्ति बिंदु के रूप में 8-थ्रेड कॉलम को हाइलाइट करती है)। उस बिंदु पर evtx golang-evtx से लगभग 65x तेज़ है, जो समान मल्टीथ्रेडिंग रणनीति का उपयोग करता है।
उपरोक्त संख्याएं प्रोफ़ाइल-निर्देशित बिल्ड (./build_pgo.sh) से आती हैं: यह नमूना कोष पर एक इंस्ट्रूमेंटेड बाइनरी को प्रशिक्षित करती है, फिर उस प्रोफ़ाइल के साथ पुनर्निर्माण करती है। CI लिनक्स (x86_64) और macOS रिलीज़ बाइनरी के लिए इसे चलाता है, इसलिए तालिका उस आर्टिफैक्ट को दर्शाती है जिसे अधिकांश लोग डाउनलोड करते हैं (आउटपुट सामान्य बिल्ड के समान बाइट-आइडेंटिकल है)। PGO एक सादे cargo build --release --features fast-alloc पर लगभग 2–5% सिंगल-थ्रेडेड थ्रूपुट के लायक है (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 |