我刚开始使用 Python 脚本,我正在尝试编写一个程序来解析提供的 MBR,但我不知道如何开始。
我想编写一个程序来解析 MBR 的分区表的一部分。第一个分区条目位于地址 1BE。打印出状态字节(1 个字节位于起始地址)、分区类型(1 个字节位于地址 1BE + 4)和分区中第一个扇区的地址(1BE + 8)。
任何帮助将不胜感激!
我刚开始使用 Python 脚本,我正在尝试编写一个程序来解析提供的 MBR,但我不知道如何开始。
我想编写一个程序来解析 MBR 的分区表的一部分。第一个分区条目位于地址 1BE。打印出状态字节(1 个字节位于起始地址)、分区类型(1 个字节位于地址 1BE + 4)和分区中第一个扇区的地址(1BE + 8)。
任何帮助将不胜感激!
我知道这是一个非常古老的问题,但我来这里是为了寻找答案,而这里唯一的问题本身并没有很好地回答这个问题。我相信我对这一点的问题和答案有正确的理解;因此,从第一部分开始,即状态地址。状态地址通常类似于:0x80,它是一个活动状态标志,并且只有一个字节长。这可以通过以下几行找到:
import struct # This is where we get our bytearray() structure
mbr = bytearray() # We want each index of our array to be a byte
binary_file = open(file, 'rb')
mbr = binary_file.read(512) # The first 512 bytes are the first sector, which is the MBR
status_flag = mbr[0x1BE]
状态标志只有一个字节,因为我们知道它位于地址 0x1BE,所以我们可以简单地从 MBR 数组中提取该索引(我们在读取文件时收集的但被分成 1 个字节的块)。另一种读取 0x1BE 的方法是整数 446;所以我们实际上是在查看上面示例中存储在索引 mbr[446] 中的字节(因为我们从 0x 开始,Python 知道将其解释为十六进制值,所以 446 是 0x1BE)。
进入第二部分,与第一部分类似,分区类型是存储在地址 0x1BE+4 或 0x1C2 处的单个字节。所以,要找到这个,就像状态字节一样,我们可以简单地做:
partition_type = mbr[0x1C2]
因为分区类型也只是一个字节,而我们的mbr数组的每个索引都是一个字节,所以我们可以简单的拉取地址0x1C2处的值。
至于最后一部分,第一个扇区的地址是一个从地址开始的 4 字节值:0x1BE+8 或 0x1C6。因为是字节,所以我们知道它在地址 0x1BE+12 或 0x1CA 处结束。因此,要找到它,我们可以执行以下操作:
first_sector_addr = struct.unpack('<I', mbr[0x1C6:0x1CA])
'''
For the line above, we are using the unpack function also
included with the struct import. This function takes two
primary arguments: the byte order/size/alignment, and the
data to read (https://docs.python.org/3/library/struct.html).
We must read the data as little-endian and as an unsigned int
(https://thestarman.pcministry.com/asm/mbr/PartTables.htm).
'''
一旦我们收集了所有变量(status_flag、partition_type、first_sector_addr),我们就可以将它们中的每一个打印到屏幕上。我建议将前两个打印为十六进制值,因为这些是用于识别的。例如,如果分区类型的十六进制值为 0x83,则它是 Linux 本机文件系统 ( https://thestarman.pcministry.com/asm/mbr/PartTypes.htm )
https://thestarman.pcministry.com/asm/mbr/PartTables.htm https://en.wikipedia.org/wiki/Master_boot_record#Sector_layout
https://www.ijais.org/research/volume10/number8/sadi-2016-ijais-451541.pdf
(最后一个链接将提示下载 pdf,但它是 MBR 上的一个有用资源。我认为这就是为什么我必须将其作为代码而不是文本发布的原因)
包括电池。使用array
orstruct
模块。
或者其中之一(但在这里他们可能会矫枉过正):