数据恢复/电子取证 非常有用的python库——Construct

原创 2012年02月01日 15:07:18

和硬盘打交道,不免会用到字节、大\小端对齐、结构等。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

CI快速开发电子商城项目

本套ci视频教程并非简单的讲解ci的各个知识点,而是采取项目驱动的方式来解读ci。从简单的mvc编写、工具类和辅助函数的使用到ci的执行流程分析、核心类的扩展、灵活多变的项目结构规划均有详细的讲解。更为重要的是通过开发电子商城,还可以学习数据库的分析和设计,业务逻辑的分析和处理,从而为自己积累项目经验。
  • 2016年03月25日 16:03

Advanced Python Constructs(译)

高级Python结构 原谅渣翻译,可能仅仅是给我自己看的。本来多年(也就几个月吧)之前将此文投递到OSChina翻译频道结果被以代码太多为由被拒,于是译者只好用自己的渣英语渣水平翻译给自己看了…...
  • zt_706
  • zt_706
  • 2013-09-09 14:54:20
  • 723

数据恢复设备

南宁磁动电子科技有限公司(DFL)于2011年在南宁成立,磁盘固件实验室团队。公司专业从事数据恢复相关工具软件的开发和研究,技术团队汇集了数据恢复、硬盘维修、软件开发、电路板开发等多位资深高级工程师,...
  • shujuhuifushebei
  • shujuhuifushebei
  • 2016-07-20 12:46:19
  • 136

从数据恢复角度出发 python解释NTFS runlist的代码

执行效果如下: root@zhangyu-VirtualBox:~/NTFS-5# python3 read_runlist.py mft_source.img   ***参数数量或格式错误! ...
  • beiya123
  • beiya123
  • 2017-07-13 17:32:19
  • 255

从零开始:NTFS文件格式的数据恢复的程序设计python语言(1)

本人也是在写论文ING,拿到了这个题目又突然对python语言感兴趣,所以索性一遍学这门语言,一边做毕业设计。 首先,安装python和pycharm。这两个百度一下就可以轻松做到。如果出现错误就多...
  • qq_26692927
  • qq_26692927
  • 2018-01-07 11:28:50
  • 53

python3.6对MySQL数据恢复

上一篇博客讲了关于python3.6对数据库的备份,这一篇讲一下对数据库的简单数据恢复,备份请看上一篇。 数据库的备份和数据恢复是一对相反的操作,如果你会了一种那么另一种自然就融会贯通了。 话不多...
  • qq_36523839
  • qq_36523839
  • 2017-04-25 19:54:00
  • 439

教大家如何自行快速恢复硬盘上的数据?

如果硬盘被格式化了,里面的文件忘记保存怎么办?可能你会说你不怎么使用硬盘,可能你会说你没事不会去格式化硬盘,但是无疑的,这也是生活中设备使用的隐患之一,总的来说,能学到一些算一些,技多不压身,有的时候...
  • dnkasdlas
  • dnkasdlas
  • 2014-08-07 14:28:15
  • 1036

硬盘数据恢复的神器有哪些?

因为众所周知的原因:硬盘总是坏!但是嘛,其实硬盘数据恢复也是那么难,一起来看看! 在一切工作进行之前,请先判断硬盘是否有损坏,以及缺损类型,而往往硬盘出现问题主要集中下以下两个方面: 物理...
  • zw0Pi8G5C1x
  • zw0Pi8G5C1x
  • 2017-11-29 00:00:00
  • 154

[Python] struct模块解读

Navigation index modules | next | previous | Python » 3.5.2 Documentation » The Python Stand...
  • u012080928
  • u012080928
  • 2017-05-04 10:55:13
  • 349

Chapter 3 【Python绝技:用Python进行取证调查】

代码来自《Python绝技:运用Python成为顶级黑客》第三章:用Python进行取证调查 环境:Win 7,python 2.7 1、你曾经去过哪里?——在注册表中分析无线访问热点 ...
  • github_37216944
  • github_37216944
  • 2018-02-25 12:11:25
  • 48
收藏助手
不良信息举报
您举报文章:数据恢复/电子取证 非常有用的python库——Construct
举报原因:
原因补充:

(最多只允许输入30个字)