2014-08-28 72 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 

這應該讓你開始。