From ac95d1f481b65e99dc77f0b250bfaf0ecfd4cf79 Mon Sep 17 00:00:00 2001 From: Mike Auty Date: Mon, 2 Nov 2020 00:04:30 +0000 Subject: [PATCH] Renderers: Allow bytes in JSON output Fixes #367 --- volatility/cli/text_renderer.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/volatility/cli/text_renderer.py b/volatility/cli/text_renderer.py index 098e21d59..828d4f773 100644 --- a/volatility/cli/text_renderer.py +++ b/volatility/cli/text_renderer.py @@ -1,7 +1,6 @@ # This file is Copyright 2019 Volatility Foundation and licensed under the Volatility Software License 1.0 # which is available at https://www.volatilityfoundation.org/license/vsl-v1.0 # - import datetime import json import logging @@ -69,7 +68,6 @@ def multitypedata_as_text(value: format_hints.MultiTypeData) -> str: def optional(func): - @wraps(func) def wrapped(x: Any) -> str: if isinstance(x, interfaces.renderers.BaseAbsentValue): @@ -83,7 +81,6 @@ def optional(func): def quoted_optional(func): - @wraps(func) def wrapped(x: Any) -> str: result = optional(func)(x) @@ -266,7 +263,8 @@ class PrettyTextRenderer(CLIRenderer): max_column_widths = dict([(column.name, len(column.name)) for column in grid.columns]) def visitor( - node: interfaces.renderers.TreeNode, accumulator: List[Tuple[int, Dict[interfaces.renderers.Column, bytes]]] + node: interfaces.renderers.TreeNode, + accumulator: List[Tuple[int, Dict[interfaces.renderers.Column, bytes]]] ) -> List[Tuple[int, Dict[interfaces.renderers.Column, bytes]]]: # Nodes always have a path value, giving them a path_depth of at least 1, we use max just in case max_column_widths[tree_indent_column] = max(max_column_widths.get(tree_indent_column, 0), node.path_depth) @@ -306,6 +304,7 @@ class JsonRenderer(CLIRenderer): _type_renderers = { format_hints.HexBytes: quoted_optional(hex_bytes_as_text), interfaces.renderers.Disassembly: quoted_optional(display_disassembly), + bytes: optional(lambda x: " ".join(["{0:02x}".format(b) for b in x])), datetime.datetime: lambda x: x.isoformat() if not isinstance(x, interfaces.renderers.BaseAbsentValue) else None, 'default': lambda x: x } @@ -328,7 +327,7 @@ class JsonRenderer(CLIRenderer): {}, []) # type: Tuple[Dict[str, List[interfaces.renderers.TreeNode]], List[interfaces.renderers.TreeNode]] def visitor( - node: interfaces.renderers.TreeNode, accumulator: Tuple[Dict[str, Dict[str, Any]], List[Dict[str, Any]]] + node: interfaces.renderers.TreeNode, accumulator: Tuple[Dict[str, Dict[str, Any]], List[Dict[str, Any]]] ) -> Tuple[Dict[str, Dict[str, Any]], List[Dict[str, Any]]]: # Nodes always have a path value, giving them a path_depth of at least 1, we use max just in case acc_map, final_tree = accumulator