Question:
Décoder la date et l'heure dans une séquence de données binaires
nimiq
2013-05-26 21:20:27 UTC
view on stackexchange narkive permalink

INTRO↑

J'essaie de faire de l'ingénierie inverse sur un fichier de données binaires contenant des messages SMS.
Le fichier s'appelle ems.idx4 et a été créé avec un logiciel nommé LG PhoneManager il y a environ 5 ans en tant qu'archive de sauvegarde des messages SMS pour un mobile LG.
Je ne sais pas quelle langue a été utilisée pour écrire LG PhoneManager, mais dans le fichier binaire, j'ai lu des chaînes comme "CObTree", "CFolder "," CMessage ": peut-être que cet indice ne veut rien dire, peut-être qu'il suggère que Cobol / .net / quel que soit le langage utilisé.

J'ai décodé toute la structure du fichier binaire, ce qui est tout à fait clair.
La seule partie que je n'ai pas pu décoder est la date et l'heure des messages uniques.
J'ai identifié la partie binaire où la date et l'heure sont encodées et j'ai eu quelques exemples décodés (grâce au contenu du message).
Données binaires en hexadécimal:

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

où [0xN] signifie une séquence de N zéros.

Une idée?

MISE À JOUR

En utilisant cet outil: http://www.digital-detective.co.uk/freetools/decode.asp
J'ai réalisé que c'était Windows Format de date / heure OLE 64 bits.
Selon cet outil:

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

Avez-vous une idée du calcul derrière ce format de date / heure OLE Windows 64 bits?

Pour info, le préfixe «C» est généralement utilisé dans les programmes MFC.
J'essaie de faire exactement la même chose avec Samsung PCStudio 3. Avez-vous obtenu quelque part avec le format du fichier parce qu'il semble être assez similaire.
Deux réponses:
0xea
2013-05-26 22:17:19 UTC
view on stackexchange narkive permalink

Apparemment, la date-heure OLE est basée sur des valeurs doubles, où la partie entière est le nombre de jours depuis l'époque, et la partie fractionnaire est la fraction du jour. J'ai trouvé des informations dans La conversion du format de l'heure en toute simplicité dans la section, bien nommée, La méchanceté particulière des dates OLE.

Dates OLE ( VT_DATE) aurait pu être une grande: ils spécifient les jours depuis l'époque (30 décembre 1899), la partie fractionnaire donnant la fraction du jour (par exemple 0,5 pour midi). La virgule flottante permet d'échanger une résolution proche de l'époque pour des calculs à long terme.

Les valeurs négatives doivent être divisées en partie entière et fractionnaire: par exemple -2,5 signifie deux jours en arrière et une demi-journée en avant de l'époque (c'est-à-dire que le signe est appliqué à la partie entière, mais pas à la partie fractionnaire). Cela rend les erreurs numériques particulièrement gênantes, -2 signifie "deux jours en arrière par rapport à l'époque", se terminant le 28 décembre 1899. -1,9999999 signifie revenir en arrière un jour et presque une journée entière en avant, vous terminant juste un peu avant décembre 30, 1899 - presque deux jours d'intervalle.

L'époque a été choisie pour rendre Excel compatible avec un bogue dans Lotus 1-2-3, entraînant des conversions inexactes en janvier et février 1900. Pour plus de détails, voir liste de liens ci-dessous.

Je ne savais pas cela, merci pour un peu de lulz :)

Oui merci! Je pense que j'ai trouvé mon chemin, posterai la solution une fois faite. Btw, les dates OLE sont un tel gâchis!
nimiq
2013-05-27 00:04:39 UTC
view on stackexchange narkive permalink

Ok, j'ai trouvé mon chemin!
Les 8 premiers octets après [0x10] sont une date OLE en petit hexagone endian.
Je les ai convertis en un datetime régulier en python avec:

  import datetimeimport mathfrom struct import unpackdef ole_date_bin_to_datetime (ole_date_bin): "" "Convertit une date OLE d'une forme hexadécimale binaire de 8 octets en un format hexadécimal datetime" "" #Conversion en flottant de date OLE, où: # - partie entière : jours depuis l'époque (1899/12/30 00:00) # - partie décimale: pourcentage du jour, où 0,5 est midi 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) #Calculer le résultat res = datetime.datetime (1899, 12, 30) + datetime.timedelta (days = date_integer) #ajout de jours à epoch res = res + datetime .timedelta (seconds = 86400 * date_decimal) #adding pourcentage du jour return resif __name__ == "__main__": print ole_date_bin_to_dateti moi ('\ xd0 \ x74 \ xc4 \ xfe \ x3f \ x42 \ xe3 \ x40')  
êtes-vous sûr d'ajouter le pourcentage? cela devrait être correct pour les valeurs positives, mais pas sûr pour les valeurs négatives (étant donné que les valeurs négatives que j'ai mentionnées dans ma réponse) Dans votre cas, vous n'aurez probablement pas à gérer les SMS de plus de 1899: D
Tu as tout à fait raison. Juste édité en ajoutant: date_decimal = abs (date_decimal)


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...