1919# Version v0.1.1
2020import Evtx .Evtx as evtx
2121import Evtx .Views as e_views
22+ import os
23+ import xmltodict
24+ from typing import Dict
2225
2326
2427def main ():
@@ -28,14 +31,45 @@ def main():
2831 description = "Dump a binary EVTX file into XML." )
2932 parser .add_argument ("evtx" , type = str ,
3033 help = "Path to the Windows EVTX event log file" )
34+ parser .add_argument ("-o" ,"--output" ,type = str ,help = "Path to the output file" )
3135 args = parser .parse_args ()
3236
3337 with evtx .Evtx (args .evtx ) as log :
34- print (e_views .XML_HEADER )
35- print ("<Events>" )
36- for record in log .records ():
37- print (record .xml ())
38- print ("</Events>" )
38+
39+ if (args .output ):
40+ if (os .path .splitext (args .output )[1 ]== ".json" ):
41+ for record in log .records ():
42+ data_dict = xmltodict .parse (record .xml ()) #convert the xml to a dictionary
43+ '''
44+ for event_system_key,event_system_value in data_dict['Event']['System'].items(): #loop through each key and value pair
45+ if isinstance(data_dict['Event']['System'][str(event_system_key)],Dict): #if the dictionary is nested, enter the dictionary
46+ sublist=[]
47+ for event_system_subkey,event_system_subvalue in data_dict['Event']['System'][str(event_system_key)].items(): #loop through the nested dictionary
48+ print(event_system_key+"_"+event_system_subkey[1:] + ":" + str(event_system_subvalue))
49+ else:
50+ print(event_system_key + ":" + str(event_system_value))
51+ '''
52+ for event_system_key , event_system_value in data_dict ['Event' ]['System' ].items (): # loop through each key and value pair
53+ if (event_system_key == "EventRecordID" ):
54+ json_subline = {}
55+ firstline = {event_system_key :event_system_value }
56+ json_subline .update (firstline )
57+ for event_data_key , event_data_value in data_dict ['Event' ]['EventData' ].items (): # loop through each key and value pair
58+ for values in event_data_value :
59+ for event_data_subkey ,event_data_subvalue in values .items ():
60+ if event_data_subkey == "@Name" :
61+ data_name = event_data_subvalue
62+ else :
63+ data_value = event_data_subvalue
64+ json_subline .update ({data_name :data_value })
65+ else :
66+ print ("Invalid File Type" )
67+ else :
68+ print (e_views .XML_HEADER )
69+ print ("<Events>" )
70+ for record in log .records ():
71+ print (record .xml ())
72+ print ("</Events>" )
3973
4074
4175if __name__ == "__main__" :
0 commit comments