尝试在Python中解压/解码专有数据文件

2024-09-29 19:18:45 发布

您现在位置:Python中文网/ 问答频道 /正文

tl;dr-在试图对一个专有数据库文件进行反向工程时,我发现Wordpad能够自动地将一些数据解码为清晰的格式。我试图用python实现这种解码。现在,即使是写字板巫毒也不可重复。在


准备好开动脑筋了吗?在

我想解决一个奇怪的问题。我有一个数据文件,它是一个科学仪器程序的数据库(Mettler DSC/STARe软件),我试图从实验中获取样本信息。根据我在文件中的挖掘,它似乎包含了关于实验运行的明文、未加密的信息以及数据。它是一个.t00文件,大小超过40MB(它基本上存储了运行的所有数据),我对编码知之甚少(除了它看起来是任意的)。它不是一个文本文件)。我可以在写字板中打开这个文件,可以看到我要查找的信息(示例名称、时间戳、实验参数),周围是实验运行数据(正如预期的那样,这看起来像是很多官样文章,例如“+ú@”ðßö@¨…)。看起来我基本上很幸运,因为它能够理解内容,我正在尝试复制它。在

我可以用一个基本的文件处理程序将文件读入python,然后使用regex获取我想要的一些信息r'vs'rb'似乎没有帮助。在

def textOpenLines(filename,mode='rb'):
    with open(filename, mode) as content_file:
        return [line for line in content_file]

我可以获取该列表并在其中搜索相关字符串并从中获取示例名称。但是在Wordpad中查看文件时,我发现示例名称被列出了两次,第二次是它后面有日期戳(例如“Dibenzoylperoxid 120 C 03.05.1994 14:24:30”)。在python中,我找不到这个字符串。我连时间戳都找不到。当我看到它应该出现的那一行时,我得到了一堆随机字节。在记事本中打开类似于python输出。在

我怀疑是编码问题。我试着读入Unicode文件,但我没法读懂。我被难住了。在

你有什么想法可以读入这个以便它能正确解码?写字板做对了(虽然后来尝试打开它,但看起来像是记事本的输出)。在

谢谢!!在

编辑:

  • 我不知道是谁更改了标题,但它“看起来像Python/Notepad中的随机字节”。主要是数据。在
  • 它不是一个文本文件。我有幸打开了写字板
  • 它没有损坏。DSC仪器程序读起来很好。它只是专有的,所以我不知道它如何运行。在
  • 我尝试过使用“r”、“rb”和“U”标志。在
  • 我试过了编解码器.打开使用utf8、16和32,但它给出UnicodeDecodeError:“utf8”编解码器无法解码第49位的字节0xdf:无效的延续字节。我不认为它有BOM,因为我不认为它是人类可读的。在
  • 前32个字节(f.read(32))读取

    '\x10\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\x04\x10\x00\x00'

    我对bom了解不多,但是从Wiki页面来看,这看起来不像任何有效的UTF标记。

第一次在写字板中自动解码时,文件的开头如下所示: 121 22二苯并酰过氧化物120 C 03.05 1994年14:24:30 30 1 0 0 4096 ESTimeAI–@@@@@n n@49Õ@kò@sþ@N5A2 A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A”A“A A”A“A”A“A”A“A A”A“A”A“A”A“A”A“A A”A“A”A“A”A“A”A“A”8|AõAº^A 阿法布

在记事本、Python和写字板中打开文件的开头如下所示: (空字节x00…)(x00…)eß(x00…)NvN(x00)。。。等等


Tags: 文件数据程序名称信息数据库示例字节
1条回答
网友
1楼 · 发布于 2024-09-29 19:18:45

您的文件不包含ascii字符,但被打开它的应用程序解释为ascii字符。如果你在wordpad中打开一个.jpg图像,也会发生同样的事情——你会得到一堆二进制和一些ascii字符,这些字符可以打印出来,并且可以被人眼识别。在

例如,这就是为什么不能对时间戳进行纯文本搜索的原因。在

下面是一个代码示例来演示这个问题。在二进制文件中,有以下字节:

\x44\x69\x62\x65\x6e\x7a\x6f\x79\x6c\x70\x65\x72\x6f\x78\x69\x64\x20\x31\
x32\x30\x20\x43\x20\x30\x33\x2e\x30\x35\x2e\x31\x39\x39\x34\x20\x31\x34\x3a\x32\
x34\x3a\x33\x30

如果要在像写字板这样的文本编辑器中打开它,它将呈现以下内容:

^{pr2}$

下面是Python中的代码片段:

>>> c='\x44\x69\x62\x65\x6e\x7a\x6f\x79\x6c\x70\x65\x72\x6f\x78\x69\x64\x20\x31\
x32\x30\x20\x43\x20\x30\x33\x2e\x30\x35\x2e\x31\x39\x39\x34\x20\x31\x34\x3a\x32\
x34\x3a\x33\x30'
>>> print c
Dibenzoylperoxid 120 C 03.05.1994 14:24:30

这些字节是十六进制格式,这就是为什么你不能用明文搜索它。在

这是因为二进制文件遵循一个非常特殊的结构(协议、规范),所以读取它的程序可以正确地解析它。如果您以一个jpeg图像为例,您会发现图像的第一个字节和最后一个字节总是相同的(取决于所使用的格式)-FF D8将是jpeg的前两个字节,FF D9将是jpeg的最后两个字节来标识它。一个图像编辑程序现在知道要开始将这些二进制数据解析为jpeg,它将“遍历”文件中的结构以呈现图像。Here是一个指向资源的链接,它可以帮助您根据“签名”或“头”标识文件,文件的前两个字节10 00不会出现在该数据库中,因此您可能处理的是一种专有格式,因此您无法很容易地在线找到规范。这就是逆向工程派上用场的地方。在

我建议你用一个十六进制编辑器打开你的文件-它将提供十六进制输出和ascii输出,这样你就可以开始分析文件格式了。我个人使用Hackman Hexeditor发现here(它是免费的,有很多特性)。在

但是现在-给你一些有用的东西来搜索你感兴趣的数据,这是一个快速的方法,在开始搜索之前把你的搜索查询转换成二进制。在

import struct

#binary_data = open("your_binary_file.bin","rb").read()

#your binary data would show up as a big string like this one when you .read()
binary_data = '\x44\x69\x62\x65\x6e\x7a\x6f\x79\x6c\x70\x65\x72\x6f\x78\x69\x64\x20\x31\
x32\x30\x20\x43\x20\x30\x33\x2e\x30\x35\x2e\x31\x39\x39\x34\x20\x31\x34\x3a\x32\
x34\x3a\x33\x30'

def search(text):

    #convert the text to binary first
    s = ""

    for c in text:
        s+=struct.pack("b", ord(c))

    results = binary_data.find(s)
    if results == -1:
        print "no results found"
    else:
        print "the string [%s] is found at position %s in the binary data"%(text, results)

search("Dibenzoylperoxid")

search("03.05.1994")

上述脚本的结果是:

the string [Dibenzoylperoxid] is found at position 0 in the binary data
the string [03.05.1994] is found at position 25 in the binary data 

这应该能让你开始。在

相关问题 更多 >

    热门问题