Home
Accesso / Registrazione
 di 

Code patching per microcontrollori OTP

OTP Code patching per microcontrollori OTP

Code patching per microcontrollori OTP

Uno dei colleghi miei, 5 anni fa, ha sviluppato un progetto sulla piattaforma 8051. Purtroppo, c'era un errore nel firmware che avrebbe condotto ad un fiasco e avrebbe potuto danneggiare la società. Il nostro capo ci ha chiesto se si poteva salvare il business ed uscire dalla crisi. Sapevo che la memoria interna del microcontrollore utilizzava la tecnologia EEPROM OTP (One Time Programming), e ho promesso di studiare il codice e provare di farlo funzionare.

Dopo un breve sondaggio, ho scoperto che si possono salvare i chips anche se questi sono stati già programmati.

Dunque, ho detto al capo che il codice poteva essere riparato. I distributori hanno richiamato i microcontrollori e hanno riprogrammato con il code patch. Tutti sono stati grati. Pero, nessuno non ha parlato di me o almeno per esprimere l'apprezzamento. Sembrava che il codice che si fosse riparato da solo. Ma dopo, molti dirigenti che hanno avuto i stessi problemi hanno chiesto il mio aiuto. Purtroppo non tutti i microcontrollori possono essere salvati se

  1. I microcontrollori sono mascherati durante il processo di produzione del silicio, o
  2. I microcontrollori sono bloccati, perché la zona non utilizzata è programmata con 0x00.

Che cos'è l'OTP

L'OTP è un processo derivato dalla EPROM, la EPROM può essere cancellata dalla luce UV. Questo metodo è popolare dai primi microcontrollori prodotti. Come il package ceramico è molto costoso, il package plastico della EPROM è sempre più popolare. Può essere cancellato (dirò come cancellarlo nel altro articolo) con un metodo speciale. Si tratta di una memoria One-Time-Programming, dal momento che non si può cancellare a causa del package. In ogni caso, ricordatevi che ogni byte nella EPROM può essere programmato da 0xFF a 0x00, e non in altro modo.

Hack 8051 and Patch it

Hacking 8051 and patch it


Qui è la mia realizzazione dettagliata del code patch. Come esempio utilizzo il linguaggio assembly e 8051, ma il principio si applica su tutte le piattaforme come il microcontrollore PIC, Z8 OTP.

Cerchiamo di studiare il firmware. Normalmente si può chiamare il codice che conduce ad un software bug "buggy code", il codice precedente a "buggy code" come "prior code", il codice di seguito il "buggy code" come "trailing code" e le patch "patch code". Questa terminologia è solo per riferimento.

In genere, il "buggy code" è di pochi byte, possiamo facilmente riprogrammarli in 0x00. Nel linguaggio assembly del 8051, 0x00 significa nessuna operazione ("NOP"). SE LA ZONA NON UTILIZZATA E' STATA PROGRAMMATA COME 0XFF, possiamo mettere il "patch code" li. E' meglio mettere il codice nello start addres di una memory section come 0x8000, 0x9000, 0xA000, perché questi indirizzi possono essere programmati nella zona "trailing code". Il problema più importante è come saltare al "patch code" e tornare indietro. Ricordate che solo il salto è adatto in alcune piattaforme di microcontrollori a causa di limitazioni di stack. E' molto delicato trovare "trailing code" per saltare al "patch code". La regola è di trovare un codice che può essere riprogrammato come "LJMP #patch_code", "AJMP #patch_code", "SJMP #patch_code". Devi interpretare "assembly pseudo code" in "hex code" correspondendo con "trailing code". Una limitazione maggiore è il salto relativo. Se c'è un salto relativo, ricalcolare la distanza relativa di salto e creare il nuovo "assembly code". Se trovate uno nel "trailing code", allora riprogrammate tutti i codici del "buggy code" con 0x00, che significa NOP. Segue un JMP a "patch code". Nel "patch code", scrivere la software patch e copiare tutti i "trailing code" in questa area, poi con un JMP ritornare all'indirizzo seguente del codice JMP. Se non e' possibile fare questo nella "trailling zone", allora cercare in "prior code".


Per esempio, c'è un "buggy code"al indirizzo 0x7122, vogliamo mettere "patch code" al indirizzo 0x8000. LJMP 0x8000 in "assembly code" dell' 8051 è 0x028000. AJMP 0x8000 nel "assembly code" dell' 8051 è 0x81,0x00. Vorrei trovare prima LJMP. Nel "trailing code" ho trovato un "assembly code" MOV R7, l'A all' indirizzo 0x7208, ovvero 0xFF. Sono contento di trovare 0xFF. Ma molti altri "assembly codes" sono buoni. Per esempio, sono buoni anche MOV A,@Ri, MOV @Ri,A dal momento che il codice può essere riprogrammato come 0x02. Ma ancora dobbiamo controllare se il "following code" può essere riprogrammato in 0x80 o no. Il prossimo byte 'è 0x83, che significa "MOV direct". Ho riprogrammato tutti questi tre sistemi in 0x028000, perché i codici che variano dal "buggy code " e l'indirizzo corrente sono riprogrammati in 0x00 come NO OPERATION nell'8051, questi frammenti di codice devono essere copiati in "patch code" cosi come con LJMP torna all' indirizzo seguente dell'indirizzo corrente (PC+1). In questo esempio dovrebbe essere PC+3 all'indirizzo di 0x720C, in quanto MOV direct ha bisogno di due bytes in più. Quindi aggiornare l' "assembly code" dell0 8051 e riprogrammare il dispositivo. Adesso dovrebbe funzionare. NOP introdurrà qualche piccolo ritardo, ma in generale è tutto a posto in non-time-critical task. Goditi l' hacking!

Ci sono alcune limitazioni per il "memory patching:"

  1. Lo spazio inutilizzato dovrebbe essere tutto a 0xFF;
  2. Abbastanza spazio inutilizzato per patching;
  3. Interrupt Service Routine non possono essere corrette cosi';
  4. AJMP, SJMP conducono ad un salto dell'indirizzo relativo, che significa che i "trailing bytes" sono cambiati nel "hex code" finale
  5. Lo stato del bit di sicurezza. Un microcontrollore non puo' essere programmato se il suo bit di sicurezza è programmato;
  6. Bisogna avere un profondo know-how della piattaforma del microcontrollore , in particolare dell' "assembly code";
  7. Posizione assoluta per assemblatori e compilatori. (Oggi sempre di più i progetti sono programmati in C, il "final hex code" puo' cambiare molto e dipende dal host OS, versione e modello del compilatore, utilizzo della memoria, tipo delle variabili utilizzate...).

Oggi sempre di più i microcontrollori utilizzano la memoria flash, mai i microcontrollori OTP sono relativamente poco costosi, in quanto la maggior parte dei processi del silicio sono molto vecchi.

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di Emanuele

Molto interessante Allan,

Molto interessante Allan, anche a me è capitato una volta con i PIC, molti anni fa, quando esistevano ancora gli OTP...
Mi ricordo che faticai molto a trovare il punto dove inserire il GOTO per la patch.
Da quel momento ho imparato a lasciare sempre un po di spazio nel microcontrollore, in particolare nelle zone basse della ROM dei PIC. Considerato che il GOTO nei PIC ha come opcode 101kkkkkkkkkkk (k è l'indirizzo di destinazione) è semplice saltare da una locazione di memoria piu bassa rispetto a quella originale e quindi trovare quella non programmata per inserire un ulteriore GOTO alla zona di PATCH.
Esempio:
ORG 0x00
....
.... (locazioni NON programmate)
....
0A50 GOTO ROM50

intervenire qui è molto semplice

ORG 0x00
....
(ROM40) 0ABB GOTO ROM_PATCH
....
0A40 GOTO ROM40

Infatti dove c'è un 5 (101) si può scrivere 4 (100)

MA ormai è solo un ricordo.... W i micro Flash

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ci sono attualmente 12 utenti e 63 visitatori collegati.

Ultimi Commenti