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文件,但我没法读懂。我被难住了。在
你有什么想法可以读入这个以便它能正确解码?写字板做对了(虽然后来尝试打开它,但看起来像是记事本的输出)。在
谢谢!!在
编辑:
前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)。。。等等
您的文件不包含ascii字符,但被打开它的应用程序解释为ascii字符。如果你在wordpad中打开一个.jpg图像,也会发生同样的事情——你会得到一堆二进制和一些ascii字符,这些字符可以打印出来,并且可以被人眼识别。在
例如,这就是为什么不能对时间戳进行纯文本搜索的原因。在
下面是一个代码示例来演示这个问题。在二进制文件中,有以下字节:
如果要在像写字板这样的文本编辑器中打开它,它将呈现以下内容:
^{pr2}$下面是Python中的代码片段:
这些字节是十六进制格式,这就是为什么你不能用明文搜索它。在
这是因为二进制文件遵循一个非常特殊的结构(协议、规范),所以读取它的程序可以正确地解析它。如果您以一个jpeg图像为例,您会发现图像的第一个字节和最后一个字节总是相同的(取决于所使用的格式)-
FF D8
将是jpeg的前两个字节,FF D9
将是jpeg的最后两个字节来标识它。一个图像编辑程序现在知道要开始将这些二进制数据解析为jpeg,它将“遍历”文件中的结构以呈现图像。Here是一个指向资源的链接,它可以帮助您根据“签名”或“头”标识文件,文件的前两个字节10 00
不会出现在该数据库中,因此您可能处理的是一种专有格式,因此您无法很容易地在线找到规范。这就是逆向工程派上用场的地方。在我建议你用一个十六进制编辑器打开你的文件-它将提供十六进制输出和ascii输出,这样你就可以开始分析文件格式了。我个人使用Hackman Hexeditor发现here(它是免费的,有很多特性)。在
但是现在-给你一些有用的东西来搜索你感兴趣的数据,这是一个快速的方法,在开始搜索之前把你的搜索查询转换成二进制。在
上述脚本的结果是:
这应该能让你开始。在
相关问题 更多 >
编程相关推荐