【问题标题】:How can I determine the end of a SQLite db file from a hex view of the hard disk?如何从硬盘的十六进制视图确定 SQLite db 文件的结尾?
【发布时间】:2021-05-11 12:42:59
【问题描述】:

我有一个硬盘驱动器,它可能已经删除了上面的 SQLite db 文件。我正在读取磁盘的字节并寻找 SQLite 文件的十六进制签名:53514c69746520666f726d6174203300

我的代码告诉我这些文件在磁盘上的偏移量,但我不知道它们的大小。

例如偏移量

  • 760360
  • 935448

是否可以从十六进制视图确定 dbs 的大小?据我所知,这些文件没有共同的结束字符。

我的代码

from pathlib import Path
import logging

file_sig = '53514c69746520666f726d6174203300'
disk = Path('/dev/sde1')  # sde is old HDD
try:
    with disk.open(mode="rb") as drive:
        for block_no in range(0, 488281250):
            byte = drive.read(512)
            hexx = byte.hex()

            try:
                idx = hexx.index(file_sig)
                byte_nos.append(idx + block_no * 512)
            except ValueError as e:
                logging.debug(e)
                pass
except KeyboardInterrupt:
    pass

with Path('./results.csv').open(mode='w') as f:
    for item in byte_nos:
        f.write("%s\n" % item)

【问题讨论】:

  • 您可以从页眉中提取页面大小和总页数,并计算出使用了多少块。不能保证文件是由文件系统连续存储的,尽管...
  • 如果我正在查看整个硬盘驱动器的十六进制视图,标题在哪里?如果我检查 SQLite 数据库文件,则有 not much going on at the beginning of the file
  • This 是 SQLite 文件开头的十六进制示例
  • 好的,我发现this 对 SQLite 数据库的前几个字节很有帮助。谢谢!

标签: python sqlite hex data-recovery


【解决方案1】:

文件大小可以通过查看十六进制标题来确定。

我将使用 forgetso 提供的错误答案中的部分标题来演示。我们只需要检查前 32 个字节,因此这是我们将要查看的部分:

53 51 4C 69 74 65 20 66
6F 72 6D 61 74 20 33 00
10 00 01 01 00 40 20 20
00 00 CC 9B 00 00 03 2B

前 16 个字节是文件类型标识符,所以我们真的只关心这部分来确定文件大小:

10 00 01 01 00 40 20 20
00 00 CC 9B 00 00 03 2B

上面粗体的两个字节部分(偏移量 16 和 17)将告诉我们数据库中包含的每个页面的大小。为了得到这个数字,我们必须将大端十六进制表示转换为十进制形式。这可以使用十六进制到十进制的转换工具快速完成。

10 00

变成 4096,这意味着每一页是 4096 字节

我们需要的另一部分是数据库中包含的页数。

10 00 01 01 00 40 20 20
00 00 CC 9B 00 00 03 2B

再看上面的十六进制,现在粗体的四字节部分(偏移量 28-32)是我们需要确定总页数的部分。同样,我们只需要转换成十进制形式。

00 00 03 2B

变成811,表示有811页

只需将这些值相乘即可计算数据库文件大小。

4096(bytes/page) * 811(pages) = 3321856    

因此,文件大小为 3,321,856 字节
可以通过将此数字添加到文件头所在的偏移量来找到文件的结尾开始。

【讨论】:

    【解决方案2】:

    感谢@Shawn,我发现this 对 SQLite 数据库很有帮助。

    从 SQLite 版本 3.7.1 开始,65536 字节的页面大小是 支持的。值 65536 不适合两字节整数,因此 指定 65536 字节的页面大小,偏移量 16 处的值是 0x00 0x01。

    我的 db 文件的开头如下所示:

    53514C69746520666F726D617420330010000101004020200000CC9B0000032B000002E1
    000000170000008000000002000000000000000000000001000000000000000000000000
    00000000000000000000000000000000000000000000CC9B00
    

    所以我认为我的页面大小是 0001 = 65536 字节,即使这似乎位于偏移量 15 处(可能是从 0 对 1 计数的情况)。页数存储在偏移量 28 如果...

    偏移 24 处的 4 字节更改计数器与 4 字节完全匹配 偏移量 92 处的版本有效编号

    在我的情况下,这些偏移量处的更改计数器偏移量似乎是“00CC9B00”。因此,我将我的页数设为 0000032B,它转换为 43 的大端 8 位值。

    43 (page count) * 65536 (page size) = 2,818,048 bytes = 2.818048 MB
    

    这与 Ubuntu 中的文件资源管理器告诉我的内容很接近,但它不正确。我知道我的测试数据库是 3,321,856 字节,所以我大约短了 503,808 字节。在搜索文件时,我只会将我抓取的磁盘部分扩展这么多,因为我只是尝试在原始文件中搜索某些文本,而不是将它们作为数据库加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 2020-06-26
      • 1970-01-01
      • 2014-01-25
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多