2014-08-28 78 views
2

tl; dr - 尝试对专有数据库文件进行逆向工程时,发现Wordpad能够自动将某些数据解码为易读的格式。我试图在python中实现该解码。现在,即使写字板伏都不可重复。尝试在Python中解压/解码专有数据文件


准备好一个脑筋急转弯?

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

我可以用一个基本的文件处理程序将文件读​​入python中,并使用正则表达式来获得我想要的一些信息。 'r'和'rb'似乎没有帮助。

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

我可以拿到该列表并搜索相关字符串并从中获取示例名称。但是从在写字板中查看文件,我发现样本名称列出了两次,第二次在它后面有日期戳记(例如'Dibenzoylperoxid 120 C 03.05.1994 14:24:30')。在Python中,我找不到这个字符串。我甚至找不到自己的时间戳。当我查看应该发生的行时,我会得到一堆随机字节。在记事本中打开看起来像python输出。

我怀疑这是一个编码问题。我试着以Unicode格式阅读文件,我尝试过使用片段和阅读这些文件,但我无法破解它。我很难过。

有关如何阅读此内容以便它解码正确的任何想法?写字板得到它的权利(虽然现在随后试图打开它,它看起来像记事本输出)。

谢谢!

编辑:

  • 我不知道是谁改了称呼,当然它看起来像在Python /记事本中随机字节“。这主要是数据。
  • 它不是一个文本文件。我很喜欢写字板开局
  • 它没有损坏。 DSC仪器程序读取它就好了。它只是专有的,所以我不知道它是如何剔除的。
  • 我试过使用'r','rb'和'U'标志。
  • 我试过使用utf8,16和32的codecs.open,但它给UnicodeDecodeError:'utf8'编解码器无法解码位置49中的字节0xdf:无效的连续字节。我不认为它有一个BOM,因为我不认为它是人类可读的。
  • 前32字节(f。读(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 \ x04 \ x10 \ x00 \ x00'

    我不太了解物料清单,但是从阅读维基页面看,看起来不像任何有效的UTF标记。

文件,首先,当在写字板自动地解码的开始,看起来像这样: 121 22Dibenzoylperoxid 120℃1994年5月3日14点24分三十秒1 0 4096 ESTimeAI- @£®@ NOA @ 49O @ KEA @FÞò@`STH @N5A2A® “A” A-¥A¿ÝA¡zA“ÓAÿãAÐÅAäHA,œAÑÌAŸäA¤ÆAE-AFNATöAÐ|AõAº^ A(ÄAèAýqA¹AÖûAº8A¬uAK«AgÜAüAÞAo4A>ñ AFAB

的开始文件,当在记事本,Python和现在写字板中打开时,看起来像这样: (空字节x00 ...)](x00 ...)eß(x00 ...)NvN(x00)...等

+1

我试图解码一个未知文件时做的第一件事是[hexdump](http://en.wikipedia.org/wiki/Hex_dump)...呃,实际上是_second one_,刚刚运行[文件(http://linux.die.net/man/1/file)。你尝试过吗?也许这是一个众所周知的格式“隐身”作为别的东西? – 2014-08-28 20:01:08

+2

你确定这个文件实际上是一个文本文件吗?如果它是来自某个程序的数据库,它可能不会被认为是纯文本。 – BrenBarn 2014-08-28 20:02:16

+0

快速谷歌搜索表明应该有一个'.h01'文件,它是人类可读的(csv我想),而'.t00'文件是一些专有格式。 – roippi 2014-08-28 20:05:06

回答

4

您的文件不是由ascii字符组成,而是由打开它的应用程序解释。如果您在写字板中打开.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 

如果你打开这个像写字板文本编辑器里面会呈现如下:

Dibenzoylperoxid 120 C 03.05.1994 14:24:30 

下面是一个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的前两个字节不会显示在该数据库中,因此您可能会处理专有格式,很容易在网上找到规格。这就是逆向工程派上用场的地方。

我建议你在hexeditor中打开你的文件 - 它会给你两个十六进制输出以及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 

这应该让你开始。