python实现数据恢复_数据恢复/电子取证 非常有用的python库——Construct | 学步园...

和硬盘打交道,不免会用到字节、大\小端对齐、结构等。C语言定义了很多类型,我们定义一个结构,配合mem***函数、大小端转换宏等几乎可以应付了。Python就没那么好用了,因为它本身也不是为这种低级操作而设计的。处理这种二进制数据,貌似只有struct库能沾上一点边,它用起来像printf,数据一多就会把你搞晕的,它还有几个致命缺点:1. 不支持小于1个字节的;2. 数据格式固定。总的来说,它的扩展性和易用性是很差的。

Construct一改模仿C语言struct的“趋势”,结构体不再是对数据的定义而是描述。这一颠覆性的思想可以说把数据流unpack推向到一个新台阶。我们不再受限于语言本身所定义的类型,而是像正则表达式那样根据数据格式来描述结构。

这种思想也不是Construct首先提出的,一些网络数据包处理程序很早也在使用(Construct最早也是用于处理TCP/IP数据包的)。我们可以看看该库所带的一个处理mbr解析的示例

from construct import *

mbr = Struct("mbr",

HexDumpAdapter(Bytes("bootloader_code", 446)),

Array(4,

Struct("partitions",

Enum(Byte("state"),

INACTIVE = 0x00,

ACTIVE = 0x80,

),

BitStruct("beginning",

Octet("head"),

Bits("sect", 6),

Bits("cyl", 10),

),

Enum(UBInt8("type"),

Nothing = 0x00,

FAT12 = 0x01,

XENIX_ROOT = 0x02,

XENIX_USR = 0x03,

FAT16_old = 0x04,

Extended_DOS = 0x05,

FAT16 = 0x06,

FAT32 = 0x0b,

FAT32_LBA = 0x0c,

NTFS = 0x07,

LINUX_SWAP = 0x82,

LINUX_NATIVE = 0x83,

_default_ = Pass,

),

BitStruct("ending",

Octet("head"),

Bits("sect", 6),

Bits("cyl", 10),

),

UBInt32("sector_offset"), # offset from MBR in sectors

UBInt32("size"), # in sectors

)

),

Const(Bytes("signature", 2), "\x55\xAA"),

)

if __name__ == "__main__":

cap1 = (

"33C08ED0BC007CFB5007501FFCBE1B7CBF1B065057B9E501F3A4CBBDBE07B104386E00"

"7C09751383C510E2F4CD188BF583C610497419382C74F6A0B507B4078BF0AC3C0074FC"

"BB0700B40ECD10EBF2884E10E84600732AFE4610807E040B740B807E040C7405A0B607"

"75D2804602068346080683560A00E821007305A0B607EBBC813EFE7D55AA740B807E10"

"0074C8A0B707EBA98BFC1E578BF5CBBF05008A5600B408CD1372238AC1243F988ADE8A"

"FC43F7E38BD186D6B106D2EE42F7E239560A77237205394608731CB80102BB007C8B4E"

"028B5600CD1373514F744E32E48A5600CD13EBE48A560060BBAA55B441CD13723681FB"

"55AA7530F6C101742B61606A006A00FF760AFF76086A0068007C6A016A10B4428BF4CD"

"136161730E4F740B32E48A5600CD13EBD661F9C3496E76616C69642070617274697469"

"6F6E207461626C65004572726F72206C6F6164696E67206F7065726174696E67207379"

"7374656D004D697373696E67206F7065726174696E672073797374656D000000000000"

"0000000000000000000000000000000000000000000000000000000000000000000000"

"00000000000000000000000000000000002C4463B7BDB7BD00008001010007FEFFFF3F"

"000000371671020000C1FF0FFEFFFF761671028A8FDF06000000000000000000000000"

"000000000000000000000000000000000000000055AA"

).decode("hex")

print mbr.parse(cap1)

Construct由众多Adapter构成,你可以为某种特定的数据流形式定义一种。上例中的Enum, BitStruct也算一种。相信在你看完这个例子后应该知道什么是“结构描述”了。

Construct可以从pypi上下载到。它有很完善的文档,初学者建议从这里开始http://construct.wikispaces.com/tutorial

你可能感兴趣的:(python实现数据恢复)