come proteggere il codice da lettura

qsecofr:
e quindi tornando alla tua richiesta: sicuro che valga la pena rischiare di far incazzare il cliente dato che tanto il sorgente non lo recuperi comunque?

Dipende dal prodotto, può anche fregartene di non avere il sorgente se puoi recuperare l'eseguibile dal micro e poi riproduci l'hardware, col firmware copiato, e lo rivendi sotto costo perché prodotto in cina.
Ogni tanto sarebbe il caso di ragionare su quello che si dice in merito al copyright e al diritto di non farsi copiare il proprio lavoro.
Non credo che saresti molto contento se, dopo aver sudato le proverbiali sette camice per realizzare un prodotto, arriva il cinesino di turno che ti copia tutto e lo rivende a metà prezzo facendo fallire la tua azienda.

@qsecofr:
quel che dici può anche essere condivisibile, ma allora dovremmo estendere il discorso molto di più. Evito quindi di entrare nel merito altrimenti finisce in flame :wink:
Attenti che poi parliamo di un core software, quello di Arduino, che è sotto licenza GPL, ma questa non preclude il lucro, nel senso che io posso richiedere un compenso per il software prodotto, sono solo obbligato a ridistribuirlo sotto GPL ma non è scritto da nessuna parte che lo devo fare gratuitamente.

Torniamo a noi. Fischio85 ha esordito così:

fischio85:
sto lavorando su un progetto e mi è stato chiesto di rendere il codice non clonabile.

Per me può benissimo lavorare a progetto e quindi questa è la richiesta del committente. Dato che è il committente che paga, se gli viene chiesto come proteggere da lettura il micro lui deve proteggere da lettura il micro.

EDIT:
postato insieme ad astrobeed, a cui mi associo al discorso relativo alla clonatura del firmware per la riscrittura su migliaia di copie del tuo dispositivo.

...be ero/sono programmatore... non più ma prendevo anche soldi col lavoro che facevo e so cosa significa tutela del software ma siccome qui si sta parlando di un arduino pensavo - forse sbagliando - che

  1. ci fosse anche tutto un workaround di hardware accanto che "diluisce" di molto l'incidenza in euro del software
  2. il software fosse tutto sommato "semplice"
  3. il progetto fosse limitato a "uno o comunque pochi arduino" (magari se hai una scheda da vendere in migliaia di copie non usi arduino ma ti fai fare il tuo pcb con il tuo atmel eccetera)
    pertanto ho portato ANCHE un altro punto di vista...sarà poi "fischio" a decidere se la mia casistica che ho portato a puro titolo di esempio sia lontana o vicina al lavoro che sta facendo

Vi ringrazio per le informazioni!
Lo so che arduino è openSource ma purtroppo quando sono entrato a lovorare su questo progetto era gia stato improntato in questo modo
ed ora non ho altra scelta che portarlo a termine.
Non mi è chiara ancora una cosa, per programmare arduino con avrdude posso avvalermi di un altro arduino o devo utilizzare un programmatore come quello che
ho menzionanto nel primo post.
Forse faccio domande banali ma per me non lo sono :smiley:

Se hai a disposizione un Arduino UNO puoi programmare i fuse dell'Arduino MEGA con la prima scheda seguendo la guida del Menniti. Se qualcosa non ha funzionato, è stato sicuramente per un tuo sbaglio perché la guida è a prova di bomba :wink:
Che parametri hai passato ad avrdude sul terminale per impostare i fuse dell'Atmega2560?

Diciamo che sto iniziando a capirci qualcosa adesso e non ho ancora utilizzato avrdude per programmare i fuse bit.
Praticamente ho due arduino mega 2560 dei quali uno sembra non funzionare più, quando faccio il caricamento di uno sketch non si accendono più i led tx ed rx, cosi ho
provato a seguire la guida di Menniti per fare il burn del bootloader tramite la programazione avrisp.
Ho collegato i due arduini con il connettore isp come spiegato sempre nella guida, ma mi da errori e non riesco ad effettuare neanche questo tipo di operazione.
Ho aggiunto anche il condensatore da 10 micro al pin di reset ma nulla è cambiato.
Forse ho un arduino che non funziona più a sto punto,o semplicemente sto sbagliando qualcosa. :cold_sweat:
Se riuscissi ad effettuare questa operazione potrei passare alla programmazione dei fuse bit, anche perchè con un solo arduino funzionante non riesco a programmare nulla.
Ti chiedo una cosa che comando devo utilizzre per fare l'erase del arduino "rotto" tramite avrdude senza passare dall' IDE?
Leo ti ringrazio per le dritte che mi stai dando :slight_smile:

fischio85:
Diciamo che sto iniziando a capirci qualcosa adesso e non ho ancora utilizzato avrdude per programmare i fuse bit.
Praticamente ho due arduino mega 2560 dei quali uno sembra non funzionare più, quando faccio il caricamento di uno sketch non si accendono più i led tx ed rx, cosi ho
provato a seguire la guida di Menniti per fare il burn del bootloader tramite la programazione avrisp.
Ho collegato i due arduini con il connettore isp come spiegato sempre nella guida, ma mi da errori e non riesco ad effettuare neanche questo tipo di operazione.
Ho aggiunto anche il condensatore da 10 micro al pin di reset ma nulla è cambiato.

Una domanda. Hai adattato i pin per l'uso con la MEGA?
Sulla UNO che programma si usano i pin 10/11/12/13 come uscite per i segnali diretti verso l'altra scheda ma sulla MEGA i pin cambiano.

Forse ho un arduino che non funziona più a sto punto,o semplicemente sto sbagliando qualcosa. :cold_sweat:
Se riuscissi ad effettuare questa operazione potrei passare alla programmazione dei fuse bit, anche perchè con un solo arduino funzionante non riesco a programmare nulla.
Ti chiedo una cosa che comando devo utilizzre per fare l'erase del arduino "rotto" tramite avrdude senza passare dall' IDE?
Leo ti ringrazio per le dritte che mi stai dando :slight_smile:

Per azzerare una scheda basterebbe dare
avrdude -c stk500v1 -p m2560 -P /dev/ttyACM0 -b 19200 -e

"-c" specifica il programmatore, stk500v1 è l'Arduino;
"-p" indica il micro da programmare
"-P" la porta da usare
"-b" la velocità di comunicazione (usando l'ArduinoISP la velocità deve essere sempre 19200)

Ho provato la linea di codice che mi hai dato e mi ha dato questo output:

C:\Users\stefano>avrdude -c stk500v1 -p m2560 -P /dev/ttyACMO -b 19200 -e
avrdude: ser_open(): can't open device "/dev/ttyACMO": The system cannot find th
e path specified.

Ho modificato la porta che mi avevi scritto tu con la COM3 e questo è stato il risultato:

C:\Users\stefano>avrdude -c stk500v1 -p m2560 -P COM3 -b 19200 -e
avrdude: stk500_getsync(): not in sync: resp=0x00

avrdude done. Thank you.

Secondo te l'erase è andato a buon fine?
connettendo l'aruino all' usb ho il lead L che lampeggia e non mi fa caricare nulla, ha lo stesso comportameno
che aveva prima di fare l'erase con avrdude!!!

fischio85:
Secondo te l'erase è andato a buon fine?

Sicuramente no.

Ma hai collegato l'Arduino MEGA programmatore e l'altro Arduino MEGA come è mostrato nel link che ti ho dato?
Anzi, dimmi tu: come hai le schede?

Questo è quello che ho ottenuto con il condensatore di reset che non avevo inserito nella prova precedente!!

C:\Users\stefano>avrdude -c stk500v1 -p m2560 -P COM3 -b 19200 -e

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 1.94s

avrdude: Device signature = 0x000000
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.

avrdude done. Thank you.

Come prima lampeggia sempre il led L.

c'è lo fatta :smiley: :grin: l'arduino è vivo!!!
grazie mille,il prossimo passo e modificare i fuse grazie ancora per le dritte.
Appena mi ci metto ti faccio sapere come va:) sono stra contento!!!

fischio85:
c'è lo fatta :smiley: :grin: l'arduino è vivo!!!
grazie mille,il prossimo passo e modificare i fuse grazie ancora per le dritte.
Appena mi ci metto ti faccio sapere come va:) sono stra contento!!!

Pro posteri, com'è che hai fatto? Cosa c'era che non andava?

fischio85:
Salve mi chiamo Stefano e sono nuovo utente del forum, sarei infinitamente grato se qualcuno riesce a d..............................................
Per la programmazione isp ho individuato anche un programmatore specifico , che è l' avr pololu.
Mi consigliate di acquistare un programmatore o la cosa è fattibile anche utilizzando arduino come programmatore?
**Ogni risposta e ben accetta!!! **

mah forse stai perdendo tempo
tieni sempre a mente che qualsiasi programmatore (serio) di arduino,
in 2 ore riesce a duplicarti il programma,

basta che "osserva" le uscite/entrate

e in un modo o nell'altro ha un programma simile che fa le stesse identiche cose che fa il tuo sketch,

la protezione puo essere messa quando ci sono dei pericoli hardware

per il resto è inutile

la scopiazzatura ci puo stare per uno che è proprio agli inizi ma poi dopo qualche mese uno si fa tutto da solo perche le cose vengono molto meglio

gingardu:
tieni sempre a mente che qualsiasi programmatore (serio) di arduino,
in 2 ore riesce a duplicarti il programma,

basta che "osserva" le uscite/entrate

e in un modo o nell'altro ha un programma simile che fa le stesse identiche cose che fa il tuo sketch,

Scusami gingardu ma dissento perché non è sempre così facile replicare ciò che fa un programma osservando solo gli I/O. Posso concordare con te che replicare un circuito è facile perché basta osservarlo e ricostuirlo pari pari, ma un software non è così facile da replicare. Il reverse engineering (retroingegnerizzazione) non è un'operazione da 2 ore.

fischio85:
c'è lo fatta :smiley: :grin: l'arduino è vivo!!!
grazie mille,il prossimo passo e modificare i fuse grazie ancora per le dritte.
Appena mi ci metto ti faccio sapere come va:) sono stra contento!!!

Sappi che si puó resettare i fuse del microcontroller, ma in quel caso si cancella tutto il programma memorizzato.
Si ha dopo un ATmega vergine.

Ciao Uwe

Ho utilizzato il collegamento pin to pin fra i due arduini mega come descritto nella guida di Menniti e con il relarivo condensatore da 10 micro per protezione dall'autoreset.
Nell'arduino arduino programmatore ho caricato lo sketch isp.
Poi come mi hai spiegato tu ho utilizzato la linea di comando di avrdude per fare l'erase del micro.
Il passo successivo è quello di effettuare il caricamento del bootloader con i relativi lock bits modificati, giusto?
Correggimi se sbaglio, per effettuare il caricamento del bootloader attraverso avrdude devo utilizzare il file boards opportunamente modificato.
il valore dei fuse li prelevo dal sito: AVR® Fuse Calculator – The Engbedded Blog

I lock bit li devi modificare dopo aver scritto il firmware. Inoltre se hai una MEGA funzionante, essa ha già il bootloader, quindi l'operazione di caricarcelo sopra non è necessaria.

Io farei quindi così: prendi la seconda MEGA, la colleghi alla prima, ci flashi lo sketch che vuoi registrarci, poi apri un terminale e, usando la prima come programmatore ISP (mi pare che la MEGA sia vista come STK500v2 da avrdude), scrivi i lock bit per bloccare la lettura del firmware.
Controlli se effettivamente la lettura è disattivata, controlli se la scheda è perfettamente funzionante, cioè se esegue correttamente il programma, e solo allora disattivi sempre con avrdude la programmazione SPI ed il pin di reset in modo che la scheda non sia più neanche riprogrammabile.

Da ora in poi la scheda non può essere più modificata. L'unico modo per tornare indietro è usare un programmatore H/V con spedisca i 12V sul pin di reset.

ATTENZIONE: declino ogni responsabilità per schede bloccate e/o non più utilizzabili. Esegui l'operazione a tuo rischio e pericolo.

Grazie ancora per le tue pronte risposte :), ti chiedo un altra cosa e poi penso di essere apposto.
Se io setto solo i lock bits senza andare a disabilitare la spi e il reset, si ha la possibilità la possibilità di estrarre il firmware?
Cio che importa a me è che non sia possibile la lettura, poi se capita che qualcuno vada a spingere il reset o provi a leggere l'arduino si arrangia!!
l'impottante è che non riesca a recuperare il firmware.(Se posso fare a meno di disabilitare il bit SPIEN ne faccio a meno, questo per non rischiare di bloccare l'arduino)
Nel sito http://www.engbedded.com non riesco a capire come devo fare per impostare i lock bits, perchè gli autput sono solo i fuse low, high ed extended.
Non menziona i lock bits. come devo procedere??

leo72:

gingardu:
tieni sempre a mente che qualsiasi programmatore (serio) di arduino,
in 2 ore riesce a duplicarti il programma,

basta che "osserva" le uscite/entrate

e in un modo o nell'altro ha un programma simile che fa le stesse identiche cose che fa il tuo sketch,

Scusami gingardu ma dissento perché non è sempre così facile replicare ciò che fa un programma osservando solo gli I/O. Posso concordare con te che replicare un circuito è facile perché basta osservarlo e ricostuirlo pari pari, ma un software non è così facile da replicare. Il reverse engineering (retroingegnerizzazione) non è un'operazione da 2 ore.

ma se uno sa il fatto suo dovrebbe far fare tutto quello che vuole ad arduino un circuito che fa una determinata cosa è un attimo a copiarlo

se uno fa un circuito con arduino che tutte le entrate analogiche leggono sensori analogici di temperatura lo si può replicare al volo

senza rispettare ogni singola sillaba o sequenza,

questo per quanto riguarda le capacita/memoria di arduino

ovviamente se prendiamo software da centinaia di megabyte il discorso cambia

poi la protezione più efficace che conosco e cancellare le sigle sugli integrati e una bella colata di gomma liquida sullo stampato

fischio85:
Grazie ancora per le tue pronte risposte :), ti chiedo un altra cosa e poi penso di essere apposto.
Se io setto solo i lock bits senza andare a disabilitare la spi e il reset, si ha la possibilità la possibilità di estrarre il firmware?
Cio che importa a me è che non sia possibile la lettura, poi se capita che qualcuno vada a spingere il reset o provi a leggere l'arduino si arrangia!!

l'impottante è che non riesca a recuperare il firmware.(Se posso fare a meno di disabilitare il bit SPIEN ne faccio a meno,
questo per non rischiare di bloccare l'arduino)

OK.
Allora procedi come ti ho detto.
Programmi lo sketch normalmente. Poi alla fine ti armi di terminale ed imposti i lock bit e basta.

Nel sito http://www.engbedded.com non riesco a capire come devo fare per impostare i lock bits, perchè gli autput sono solo i fuse low, high ed extended.
Non menziona i lock bits. come devo procedere??

I lock bit si impostano specificando ad avrdude di modificare questa parte di memoria (i lock bit sono registri, indi per avrdude sono un tipo di memoria). Il parametro da usare è "-U", la memoria da specificare "lock".

avrdude -c stk500v2 -p m2560 -P COM3 -b 19200 -U lock:w:0x00:m -D

dovrebbe fare al caso tuo.
Ho messo "stk500v2" come programmatore perché mi sembra che l'ArduinoISP per i Mega emuli questo programmatore, però se tu hai usato una voce differente e ti ha funzionato, usala.
Non specificare nient'altro, tu devi solo cambiare i lock bit, non il resto della memoria. Il parametro "-D" serve apposto per non far toccare la Flash.