0

我刚开始使用 Python 脚本,我正在尝试编写一个程序来解析提供的 MBR,但我不知道如何开始。

我想编写一个程序来解析 MBR 的分区表的一部分。第一个分区条目位于地址 1BE。打印出状态字节(1 个字节位于起始地址)、分区类型(1 个字节位于地址 1BE + 4)和分区中第一个扇区的地址(1BE + 8)。

任何帮助将不胜感激!

4

2 回答 2

0

我知道这是一个非常古老的问题,但我来这里是为了寻找答案,而这里唯一的问题本身并没有很好地回答这个问题。我相信我对这一点的问题和答案有正确的理解;因此,从第一部分开始,即状态地址。状态地址通常类似于: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 上的一个有用资源。我认为这就是为什么我必须将其作为代码而不是文本发布的原因)

于 2021-09-15T00:52:02.213 回答
0

包括电池。使用arrayorstruct模块。

或者其中之一(但在这里他们可能会矫枉过正):

于 2018-02-02T20:02:19.007 回答