我刚刚开始使用Python脚本,并且正在尝试编写一个程序来解析所提供的MBR,但是我不确定如何开始。
我想写一个程序来解析MBR的分区表的一部分。第一分区条目位于地址1BE。打印出状态字节(1字节位于起始地址)、分区类型(1字节位于地址1BE + 4)和分区中第一个扇区的地址(1BE + 8)。
任何帮助都将不胜感激!
发布于 2018-02-03 04:02:19
包括电池。使用array或struct模块。
或者它们中的一个(但在这里它们可能是过度杀伤力):
发布于 2021-09-15 00:52:02
我知道这是一个非常古老的问题,但我来这里是为了寻找答案,而这里唯一一个人没有很好地回答这个问题本身。我相信我现在对问题和答案已有一个正确的理解;所以,先从第一部分开始,也就是现状报告。状态地址通常类似于: 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;因此,在上面的示例中,我们实际查看的是存储在索引mbr446中的字节(因为我们从0xPython知道将其解释为十六进制值,所以446是0x1BE)。
转到第二部分,与第一部分类似,分区类型是存储在地址0x1BE+4或0x1C2的单字节。因此,要找到它,就像处理状态字节一样,我们可以简单地这样做:
partition_type = mbr[0x1C2]因为分区类型也只是一个字节,并且我们的mbr数组的每个索引都是一个字节,所以我们可以简单地提取地址0x1C2处的值。
至于最后一部分,第一个扇区的地址是一个从地址0x1BE+8或0x1C6开始的4字节值。因为它是字节,所以我们知道它在地址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 Native file system (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上的有用资源。我想这就是为什么我不得不以代码而不是文本的形式发布它)
https://stackoverflow.com/questions/48589706
复制相似问题