1

はじめに

SMS メッセージを含むバイナリ データ ファイルをリバース エンジニアリングしようとしています。
ファイルの名前は ems.idx4 で、約 5 年前に LG PhoneManager というソフトウェアを使用して、LG 携帯電話の SMS メッセージのバックアップ アーカイブとして作成されました。
LG PhoneManager の記述にどの言語が使用されたかはわかりませんが、バイナリ ファイルで "CObTree"、"CFolder"、"CMessage" などの文字列を読み取りました。どの言語が使用されていても。

問題

バイナリファイルの構造全体をデコードしましたが、これは非常に単純です。
デコードできなかった唯一の部分は、単一のメッセージの日付と時刻です。
日付と時刻がエンコードされているバイナリ部分を特定し、いくつかのデコードされた例を取得しました (メッセージの内容のおかげです)。
16 進数のバイナリ データ:

[0x10] D0 74 C4 FE 3F 42 E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2] is 2007/12/25 some time after 23:58 GMT+1
[0x10] 2B 25 CA 19 2F 43 E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2] is 2008/01/02 some time after 10:48 GMT+1
[0x10] AA C0 2C 6E 35 43 E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2] is 2008/01/02 some time after 16:03 GMT+1
[0x10] EE 04 71 F2 B6 43 E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2] is 2008/01/06 some time after 14:31 GMT+1
[0x10] 60 2C F9 45 4E 4F E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2] is 2008/04/08 some time after 10:32 GMT+1
[0x10] 5D 84 01 14 74 64 E3 40 F1 64 [0x7] 2 [0x13] 1 [0x6] 6C [0x2] is 2008/11/11 some time after 14:53 GMT+1

ここで、[0xN] は N 個のゼロのシーケンスを意味します。

何か案が?

アップデート

このツールを使用: http://www.digital-detective.co.uk/freetools/decode.asp
Windows 64 ビット OLE 日付/時刻形式であることに気付きました。
そのツールによると:

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

この Windows 64 ビット OLE 日付/時刻形式の背後にある計算について何か考えはありますか?

4

2 に答える 2

2

これは、エポック 1899 年 12 月 30 日からの日数 (および小数点以下の日数) を表す倍精度浮動小数点数です。

Windows を使用している場合は、VariantTimeToSystemTime関数を使用して、より使いやすい形式にすることができます。

unsigned char timeBytes[] = {0xD0,0x74,0xC4,0xFE,0x3F,0x42,0xE3,0x40};
double timeDouble = *(double*)&timeBytes;
SYSTEMTIME systemTime;
VariantTimeToSystemTime(timeDouble, &systemTime);

Windows を使用していない場合は、手動で変換する必要があると思います。それについて何か助けが必要な場合は、コメントでお知らせください。

于 2013-05-26T18:52:15.790 に答える
2

わかりました、道を見つけました!
[0x10] の後の最初の 8 バイトは、リトル エンディアン 16 進数の OLE 日付です。
私はそれらをPythonで通常の日時に変換しました:

import datetime
import math
from struct import unpack


def ole_date_bin_to_datetime(ole_date_bin):
    """
        Converts a OLE date from a binary 8 bytes little endian hex form to a datetime
    """
    #Conversion to OLE date float, where:
    # - integer part: days from epoch (1899/12/30 00:00) 
    # - decimal part: percentage of the day, where 0,5 is midday
    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)

    #Calculate the result
    res = datetime.datetime(1899, 12, 30) + datetime.timedelta(days=date_integer) #adding days to epoch
    res = res + datetime.timedelta(seconds = 86400*date_decimal) #adding percentage of the day
    return res


if __name__ == "__main__":
    print ole_date_bin_to_datetime('\xd0\x74\xc4\xfe\x3f\x42\xe3\x40')
于 2013-05-26T19:01:14.760 に答える