題:
解碼二進制數據序列中的日期和時間
nimiq
2013-05-26 21:20:27 UTC
view on stackexchange narkive permalink

INTRO

我正在嘗試對包含sms消息的二進制數據文件進行反向工程。
該文件名為ems.idx4,並使用名為的軟件創建LG PhoneManager大約5年前作為LG手機短信的備份存檔。
我不知道是使用哪種語言編寫LG PhoneManager,但是在二進製文件中,我讀取了諸如“ CObTree”,“ CFolder”之類的字符串“,” CMessage“:也許這個線索沒有任何意義,也許表明使用了Cobol / .net /任何語言。

問題

我解碼了二進製文件的整個結構,這很簡單。
我無法解碼的唯一部分是單個消息的日期和時間。
我確定了對日期和時間進行編碼的二進制部分我得到了一些解碼後的示例(由於消息的內容)。
十六進制的二進制數據:

  [0x10] D0 74 C4 FE 3F 42 E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2]是23:58 GMT + 1 [0x10] 2B 25 CA 19 2之後的2007/12/25 F 43 E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2]是10:48 GMT + 1 [0x10] AA C0 2C 6E 35 43 E3 40 F1 64 [ 0x7] 2 [0x13] 1 [0x6] 6C [0x2]是2008年3月16日格林尼治標準時間+1 [0x10] EE 04 71 F2 B6 43 E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2]是2008年1月4日格林尼治標準時間14:31之後的某個時間+1 [0x10] 60 2C F9 45 4E 4F E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2]在10:32 GMT + 1 [0x10] 5D 84 01 14 74 64 E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2]之後的2008/04/08某個時間是2008/11/11 14:53 GMT + 1之後的時間 

,其中[0xN]表示由N個零組成的序列。

有什麼想法嗎?

更新

使用此工具: http://www.digital-detective.co.uk/freetools/decode.asp
我意識到這是Windows OLE日期/時間格式為64位。
根據該工具:

  D0 74 C4 FE 3F 42 E3 40表示26/12/2007 00:59  

您知道這種Windows 64位OLE日期/時間格式背後的數學原理是什麼嗎?

僅供參考,“ C”前綴通常在MFC程序中使用。
我正在嘗試使用Samsung PCStudio 3進行相同的操作。文件的格式是否與您相似,您對它的使用是否有所了解?
二 答案:
0xea
2013-05-26 22:17:19 UTC
view on stackexchange narkive permalink

很顯然,OLE日期時間基於雙精度值,其中整個部分是自紀元以來的天數,小數部分是該天的一部分。在 OLE日期的特殊內容部分中的時間格式轉換輕鬆中找到了一些信息。

OLE日期( VT_DATE)可能很棒:它們指定自紀元(1899年12月30日)以來的日期,小數部分給出了一天的分數(例如,中午為0.5)。浮點允許在曆元附近進行分辨率交換以進行長期計算。

負值需要分為整數和小數部分:例如-2.5表示從紀元後兩天開始半天(即將符號應用於整數部分,但不應用於小數部分)。這使數字錯誤特別麻煩,-2表示“距時代倒退了兩天”,結束於1899年12月28日。-1.9999999意味著倒退了一天,幾乎又向前走了整整一天,使您在Dec之前稍微走了一點1899年3月30日-相距幾乎兩天。

選擇該時期是為了使Excel與Lotus 1-2-3中的錯誤兼容,從而導致1900年1月和1900年2月的轉換不准確。有關詳細信息,請參見下面的鏈接列表。

我不知道這一點,多虧了lulz:)

是的,謝謝!我想我已經找到了解決辦法,一旦完成便會發布解決方案。順便說一句,OLE日期太亂了!
nimiq
2013-05-27 00:04:39 UTC
view on stackexchange narkive permalink

好吧,我找到了路!
[0x10]之後的前8個字節是小尾數十六進制的OLE日期。
我使用以下命令將它們轉換為python中的常規日期時間:

> import datetimeimport mathfrom struct import unpackdef ole_date_bin_to_datetime(ole_date_bin):“”“將OLE日期從二進制8字節小端十六進制格式轉換為日期時間”“”#轉換為OLE日期浮點數,其中:#-整數部分:從紀元開始的天數(1899/12/30 00:00)#-小數部分:一天中的百分比,其中0,5是中午date_float = unpack('<d',ole_date_bin)[0] date_decimal,date_integer = math.modf (date_float)date_decimal = abs(date_decimal)date_integer = int(date_integer)#計算結果res = datetime.datetime(1899,12,30)+ datetime.timedelta(days = date_integer)#將天數添加到ep res = res + datetime .timedelta(seconds = 86400 * date_decimal)#添加一天的百分比返回resname __name__ ==“ __main__”:print ole_date_bin_to_dateti我('\ xd0 \ x74 \ xc4 \ xfe \ x3f \ x42 \ xe3 \ x40')
您確定要增加百分比嗎?對於正值應該沒問題,但是對負值不確定(考慮到我在回答中提到的負值)。在您的情況下,您可能不必處理早於1899年的SMS消息:D
你是絕對正確的。剛剛編輯添加:date_decimal = abs(date_decimal)


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...