Skip to content

Commit 49d1496

Browse files
author
Willi Ballenthin
authored
Merge pull request #31 from scherma/master
Date filtering module
2 parents 8c0a396 + e6559aa commit 49d1496

1 file changed

Lines changed: 63 additions & 0 deletions

File tree

scripts/evtx_dates.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#!/usr/bin/env python
2+
3+
from lxml import etree
4+
from datetime import datetime
5+
6+
from Evtx.Evtx import Evtx
7+
from Evtx.Views import evtx_file_xml_view
8+
9+
def get_child(node, tag, ns="{http://schemas.microsoft.com/win/2004/08/events/event}"):
10+
return node.find("%s%s" % (ns, tag))
11+
12+
def to_lxml(record_xml):
13+
return etree.fromstring("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>%s" % record_xml.encode('utf-8'))
14+
15+
def xml_records(filename):
16+
with Evtx(filename) as evtx:
17+
for xml, record in evtx_file_xml_view(evtx.get_file_header()):
18+
try:
19+
yield to_lxml(xml), None
20+
except etree.XMLSyntaxError as e:
21+
yield xml, e
22+
23+
def parsed_date(dstr):
24+
ts = None
25+
try:
26+
ts = datetime.strptime(dstr, '%Y-%m-%d %H:%M:%S')
27+
except ValueError:
28+
ts = datetime.strptime(dstr, '%Y-%m-%d %H:%M:%S.%f')
29+
return ts
30+
31+
def event_in_daterange(d, start, end):
32+
is_in_range = True
33+
if d < start:
34+
is_in_range = False
35+
if d > end:
36+
is_in_range = False
37+
return is_in_range
38+
39+
def matching_records(evtfile, sdatetime, edatetime):
40+
for node, err in xml_records(evtfile):
41+
if err is not None:
42+
continue
43+
else:
44+
sys = get_child(node, "System")
45+
t = parsed_date(get_child(sys, "TimeCreated").get("SystemTime"))
46+
if event_in_daterange(t, sdatetime, edatetime):
47+
yield node
48+
49+
def main():
50+
import argparse
51+
parser = argparse.ArgumentParser()
52+
parser.add_argument("evtfile", type=str)
53+
parser.add_argument("start", type=parsed_date, help="Start date/time YYYY-mm-dd HH:MM:SS(.f)")
54+
parser.add_argument("-e", dest="end", type=parsed_date, help="End date/time YYYY-mm-dd HH:MM:SS(.f)",
55+
default=datetime.now())
56+
args = parser.parse_args()
57+
58+
for record in matching_records(args.evtfile, args.start, args.end):
59+
print(etree.tostring(record, pretty_print=True))
60+
61+
62+
if __name__ == "__main__":
63+
main()

0 commit comments

Comments
 (0)