Skip to content

Commit 23401c0

Browse files
authored
Changes to AppCompatCache parser (#5025)
1 parent 95c3d48 commit 23401c0

3 files changed

Lines changed: 86 additions & 8 deletions

File tree

plaso/data/timeliner.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,8 @@ attribute_mappings:
14791479
description: 'File Last Modification Time'
14801480
- name: 'last_update_time'
14811481
description: 'Last Time Executed'
1482+
- name: 'registry_last_written_time'
1483+
description: 'Registry Last Written Time'
14821484
place_holder_event: true
14831485
---
14841486
data_type: 'windows:registry:bagmru'

plaso/parsers/winreg_plugins/appcompatcache.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ class AppCompatCacheEventData(events.EventData):
2727
offset (int): offset of the Application Compatibility Cache entry relative
2828
to the start of the Windows Registry value data, from which the event
2929
data was extracted.
30+
registry_last_written_time (dfdatetime.DateTimeValues): key last written
31+
date and time.
3032
path (str): full path to the executable.
33+
insertion_flags (int): Execution flag.
34+
control_set (int): Control set number of AppCompatCache registry key.
3135
"""
3236

3337
DATA_TYPE = 'windows:registry:appcompatcache'
@@ -39,8 +43,11 @@ def __init__(self):
3943
self.file_entry_modification_time = None
4044
self.key_path = None
4145
self.last_update_time = None
46+
self.registry_last_written_time = None
4247
self.offset = None
4348
self.path = None
49+
self.insertion_flags = None
50+
self.control_set = None
4451

4552

4653
class AppCompatCacheHeader(object):
@@ -649,6 +656,8 @@ def ExtractEvents(self, parser_mediator, registry_key, **kwargs):
649656
if not self._cached_entry_data_type_map:
650657
raise errors.ParseError('Unable to determine cached entry data type.')
651658

659+
control_set = self._ExtractControlSet(registry_key.path)
660+
652661
parse_cached_entry_function = None
653662
if format_type == self._FORMAT_TYPE_XP:
654663
parse_cached_entry_function = self._ParseCachedEntryXP
@@ -673,6 +682,8 @@ def ExtractEvents(self, parser_mediator, registry_key, **kwargs):
673682
event_data.key_path = registry_key.path
674683
event_data.offset = cached_entry_offset
675684
event_data.path = cached_entry_object.path
685+
event_data.control_set = control_set
686+
event_data.registry_last_written_time = registry_key.last_written_time
676687

677688
if cached_entry_object.last_modification_time:
678689
event_data.file_entry_modification_time = dfdatetime_filetime.Filetime(
@@ -682,6 +693,9 @@ def ExtractEvents(self, parser_mediator, registry_key, **kwargs):
682693
event_data.last_update_time = dfdatetime_filetime.Filetime(
683694
timestamp=cached_entry_object.last_update_time)
684695

696+
if cached_entry_object.insertion_flags is not None:
697+
event_data.insertion_flags = cached_entry_object.insertion_flags
698+
685699
parser_mediator.ProduceEventData(event_data)
686700

687701
cached_entry_offset += cached_entry_object.cached_entry_size
@@ -691,6 +705,24 @@ def ExtractEvents(self, parser_mediator, registry_key, **kwargs):
691705
cached_entry_index >= header_object.number_of_cached_entries):
692706
break
693707

708+
def _ExtractControlSet(self, path):
709+
"""Extract control set number from key path.
710+
711+
Args:
712+
path (str): Path
713+
714+
Returns:
715+
Optional[int]: Control set number.
716+
"""
717+
parts = path.split('\\')
718+
for part in parts:
719+
if part.upper().startswith('CONTROLSET'):
720+
try:
721+
return int(part[10:], 10)
722+
except ValueError:
723+
pass
724+
return None
725+
694726

695727
winreg_parser.WinRegistryParser.RegisterPlugin(
696728
AppCompatCacheWindowsRegistryPlugin)

tests/parsers/winreg_plugins/appcompatcache.py

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,17 @@ def testFilters(self):
252252
self._AssertFiltersOnKeyPath(plugin, 'HKEY_LOCAL_MACHINE\\System', (
253253
'CurrentControlSet\\Control\\Session Manager\\AppCompatCache'))
254254

255+
self._AssertFiltersOnKeyPath(
256+
plugin,
257+
'HKEY_LOCAL_MACHINE\\System',
258+
'ControlSet001\\Control\\Session Manager\\AppCompatCache',
259+
)
260+
self._AssertFiltersOnKeyPath(
261+
plugin,
262+
'HKEY_LOCAL_MACHINE\\System',
263+
'ControlSet47\\Control\\Session Manager\\AppCompatCache',
264+
)
265+
255266
self._AssertNotFiltersOnKeyPath(
256267
plugin, 'HKEY_LOCAL_MACHINE\\System', 'Bogus')
257268

@@ -286,7 +297,11 @@ def testProcessWindowsXP(self):
286297
'file_entry_modification_time': '2004-08-04T14:00:00.0000000+00:00',
287298
'key_path': expected_key_path,
288299
'last_update_time': '2009-09-20T11:59:16.3281250+00:00',
289-
'path': '\\??\\C:\\WINDOWS\\system32\\hticons.dll'}
300+
'registry_last_written_time': '2015-06-15T11:53:37.0430610+00:00',
301+
'path': '\\??\\C:\\WINDOWS\\system32\\hticons.dll',
302+
'insertion_flags': None,
303+
'control_set': 1,
304+
}
290305

291306
event_data = storage_writer.GetAttributeContainerByIndex('event_data', 0)
292307
self.CheckEventData(event_data, expected_event_values)
@@ -322,8 +337,13 @@ def testProcessWindows2003(self):
322337
'file_entry_modification_time': '2003-03-24T20:32:18.0000000+00:00',
323338
'key_path': expected_key_path,
324339
'last_update_time': None,
340+
'registry_last_written_time': '2015-06-15T11:53:37.0430610+00:00',
325341
'path': (
326-
'\\??\\C:\\WINDOWS\\Microsoft.NET\\Framework\\v1.1.4322\\ngen.exe')}
342+
'\\??\\C:\\WINDOWS\\Microsoft.NET\\Framework\\v1.1.4322\\ngen.exe'
343+
),
344+
'insertion_flags': None,
345+
'control_set': 1,
346+
}
327347

328348
event_data = storage_writer.GetAttributeContainerByIndex('event_data', 0)
329349
self.CheckEventData(event_data, expected_event_values)
@@ -361,7 +381,11 @@ def testProcessWindowsVista(self):
361381
'file_entry_modification_time': '2006-11-02T12:35:24.7041218+00:00',
362382
'key_path': expected_key_path,
363383
'last_update_time': None,
364-
'path': '\\??\\C:\\Windows\\SYSTEM32\\WISPTIS.EXE'}
384+
'registry_last_written_time': '2015-06-15T11:53:37.0430610+00:00',
385+
'path': '\\??\\C:\\Windows\\SYSTEM32\\WISPTIS.EXE',
386+
'insertion_flags': None,
387+
'control_set': 1,
388+
}
365389

366390
event_data = storage_writer.GetAttributeContainerByIndex('event_data', 0)
367391
self.CheckEventData(event_data, expected_event_values)
@@ -399,7 +423,11 @@ def testProcessWindows7(self):
399423
'file_entry_modification_time': '2012-04-04T01:46:37.9329644+00:00',
400424
'key_path': key_path,
401425
'last_update_time': None,
402-
'path': '\\??\\C:\\Windows\\PSEXESVC.EXE'}
426+
'registry_last_written_time': '2012-04-04T01:58:40.7767499+00:00',
427+
'path': '\\??\\C:\\Windows\\PSEXESVC.EXE',
428+
'insertion_flags': 7,
429+
'control_set': 1,
430+
}
403431

404432
event_data = storage_writer.GetAttributeContainerByIndex('event_data', 9)
405433
self.CheckEventData(event_data, expected_event_values)
@@ -437,7 +465,11 @@ def testProcessWindows8_0(self):
437465
'file_entry_modification_time': '2012-02-18T05:18:23.9350000+00:00',
438466
'key_path': expected_key_path,
439467
'last_update_time': None,
440-
'path': 'SYSVOL\\Windows\\System32\\wbem\\WmiPrvSE.exe'}
468+
'registry_last_written_time': '2015-06-15T11:53:37.0430610+00:00',
469+
'path': 'SYSVOL\\Windows\\System32\\wbem\\WmiPrvSE.exe',
470+
'insertion_flags': 67,
471+
'control_set': 1,
472+
}
441473

442474
event_data = storage_writer.GetAttributeContainerByIndex('event_data', 0)
443475
self.CheckEventData(event_data, expected_event_values)
@@ -473,7 +505,11 @@ def testProcessWindows8_1(self):
473505
'file_entry_modification_time': '2013-08-22T12:35:25.3750709+00:00',
474506
'key_path': expected_key_path,
475507
'last_update_time': None,
476-
'path': 'SYSVOL\\Windows\\System32\\dllhost.exe'}
508+
'registry_last_written_time': '2015-06-15T11:53:37.0430610+00:00',
509+
'path': 'SYSVOL\\Windows\\System32\\dllhost.exe',
510+
'insertion_flags': 8323072,
511+
'control_set': 1,
512+
}
477513

478514
event_data = storage_writer.GetAttributeContainerByIndex('event_data', 0)
479515
self.CheckEventData(event_data, expected_event_values)
@@ -509,7 +545,11 @@ def testProcessWindows10(self):
509545
'file_entry_modification_time': '2014-09-22T06:42:39.0000000+00:00',
510546
'key_path': expected_key_path,
511547
'last_update_time': None,
512-
'path': 'C:\\Windows\\system32\\MpSigStub.exe'}
548+
'registry_last_written_time': '2015-06-15T11:53:37.0430610+00:00',
549+
'path': 'C:\\Windows\\system32\\MpSigStub.exe',
550+
'insertion_flags': None,
551+
'control_set': 1,
552+
}
513553

514554
event_data = storage_writer.GetAttributeContainerByIndex('event_data', 0)
515555
self.CheckEventData(event_data, expected_event_values)
@@ -545,9 +585,13 @@ def testProcessWindows10Creator(self):
545585
'file_entry_modification_time': '2017-03-16T22:56:01.2487145+00:00',
546586
'key_path': expected_key_path,
547587
'last_update_time': None,
588+
'registry_last_written_time': '2015-06-15T11:53:37.0430610+00:00',
548589
'path': (
549590
'C:\\Program Files (x86)\\NVIDIA Corporation\\3D Vision\\'
550-
'nvstreg.exe')}
591+
'nvstreg.exe'
592+
),
593+
'insertion_flags': None,
594+
}
551595

552596
event_data = storage_writer.GetAttributeContainerByIndex('event_data', 0)
553597
self.CheckEventData(event_data, expected_event_values)

0 commit comments

Comments
 (0)