使用Python读取整个物理文件,包括文件空隙?

5
有没有一种简单的方法使用Python读取给定文件的所有已分配簇?通常的Python read()似乎只允许我读取文件的逻辑大小(这当然是合理的),但我想读取包括松散空间在内的所有簇。
例如,我有一个名为“test.bin”的文件,逻辑大小为1234字节,但由于我的文件系统使用大小为4096字节的簇,因此该文件在磁盘上的物理大小为4096字节。即,文件松散空间中有2862个字节。
我甚至不知道从哪里开始解决这个问题......我知道我可以从/ dev / sda读取原始磁盘,但我不确定如何定位感兴趣的簇......当然,这就是拥有文件系统的整个重点(将文件名与磁盘扇区匹配),但我对Python如何与文件系统交互的了解还不够......任何帮助或指向参考资料的指针将不胜感激。

那在处理稀疏文件时应该如何表现? - Sylvain Leroux
为什么你想要这样做? - PTBNL
看起来 os.stat 会给我 inode,但仍然不确定如何使用它来访问正确的磁盘扇区... 如果我能够获得磁盘上的起始扇区,那就是我所需要的全部内容了... - hft
算了,我想我只需要每个片段的最后一个扇区……但是现在只要有什么东西我都会满意。@PTBNL,你问的问题是什么意思?我不确定它如何回答我的问题。文件碎片空闲区通常用于计算机取证。这是你在问的吗? - hft
@SylvainLeroux,你知道我怎么用Python的方式从inode到起始扇区吗?我想通过命令行使用debugfs来获取它... - hft
显示剩余3条评论
2个回答

1
假设使用的是ext2/3/4文件系统,就像你自己猜测的那样,最好的选择可能是:
  1. use a wrapper (like this one) around debugfs to get the list of blocks associated with a given file:

    debugfs:  blocks ./f.txt
    2562 
    
  2. to read-back that/those block(s) from the block device / image file

    >>> f = open('/tmp/test.img','rb')
    >>> f.seek(2562*4*1024)
    10493952
    >>> bytes = f.read(4*1024)
    >>> bytes
    b'Some data\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
    \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
    \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
    \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
    ...
    

虽然不太花哨,但这样做可以运行。请注意,您无需挂载文件系统即可执行任何这些步骤。这对于取证应用程序尤其重要,因为您无法以任何方式信任磁盘内容和/或根据规定不允许挂载磁盘映像。


是的。谢谢你的回答。我现在正在尝试在cygwin上操作它,但debugfs并不顺利...等我回到家里有真正的Linux机器时再去处理它。 - hft
@hft debugfs 仅适用于 ext2/3/4 文件系统。如果在该文件系统格式的分区的映像上工作,则应该可以在 cygwin 上使用。但我不确定是否可以在连接的磁盘上运行。 - Sylvain Leroux
我只是在研究如何在文件中创建一个ext2分区,以便在cygwin 中使用,看起来mke2fs 可以解决这个问题... - hft
@hft 像这样的东西:dd of='test.img' if=/dev/null bs=1M count=8,然后 mke2fs -F test.img - Sylvain Leroux

0

有一个 C 开源取证工具,成功实现了文件访问。 这是该工具的概述 链接。 你可以在这里下载它 下载。 它基本上使用了POSIX系统调用open(),返回原始文件描述符(整数),你可以使用POSIX系统调用read()write()而无需停止在EOF处,从而可以访问文件闲置部分。

有很多在线示例演示如何使用 Python 进行系统调用,例如这个


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接