forked from volatilityfoundation/volatility3
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request volatilityfoundation#1149 from volatilityfoundatio…
…n/getcellroutine Add a new getcellroutine plugin that reports hooked GetCellRoutine ha…
- Loading branch information
Showing
1 changed file
with
98 additions
and
0 deletions.
There are no files selected for viewing
98 changes: 98 additions & 0 deletions
98
volatility3/framework/plugins/windows/registry/getcellroutine.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
# This file is Copyright 2024 Volatility Foundation and licensed under the Volatility Software License 1.0 | ||
# which is available at https://www.volatilityfoundation.org/license/vsl-v1.0 | ||
# | ||
|
||
import logging | ||
from typing import List | ||
|
||
from volatility3.framework import constants, exceptions, interfaces, renderers | ||
from volatility3.framework.configuration import requirements | ||
from volatility3.framework.renderers import format_hints | ||
from volatility3.plugins.windows import ssdt | ||
from volatility3.plugins.windows.registry import hivelist | ||
|
||
vollog = logging.getLogger(__name__) | ||
|
||
|
||
class GetCellRoutine(interfaces.plugins.PluginInterface): | ||
"""Reports registry hives with a hooked GetCellRoutine handler""" | ||
|
||
_required_framework_version = (2, 0, 0) | ||
|
||
@classmethod | ||
def get_requirements(cls) -> List[interfaces.configuration.RequirementInterface]: | ||
return [ | ||
requirements.ModuleRequirement( | ||
name="kernel", | ||
description="Windows kernel", | ||
architectures=["Intel32", "Intel64"], | ||
), | ||
requirements.PluginRequirement( | ||
name="hivelist", plugin=hivelist.HiveList, version=(1, 0, 0) | ||
), | ||
requirements.PluginRequirement( | ||
name="ssdt", plugin=ssdt.SSDT, version=(1, 0, 0) | ||
), | ||
] | ||
|
||
def _generator(self): | ||
kernel = self.context.modules[self.config["kernel"]] | ||
|
||
collection = ssdt.SSDT.build_module_collection( | ||
self.context, kernel.layer_name, kernel.symbol_table_name | ||
) | ||
|
||
# walk each hive and validate that the GetCellRoutine handler | ||
# is inside of the kernel (ntoskrnl) | ||
for hive_object in hivelist.HiveList.list_hives( | ||
context=self.context, | ||
base_config_path=self.config_path, | ||
layer_name=kernel.layer_name, | ||
symbol_table=kernel.symbol_table_name, | ||
): | ||
hive = hive_object.hive | ||
|
||
try: | ||
cellroutine = hive.GetCellRoutine | ||
except exceptions.InvalidAddressException: | ||
continue | ||
|
||
module_symbols = list( | ||
collection.get_module_symbols_by_absolute_location(cellroutine) | ||
) | ||
|
||
if module_symbols: | ||
for module_name, _ in module_symbols: | ||
# GetCellRoutine handlers should only be in the kernel | ||
if module_name not in constants.windows.KERNEL_MODULE_NAMES: | ||
yield ( | ||
0, | ||
( | ||
format_hints.Hex(hive.vol.offset), | ||
hive_object.get_name() or "", | ||
module_name, | ||
format_hints.Hex(cellroutine), | ||
), | ||
) | ||
# Doesn't map to any module... | ||
else: | ||
yield ( | ||
0, | ||
( | ||
format_hints.Hex(hive.vol.offset), | ||
hive_object.get_name() or "", | ||
renderers.NotAvailableValue(), | ||
format_hints.Hex(cellroutine), | ||
), | ||
) | ||
|
||
def run(self): | ||
return renderers.TreeGrid( | ||
[ | ||
("Hive Offset", renderers.format_hints.Hex), | ||
("Hive Name", str), | ||
("GetCellRoutine Module", str), | ||
("GetCellRoutine Handler", renderers.format_hints.Hex), | ||
], | ||
self._generator(), | ||
) |