Source code for plaso.formatters.winevt
"""Windows EventLog custom event formatter helpers."""
import re
from plaso.formatters import interface
from plaso.formatters import logger
from plaso.formatters import manager
[docs]
class WindowsEventLogMessageFormatterHelper(interface.CustomEventFormatterHelper):
"""Windows EventLog message formatter helper."""
IDENTIFIER = "windows_eventlog_message"
# Specifiers that expand to a paramter place holder (e.g. %%1053)
_PARAMETER_REGEX = re.compile(r"(%%[1-9][0-9]*)")
[docs]
def __init__(self):
"""Initialized a indows EventLog message formatter helper."""
super().__init__()
self._winevt_resources_helper = None
def _FormatStringValue(self, provider_identifier, source_name, string_value):
"""Formats a (insertion) string value.
Args:
provider_identifier (str): EventLog provider identifier.
source_name (str): EventLog source, such as "Application Error".
string_value (str): string value.
Returns:
str: formatted string value.
"""
if string_value is None:
return ""
formatted_string_parts = []
for string_part in self._PARAMETER_REGEX.split(string_value):
if string_part.startswith("%%"):
try:
parameter_identifier = int(string_part[2:], 10)
parameter_string = self._winevt_resources_helper.GetParameterString(
provider_identifier,
source_name,
parameter_identifier,
)
if parameter_string:
string_part = parameter_string
except ValueError:
pass
formatted_string_parts.append(string_part)
return "".join(formatted_string_parts)
[docs]
def FormatEventValues(self, output_mediator, event_values):
"""Formats event values using the helper.
Args:
output_mediator (OutputMediator): output mediator.
event_values (dict[str, object]): event values.
"""
if not self._winevt_resources_helper:
self._winevt_resources_helper = output_mediator.GetWinevtResourcesHelper()
message_string = None
provider_identifier = event_values.get("provider_identifier")
source_name = event_values.get("source_name")
message_identifier = event_values.get("message_identifier")
event_version = event_values.get("event_version")
if (provider_identifier or source_name) and message_identifier:
message_string_template = self._winevt_resources_helper.GetMessageString(
provider_identifier, source_name, message_identifier, event_version
)
if message_string_template:
string_values = []
for string_value in event_values.get("strings", []):
string_value = self._FormatStringValue(
provider_identifier, source_name, string_value
)
string_values.append(string_value)
try:
message_string = message_string_template.format(*string_values)
except (IndexError, TypeError) as exception:
provider_identifier = provider_identifier or ""
strings = ", ".join(string_values)
logger.error(
f"Unable to format message: 0x{message_identifier:08x} of "
f"provider: {provider_identifier:s} template: "
f'"{message_string_template:s}" and strings: "{strings:s}" '
f"with error: {exception!s}"
)
# Unable to create the message string.
# TODO: consider returning the unformatted message string.
event_values["message_string"] = message_string
manager.FormattersManager.RegisterEventFormatterHelper(
WindowsEventLogMessageFormatterHelper
)