Jumping Jack Flash weblog

Symbian messages format (before 9.x version)

Posted in Symbian, Symbian UIQ by jumpjack on 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 “0x25 0x3A 0x00 0x10”
RECEIVEDFLAG_MARKER = chr$(32)+chr$(41)+chr$(52)+chr$(24) ‘ SEQUENCE 0x20 0x29 0x34 0x18;
’10 bytes after sequence beginning there is the  SENT/RECEIVED flag (0x00=rec, 0x01=sent)

‘ BINARY SEQUENCE “0x25 0x3A 0x00 0x10” 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 0x05 (I.E. UID=SEARCHSTRING).

“0x34 0x18 0x00” (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

17 Risposte

Subscribe to comments with RSS.

  1. slux said, on 2 febbraio 2008 at 21:15

    o,O abbastanza confuso! comunque grazie!

  2. jumpjack said, on 2 febbraio 2008 at 22:27

    L’hai detto!😉

  3. buh said, on 26 febbraio 2008 at 15:13

    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 said, on 26 febbraio 2008 at 15:30

    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 said, on 26 febbraio 2008 at 15:57

    …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 said, on 26 febbraio 2008 at 17:55

    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 said, on 11 gennaio 2009 at 17:39

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

  8. Slux said, on 12 gennaio 2009 at 22:47

    Grande..

  9. Luca said, on 25 settembre 2009 at 23:06

    perche’ nel calcolo dei giorni:

    dbldays = hex2dec(s)/86400000000-12

    viene sottratto 12?

    Grazie, Luca.

    • jumpjack said, on 26 settembre 2009 at 19:57

      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 said, on 26 settembre 2009 at 20:02

      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 said, on 13 ottobre 2009 at 21:46

    ‘ 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 0x253a0010 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’ 0x02).
    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 said, on 14 ottobre 2009 at 9:22

      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 said, on 14 ottobre 2009 at 17:41

        Intendevo dire che ad una lunghezza maggiore del messaggio corrispondono via via 0x02, 0x03, 0x04, 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 0x02 il calcolo credo sia quello riportato nel mio precedente messaggio, ma non vale pero’ nel caso in cui il byte valga 0x03 o 0x04.
        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 0x03 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 0x04 (255 + (byte-1) / 4) e cosi’ via, ma non ho ancora potuto controllare.

        Ciao, L-

        • jumpjack said, on 15 ottobre 2009 at 17:48

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

  11. […] Symbian messages format (before 9.x version) […]


Puoi inserire un commento qui sotto; diventerà visibile dopo la moderazione dell'amministratore

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: