Skip to content

Commit e2fb96a

Browse files
committed
Fix up JSON rendering of hex bytes and LayerData
1 parent 9791ae5 commit e2fb96a

File tree

1 file changed

+44
-33
lines changed

1 file changed

+44
-33
lines changed

volatility3/cli/text_renderer.py

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -159,42 +159,12 @@ def __init__(self):
159159

160160
def render(
161161
data: Union[renderers.LayerData, interfaces.renderers.BaseAbsentValue],
162-
):
162+
) -> str:
163163
if isinstance(data, interfaces.renderers.BaseAbsentValue):
164164
# FIXME: Do something cleverer here
165165
return ""
166166

167-
context_byte_len = self.context_byte_len if not data.no_surrounding else 0
168-
169-
layer = data.context.layers[data.layer_name]
170-
# Map of the holes
171-
error_bytes = set()
172-
start_offset = data.offset - context_byte_len
173-
end_offset = data.offset + data.length + context_byte_len
174-
if isinstance(layer, interfaces.layers.TranslationLayerInterface):
175-
error_bytes = set()
176-
mapping = iter(layer.mapping(start_offset, end_offset, True))
177-
current_map = next(mapping)
178-
for i in range(start_offset, end_offset):
179-
# Run through the bytes, check if they're present
180-
offset, sublength, _, _, _ = current_map
181-
if i < offset:
182-
error_bytes.add(i - start_offset)
183-
if i > offset + sublength:
184-
try:
185-
current_map = next(mapping)
186-
except StopIteration:
187-
pass
188-
offset, sublength, _, _, _ = current_map
189-
if i > offset + sublength:
190-
error_bytes.add(i - start_offset)
191-
192-
# Padded data
193-
specific_data = data.context.layers[data.layer_name].read(
194-
start_offset,
195-
end_offset - start_offset,
196-
True,
197-
)
167+
specific_data, error_bytes = self.render_bytes(data)
198168

199169
printables = ""
200170
output = "\n"
@@ -224,6 +194,46 @@ def render(
224194
render_func = render
225195
return super().__init__(render_func)
226196

197+
def render_bytes(self, data: renderers.LayerData) -> tuple[bytes, set[int]]:
198+
"""Renders a valid LayerData into bytes (with context bytes)"""
199+
context_byte_len = self.context_byte_len if not data.no_surrounding else 0
200+
201+
layer = data.context.layers[data.layer_name]
202+
# Map of the holes
203+
error_bytes = set()
204+
start_offset = data.offset - context_byte_len
205+
end_offset = data.offset + data.length + context_byte_len
206+
if isinstance(layer, interfaces.layers.TranslationLayerInterface):
207+
error_bytes = set()
208+
mapping = iter(layer.mapping(start_offset, end_offset, True))
209+
current_map = next(mapping)
210+
for i in range(start_offset, end_offset):
211+
# Run through the bytes, check if they're present
212+
offset, sublength, _, _, _ = current_map
213+
if i < offset:
214+
error_bytes.add(i - start_offset)
215+
if i > offset + sublength:
216+
try:
217+
current_map = next(mapping)
218+
except StopIteration:
219+
pass
220+
offset, sublength, _, _, _ = current_map
221+
if i > offset + sublength:
222+
error_bytes.add(i - start_offset)
223+
224+
# Padded data
225+
specific_data = data.context.layers[data.layer_name].read(
226+
start_offset,
227+
end_offset - start_offset,
228+
True,
229+
)
230+
231+
import pdb
232+
233+
pdb.set_trace()
234+
235+
return specific_data, error_bytes
236+
227237

228238
class CLIRenderer(interfaces.renderers.Renderer):
229239
"""Class to add specific requirements for CLI renderers."""
@@ -525,9 +535,10 @@ def tab_stop(self, line: str) -> str:
525535

526536
class JsonRenderer(CLIRenderer):
527537
_type_renderers = {
528-
format_hints.HexBytes: quoted_optional(hex_bytes_as_text),
538+
format_hints.HexBytes: lambda x: x.hex(" "),
529539
renderers.Disassembly: quoted_optional(display_disassembly),
530540
format_hints.MultiTypeData: quoted_optional(multitypedata_as_text),
541+
renderers.LayerData: lambda x: LayerDataRenderer().render_bytes(x)[0].hex(" "),
531542
bytes: optional(lambda x: " ".join(f"{b:02x}" for b in x)),
532543
datetime.datetime: lambda x: (
533544
x.isoformat()

0 commit comments

Comments
 (0)