diff --git a/volatility3/framework/objects/utility.py b/volatility3/framework/objects/utility.py index 05ad76d11..799639a67 100644 --- a/volatility3/framework/objects/utility.py +++ b/volatility3/framework/objects/utility.py @@ -279,14 +279,27 @@ def dynamically_sized_array_of_pointers( An array of pointer objects """ new_count = 0 - for entry in array_of_pointers( - array=array, count=iterator_guard_value, subtype=subtype, context=context - ): - # "entry" is naturally represented by the address that the pointer refers to - if (entry == stop_value) or ( - not entry.is_readable() and stop_on_invalid_pointers - ): + sym_table_name = array.get_symbol_table_name() + sym_table = context.symbol_space[sym_table_name] + ptr_size = sym_table.get_type("pointer").size + layer_name = array.vol.layer_name + + offset = array.vol.offset + entry = None + while entry != stop_value and new_count < iterator_guard_value: + try: + entry = context.object( + sym_table_name + constants.BANG + "pointer", + offset=offset, + layer_name=layer_name, + ) + except exceptions.InvalidAddressException: break + + if not entry.is_readable() and stop_on_invalid_pointers: + break + + offset += ptr_size new_count += 1 else: vollog.log(