Changes in structure and data return for efficient partition entries data display

This commit is contained in:
Donghyun Kim
2022-03-25 15:50:15 +09:00
parent 1d07545645
commit 2cfc24f7d3
2 changed files with 65 additions and 141 deletions
+65 -139
View File
@@ -78,88 +78,57 @@ class MBRScan(interfaces.plugins.PluginInterface):
all_zeros = bootcode.count(b"\x00") == len(bootcode)
if not all_zeros:
if not self.config.get("full", True):
yield (0, (
format_hints.Hex(offset),
partition_table.get_disk_signature(),
self.get_hash(bootcode),
self.get_hash(full_mbr),
partition_table.FirstEntry.is_bootable(),
partition_table.FirstEntry.get_partition_type(),
format_hints.Hex(partition_table.FirstEntry.get_size_in_sectors()),
partition_table.SecondEntry.is_bootable(),
partition_table.SecondEntry.get_partition_type(),
format_hints.Hex(partition_table.SecondEntry.get_size_in_sectors()),
partition_table.ThirdEntry.is_bootable(),
partition_table.ThirdEntry.get_partition_type(),
format_hints.Hex(partition_table.ThirdEntry.get_size_in_sectors()),
partition_table.FourthEntry.is_bootable(),
partition_table.FourthEntry.get_partition_type(),
format_hints.Hex(partition_table.FourthEntry.get_size_in_sectors()),
interfaces.renderers.Disassembly(bootcode, 0, architecture)
))
else:
yield (0, (
format_hints.Hex(offset),
partition_table.get_disk_signature(),
self.get_hash(bootcode),
self.get_hash(full_mbr),
partition_table.FirstEntry.is_bootable(),
format_hints.Hex(partition_table.FirstEntry.get_bootable_flag()),
partition_table.FirstEntry.get_partition_type(),
format_hints.Hex(partition_table.FirstEntry.PartitionType),
format_hints.Hex(partition_table.FirstEntry.get_starting_lba()),
partition_table.FirstEntry.get_starting_cylinder(),
partition_table.FirstEntry.get_starting_chs(),
partition_table.FirstEntry.get_starting_sector(),
partition_table.FirstEntry.get_ending_cylinder(),
partition_table.FirstEntry.get_ending_chs(),
partition_table.FirstEntry.get_ending_sector(),
format_hints.Hex(partition_table.FirstEntry.get_size_in_sectors()),
partition_table.SecondEntry.is_bootable(),
format_hints.Hex(partition_table.SecondEntry.get_bootable_flag()),
partition_table.SecondEntry.get_partition_type(),
format_hints.Hex(partition_table.SecondEntry.PartitionType),
format_hints.Hex(partition_table.SecondEntry.get_starting_lba()),
partition_table.SecondEntry.get_starting_cylinder(),
partition_table.SecondEntry.get_starting_chs(),
partition_table.SecondEntry.get_starting_sector(),
partition_table.SecondEntry.get_ending_cylinder(),
partition_table.SecondEntry.get_ending_chs(),
partition_table.SecondEntry.get_ending_sector(),
format_hints.Hex(partition_table.SecondEntry.get_size_in_sectors()),
partition_table.ThirdEntry.is_bootable(),
format_hints.Hex(partition_table.ThirdEntry.get_bootable_flag()),
partition_table.ThirdEntry.get_partition_type(),
format_hints.Hex(partition_table.ThirdEntry.PartitionType),
format_hints.Hex(partition_table.ThirdEntry.get_starting_lba()),
partition_table.ThirdEntry.get_starting_cylinder(),
partition_table.ThirdEntry.get_starting_chs(),
partition_table.ThirdEntry.get_starting_sector(),
partition_table.ThirdEntry.get_ending_cylinder(),
partition_table.ThirdEntry.get_ending_chs(),
partition_table.ThirdEntry.get_ending_sector(),
format_hints.Hex(partition_table.ThirdEntry.get_size_in_sectors()),
partition_table.FourthEntry.is_bootable(),
format_hints.Hex(partition_table.FourthEntry.get_bootable_flag()),
partition_table.FourthEntry.get_partition_type(),
format_hints.Hex(partition_table.FourthEntry.PartitionType),
format_hints.Hex(partition_table.FourthEntry.get_starting_lba()),
partition_table.FourthEntry.get_starting_cylinder(),
partition_table.FourthEntry.get_starting_chs(),
partition_table.FourthEntry.get_starting_sector(),
partition_table.FourthEntry.get_ending_cylinder(),
partition_table.FourthEntry.get_ending_chs(),
partition_table.FourthEntry.get_ending_sector(),
format_hints.Hex(partition_table.FourthEntry.get_size_in_sectors()),
interfaces.renderers.Disassembly(bootcode, 0, architecture),
format_hints.HexBytes(bootcode)
))
partition_entries = [
partition_table.FirstEntry, partition_table.SecondEntry,
partition_table.ThirdEntry, partition_table.FourthEntry
]
for partition_index, partition_entry_object in enumerate(partition_entries, start=1):
# Output disassembly information and bootcode for each partition entry is inefficient,
# so it can only be processed in the last index.
last_partition_index = 4
bootcode_buf = bootcode if(partition_index == last_partition_index) else b""
if not self.config.get("full", True):
yield (0, (
format_hints.Hex(offset),
partition_table.get_disk_signature(),
self.get_hash(bootcode),
self.get_hash(full_mbr),
partition_index,
partition_entry_object.is_bootable(),
partition_entry_object.get_partition_type(),
format_hints.Hex(partition_entry_object.get_size_in_sectors()),
interfaces.renderers.Disassembly(bootcode_buf, 0, architecture)
))
else:
yield (0, (
format_hints.Hex(offset),
partition_table.get_disk_signature(),
self.get_hash(bootcode),
self.get_hash(full_mbr),
partition_index,
partition_entry_object.is_bootable(),
format_hints.Hex(partition_entry_object.get_bootable_flag()),
partition_entry_object.get_partition_type(),
format_hints.Hex(partition_entry_object.PartitionType),
format_hints.Hex(partition_entry_object.get_starting_lba()),
partition_entry_object.get_starting_cylinder(),
partition_entry_object.get_starting_chs(),
partition_entry_object.get_starting_sector(),
partition_entry_object.get_ending_cylinder(),
partition_entry_object.get_ending_chs(),
partition_entry_object.get_ending_sector(),
format_hints.Hex(partition_entry_object.get_size_in_sectors()),
interfaces.renderers.Disassembly(bootcode_buf, 0, architecture),
format_hints.HexBytes(bootcode_buf)
))
else:
vollog.log(constants.LOGLEVEL_VVVV, f"Not a valid MBR: Data all zeroed out : {format_hints.Hex(offset)}")
vollog.log(constants.LOGLEVEL_VV, f"Not a valid MBR: Data all zeroed out : {format_hints.Hex(offset)}")
except exceptions.PagedInvalidAddressException:
continue
pass
def run(self)-> renderers.TreeGrid:
if not self.config.get("full", True):
@@ -168,18 +137,10 @@ class MBRScan(interfaces.plugins.PluginInterface):
("Disk Signature", str),
("Bootcode MD5", str),
("Full MBR MD5", str),
("PartABootable", bool),
("PartAType", str),
("PartASectorInSize", format_hints.Hex),
("PartBBootable", bool),
("PartBType", str),
("PartBSectorInSize", format_hints.Hex),
("PartCBootable", bool),
("PartCType", str),
("PartCSectorInSize", format_hints.Hex),
("PartDBootable", bool),
("PartDType", str),
("PartDSectorInSize", format_hints.Hex),
("PartitionIndex", int),
("Bootable", bool),
("PartitionType", str),
("SectorInSize", format_hints.Hex),
("Disasm", interfaces.renderers.Disassembly)
], self._generator())
else:
@@ -188,54 +149,19 @@ class MBRScan(interfaces.plugins.PluginInterface):
("Disk Signature", str),
("Bootcode MD5", str),
("Full MBR MD5", str),
("PartABootable", bool),
("PartABootFlag", format_hints.Hex),
("PartAType", str),
("PartATypeRaw", format_hints.Hex),
("PartAStartingLBA", format_hints.Hex),
("PartAStartingCylinder", int),
("PartAStartingCHS", int),
("PartAStartingSector", int),
("PartAEndingCylinder", int),
("PartAEndingCHS", int),
("PartAEndingSector", int),
("PartASectorInSize", format_hints.Hex),
("PartBBootable", bool),
("PartBBootFlag", format_hints.Hex),
("PartBType", str),
("PartBTypeRaw", format_hints.Hex),
("PartBStartingLBA", format_hints.Hex),
("PartBStartingCylinder", int),
("PartBStartingCHS", int),
("PartBStartingSector", int),
("PartBEndingCylinder", int),
("PartBEndingCHS", int),
("PartBEndingSector", int),
("PartBSectorInSize", format_hints.Hex),
("PartCBootable", bool),
("PartCBootFlag", format_hints.Hex),
("PartCType", str),
("PartCTypeRaw", format_hints.Hex),
("PartCStartingLBA", format_hints.Hex),
("PartCStartingCylinder", int),
("PartCStartingCHS", int),
("PartCStartingSector", int),
("PartCEndingCylinder", int),
("PartCEndingCHS", int),
("PartCEndingSector", int),
("PartCSectorInSize", format_hints.Hex),
("PartDBootable", bool),
("PartDBootFlag", format_hints.Hex),
("PartDType", str),
("PartDTypeRaw", format_hints.Hex),
("PartDStartingLBA", format_hints.Hex),
("PartDStartingCylinder", int),
("PartDStartingCHS", int),
("PartDStartingSector", int),
("PartDEndingCylinder", int),
("PartDEndingCHS", int),
("PartDEndingSector", int),
("PartDSectorInSize", format_hints.Hex),
("PartitionIndex", int),
("Bootable", bool),
("BootFlag", format_hints.Hex),
("PartitionType", str),
("PartitionTypeRaw", format_hints.Hex),
("StartingLBA", format_hints.Hex),
("StartingCylinder", int),
("StartingCHS", int),
("StartingSector", int),
("EndingCylinder", int),
("EndingCHS", int),
("EndingSector", int),
("SectorInSize", format_hints.Hex),
("Disasm", interfaces.renderers.Disassembly),
("Bootcode", format_hints.HexBytes)
], self._generator())
@@ -2,8 +2,6 @@
# which is available at https://www.volatilityfoundation.org/license/vsl-v1.0
#
import struct
from volatility3.framework import objects
class PARTITION_TABLE(objects.StructType):