Jumping Jack Flash weblog

Symbian messages format (before 9.x version)

Pubblicato da jumpjack su 2 Febbraio 2008

Some notes about binary format of SMS files on Symbian UIQ (partially applicable to Symbian series60).

SEARCHSTRING = chr$(37)+chr$(58)+chr$(0)+chr$(16) ‘ SEQUENCE “0×25 0×3A 0×00 0×10″
RECEIVEDFLAG_MARKER = chr$(32)+chr$(41)+chr$(52)+chr$(24) ‘ SEQUENCE 0×20 0×29 0×34 0×18;
‘10 bytes after sequence beginning there is the  SENT/RECEIVED flag (0×00=rec, 0×01=sent)

‘ BINARY SEQUENCE “0×25 0×3A 0×00 0×10″ IS JUST BEFORE MESSAGE BODY BEGINING.
‘ IF TWO BYTES AFTER THE “10″ THERE IS A “02″, THE MESSAGE IS FROM A SPECIAL
‘ NUMBER AND ITS BODY STARTS AT BYTE AFTER THE “02″; ELSE BODY STARTS
‘ EXACTLY TWO BYTES AFTER “10″.

‘ IT IS AN SMS ONLY IF “SEARCHSTRING” IS PRESENT (INIZIO<>0), (both s60 and UIQ)
‘ BUTNOT AT OFFSET 0×05 (I.E. UID=SEARCHSTRING).

“0×34 0×18 0×00″ (BODY END) (both s60 and UIQ)

‘ DETERMINING IF SMS OR NOT:
inizio = instr(SMSMemo,SEARCHSTRING)+ (len(SEARCHSTRING)+1)
if inizio <> 5 and mid$(SMSMemo,22,2) <> chr$(162)+chr$(4) then ‘ IF “A2 04″ THEN… (???? not a message??)
if asc(mid$(SMSMemo,inizio))<32 then
inizio = inizio + 1 ‘ ???
end if

‘ GETTING BODY:
FineTesto = instr(inizio,SMSMemo,chr$(52)+chr$(24)+chr$(0))-3 ‘ LOOK FOR “34 18 00″ (BODY END) (both s60 and UIQ)
BASE = FineTesto
InizioTesto = inizio
LunghezzaTesto = FineTesto-inizio

‘ DETERMINING IF SENT OR RECEIVED:
if asc(mid$(SMSMemo,instr(SMSMemo,RECEIVEDFLAG_MARKER)+10,1)) = 0 then  [RECEIVED MESSAGE]

‘ **** RECEIVED MESSAGE ***

‘ FINDING SENDER NUMBER;
‘ NOTE: sender NAME is not available unless looking for it into local phonebook.
SenderBeginning = BASE + SENDER_OFFSET
SenderEnd = instr(SenderBeginning,SMSMemo,chr$(57)+chr$(0))
if SenderEnd = 0 then ‘ IF SPECIAL NUMBER…
if debug<>0 then LogFile.WriteLine( “SPECIAL NUMBER?!?”)
SenderEnd = instr(SenderBeginning,SMSMemo,chr$(0)+chr$(0))
end if
SenderEnd = SenderBeginning + asc(mid$(SMSMemo,SenderBeginning-1,1))/4

‘ EXTRACTING TIMESTAMP
TimestampBeginning = SenderBeginning – TIMESTAMP_RECEIVED_OFFSET

‘ PROCESSING TIMESTAMP:
microdate(hexstring$(mid$(SMSMemo,TimestampBeginning,8)))
‘ 8 bytes long; counting microseconds since year A.D. 0 (see Microdate() functuin below)

‘***** SENT MESSAGE *****

‘EXTRACTING TIMESTAMP:
TimestampBeginning = BASE + TIMESTAMP_SENT_OFFSET

‘ EXTRACTING RECIPIENT
RecipientBeginning = BASE + RECIPIENT_OFFSET
RecipientEnd = RecipientBeginning + asc(mid$(SMSMemo,RecipientBeginning-1,1))/4-1
RecipientName = mid$(SMSMemo,RecipientEnd+2,LunghezzaNome)

function microdate(s as string) as string
DefInt y,m,d,intdays,intmin,inthours,intseconds
DefLng dd,lngdays
DefDbl dbldays,decimals,hours,minutes,seconds
dim debug as string

debug = s
dbldays = hex2dec(s)/86400000000-12
lngdays = int(dbldays)
dd = datefromserial(lngdays,y,m,d)
if y < 1997 then
microdate=”[ERROR]“
‘EXIT FUNCTION
end if
y=y-1 ‘ TIMESERIAL STARTS COUNTING FROM AD 1, SYMBIAN STARTS FROM AD 0.
decimals = dbldays-lngdays
hours = decimals*86400/3600
minutes = (hours – int(hours))*60
seconds = (minutes-int(minutes))*60
inthours = int(hours)
intmin= int(minutes)
intseconds = int(seconds)
microdate = lead0$(y) & “/” & lead0$(m) & “/” & lead0$(d) & ” ” & lead0$(inthours) & “:” & lead0$(intmin) & “:” &lead0$(intseconds)
end function

16 Risposte a “Symbian messages format (before 9.x version)”

  1. slux detto

    o,O abbastanza confuso! comunque grazie!

  2. jumpjack detto

    L’hai detto! ;-)

  3. buh detto

    Partendo dalla versione di Jumpjack ho scritto in Java un programma che dalla cartella Mail2 (S60 3rd, Nokia E51) salvata su PC (io ho un Mac) salva in un file sms.txt tutti gli sms ordinandoli per ora di arrivo (quindi si legge la conversazione). Sono 4 classi, il programma main è in Sms1.java. Ho dovuto cambiare un po’ i match per individuare i campi, forse dipende dalle differenze tra UIQ e S60. Qualcuno lo vuole provare su UIQ?
    Supergrazie a jumpjack per il preziosissimo punto di partenza.
    Perché non ho usato la versione di jumpjack? Non ho un Windows, non ho VB, comunque mi mancavano pezzi per fare un programmino completo :-)
    Keywords: S60 sms file format internal raw

    Edit: sorgenti rimossi perche’ formattati male dal blog.
    Si possono scaricare da qui:
    http://www.planetmobile.it/jumpjack/sms.zip

  4. jumpjack detto

    Fantastico! Un commento che, oltre a non essere uno SPAM <:-/ , è anche utilissimo!
    Quindi ora abbiamo un programma totalmente portabile (perche’ in java) per esportare i messaggi dai Symbian s60-3d. Vedro’ di provarlo, appena posso, su UIQ 2.1 e su s60-2nd.

    Ma siccome gia’ so che non riusciro’ a compilarlo perche’ io e java non andiamo d’accordo… (maledetto classpath!!!), potresti mettere online da qualche parte un .jar gia’ pronto per essere lanciato sul PC?
    Se poi puoi uppare anche il sorgente con l’indentatura corretta (qui nel blog si è persa del tutto), anche meglio! ;-)

    Grazie.

  5. buh detto

    …hai un metodo per uploadare un zip o un jar o un indirizzo email al quale posso mandarti? Sai…. io sono un po’ paranoico e preferisco restare “anonimo” :-)
    Ho provato a decodificare anche il file Index ma ho avuto qualche problema (quindi alla fine ho fatto lo scan della dir degli sms).
    Su S60-2nd la cartella si chiama mail e non Mail2 (non per te che lo sai già ma se qualcuno legge e vuole adattare). Immagino che su S60-2nd funzioni tutto visto che per spostare gli sms tra una versione e l’altra basta copiare la directory.
    Bisognerebbe chiedere a Nokia se e quanto si arrabiano a diffondere queste info, visto che pare se le tengano strette.

  6. jumpjack detto

    non hai un sito tuo dove mandare i file?
    cmq la mia mail è jumpjack at libero dot it.

    Davvero da 3rd a 2nd basta copiare i file?!? Forte!

    Quanto al file INDEX… è un vero bordello, visto che contiene TUTTI i messaggi: non solo SMS, ma anche MMS, email, e probabilmente anche IRDA e Bluetooth!
    Certo, se riuscisse a “craccare” si potrebbero anche importare i messaggi, oltre che esportarli…

  7. Slux detto

    umm.. il codice java e’ un pochino sballato! Mancano parentesi qua e la’.. inoltre alcune funzioni non esistono :(

  8. Slux detto

    Grande..

  9. Luca detto

    perche’ nel calcolo dei giorni:

    dbldays = hex2dec(s)/86400000000-12

    viene sottratto 12?

    Grazie, Luca.

    • jumpjack detto

      E chi se lo ricorda…. Immaginio sia “colpa” di Papa Gregorio XIII…
      http://it.wikipedia.org/wiki/Calendario_gregoriano#Regole

      Pero’ la regola sarebbe di saltare 10 giorni, non 12, quindi boh? Si vede che siccome non mi tornavano i conti nel sistema symbian, ho aggiunto una mia riforma personale… ;-)
      Maledetti commenti al codice…. Quando scrivi programmi non ti va mai di metterli, poi quando rileggi il programma 2 anni dopo…!!!

    • jumpjack detto

      ah, mi sembra che un altro giorno si “perdesse” anche perche’ a seconda dell’algoritmo usato per il calendario, l’inizio dei tempi è il 1/gennaio/0000 o lo zero/gennaio/0000 (!!!) O era lo 0/1/1970?
      Era tutto un gran casino, ricordo… Mi sa che ti conviene prendere il codice cosi’ com’è (se funziona, ovviamente, ma ci vuole poco a verificare).

  10. Luca detto

    ‘ BINARY SEQUENCE “0×25 0×3A 0×00 0×10″ IS JUST BEFORE MESSAGE BODY BEGINING.
    ‘ IF TWO BYTES AFTER THE “10″ THERE IS A “02″, THE MESSAGE IS FROM A SPECIAL
    ‘ NUMBER AND ITS BODY STARTS AT BYTE AFTER THE “02″; ELSE BODY STARTS
    ‘ EXACTLY TWO BYTES AFTER “10″.

    Siamo sicuri che sia proprio cosi’?
    A me sembrerebbe invece che dopo la sequenza 0×253a0010 segua un byte che misura la lunghezza del messaggio da calcolarsi cosi’:

    valore del byte / 2 -1

    il calcolo pero’ vale solo se il messaggio e’ lungo fino a 126 caratteri, perche’ altrimenti troveremo un altro byte subito dopo (che non sempre e’ 0×02).
    Nel caso di una sequenza 0x..02, il calcolo sembrerebbe diventare:

    lunghezza messaggio – 127 = (valore byte -1) / 4

    Ma come si calcola 0x..03 o 0x..04?

    Thx, Luca.

    • jumpjack detto

      Non so che dirti, non esistendo documentazione ufficiale, ho tirato a indovinare esaminando vari messaggi. E puo’ darsi anche che nel tempo il formato sia cambiato!
      Pero’ non ho capito la tua ultima domanda.

      • Luca detto

        Intendevo dire che ad una lunghezza maggiore del messaggio corrispondono via via 0×02, 0×03, 0×04, etc.. nel byte successivo a quello che normalmente conterrebbe la lunghezza se il messaggio fosse lungo fino a 126 caratteri.
        Nel caso il byte successivo fosse appunto 0×02 il calcolo credo sia quello riportato nel mio precedente messaggio, ma non vale pero’ nel caso in cui il byte valga 0×03 o 0×04.
        A senso direi che il ragionamento potrebbe essere analogo, cioe’ nel byte della lunghezza e’ possibile codificare al massimo un messaggio di:

        127 + (252 / 4) = 190 caratteri

        quindi direi che se il byte successivo fosse 0×03 bisognerebbe adattare la formula con:

        191 + (byte -1)/ 4 = caratteri nel messaggio (quindi 254 al massimo)

        Penso che il ragionamento possa essere esteso poi a 0×04 (255 + (byte-1) / 4) e cosi’ via, ma non ho ancora potuto controllare.

        Ciao, L-

  11. jumpjack detto

    prova a ragionare per “settetti” invece che “ottetti”, magari i numeri tornano meglio. “Ai primordi” si usavano quelli, per codificare gli SMS.

Lascia un commento

XHTML: Puoi usare questi tag: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>