我正在尝试对包含sms消息的二进制数据文件进行逆向工程。
文件名为ems.idx4,是由大约5年前使用LG PhoneManager软件创建的LG手机的SMS消息的备份存档。这个线索没有任何意义,也许暗示使用了Cobol / .net /任何语言。
问题
我解码了二进制文件的整个结构,这很简单tho。
我唯一无法解码的部分是单个消息的日期和时间。
我确定了对日期和时间进行编码的二进制部分,并得到了一些解码示例(由于的内容消息)。
十六进制的二进制数据:
[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-det ective.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日期/时间格式背后的数学原理吗?
#1 楼
显然,OLE日期时间是基于double值的,其中整个部分是自纪元以来的天数,而小数部分是该天的一部分。在OLE日期的特别讨厌的部分的适当命名的时间格式转换中找到了一些信息。 30,1899年),小数部分表示一天中的小数部分(例如中午为0.5)。浮点允许在历元附近进行分辨率交换以进行长期计算。负值需要分为整数和小数部分:例如-2.5表示从纪元后两天开始半天(即将符号应用于整数部分,但不应用于小数部分)。这使数字错误特别麻烦,-2表示“距时代倒退了两天”,结束于1899年12月28日。-1.9999999意味着倒退了一天,几乎又向前走了整整一天,使您在12月之前略有结束1899年3月30日,相差将近两天。
选择那个纪元来使Excel与Lotus 1-2-3中的错误兼容,从而导致1900年1月和1900年2月的转换不准确。 。
我不知道,多亏了lulz :)
评论
是的,谢谢!我想我已经找到了解决办法,一旦完成便会发布解决方案。顺便说一句,OLE日期太乱了!
– nimiq
13年5月26日在18:27
#2 楼
好的,我找到了方法![0x10]之后的前8个字节是小尾数十六进制的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')
评论
您确定要增加百分比吗?对于正值应该没问题,但是对负值不确定(鉴于我在回答中提到了负值)。在您的情况下,您可能不必处理早于1899年的SMS消息:D
–0xea
13年5月26日在21:06
你是绝对正确的。刚刚编辑添加:date_decimal = abs(date_decimal)
– nimiq
13年5月26日在21:29
评论
仅供参考,“ C”前缀通常在MFC程序中使用。我正在尝试使用Samsung PCStudio 3进行相同的操作。文件的格式是否与您相似?