Libreria in formato HEX

Buongiorno a tutti.

Vorrei creare una libreria che fosse in .hex (o altra estensione) ma che nel contempo fosse possibile usarla con un normale sketch, quindi in pratica non leggibile e non modificabile.

Domanda è possibile nell'ide avere una lib hex e richiamare le varie funzioni di essa con un normalissimo sketch ? Oppure altri metodi che portino allo stesso risultato. L'ideale sarebbe con Ide arduino che tutti conoscono.

grazie

pablos:
Vorrei creare una libreria che fosse in .hex (o altra estensione) ma che nel contempo fosse possibile usarla con un normale sketch, quindi in pratica non leggibile e non modificabile.

In formato hex no, la puoi usare sotto forma di libreria precompilata in formato binario, tocca vedere se è possibile gestirla dal IDE dato che va inclusa durante il linking.

Grazie, Posso provare con una semplicissima lib già fatta e funzionante .h, cosa uso per convertirla in bin?
Sempre sia possibile fare una conversione.

ciao

Non è strettamente necessario che tutta la libreria sia illeggibile, può la newlib.h richiamare una chiave o poche istruzioni scritta su un.bin?

ciao

Al limite potresti usare una sorta di oscuramento del codice, come fanno con jquery. Anche se rimane in formato testo, all'atto pratico diventa incomprensibile.

pablos:
Grazie, Posso provare con una semplicissima lib già fatta e funzionante .h, cosa uso per convertirla in bin?
Sempre sia possibile fare una conversione.

ciao

Secondo me se compili uno sketch che richiama una libreria nel folder temporaneo troverai il .o della libreria. Naturalmente dovrai poi “andare in giro” con .o e .h perchè nel chiamante comunque devi includere il .h in chiaro.

... mah ... secondo me NON ci riesci, semplicemente perché nell'IDE NON è prevista questa cosa e si aspetta di trovare sempre i sorgenti di ogni #include che fai.

Ovvio che "modificando" l'opportuna riga che si trova in platform.txt, nell'interno dell'IDE, aggiungendo i .o compilati, la cosa sarebbe fattibile, ma NON con l'IDE che viene normalmente distribuito a tutti gli utenti.

La verità che è sbagliato chiamare librerie quelle che si usano con Arduino perché, in realtà, sono solo dei moduli sorgenti da compilare ...
... le vere librerie sono precompilate e, normalmente, contengono il codice oggetto per tutte le piattaforme che vuoi supportare (ricorda che, ad esempio, il compilato per il 328P NON va bene per il Tiny85).

Guglielmo

fratt:
Al limite potresti usare una sorta di oscuramento del codice, come fanno con jquery. Anche se rimane in formato testo, all'atto pratico diventa incomprensibile.

Ecco, questa magari, se vuoi proteggere il codice, è una strada praticabile ...
... prendi un obfuscator per C/C++ (... QUESTO è un esempio, ma se fai un po' di ricerche con Google ne trovi parecchi) e rendi il codice ... praticamente illeggibile/incomprensibile :wink:

Guglielmo

pablos:
Grazie, Posso provare con una semplicissima lib già fatta e funzionante .h, cosa uso per convertirla in bin?

Semplicemente devi compilare solo la parte di codice che ti interessa, il singolo file o assieme di file, senza eseguire il link, alla fine hai un file objetc che è il precompilato.
Con gcc non ho mai avuto l'esigenza di creare dei file .lib, lo faccio normalmente con altri ambienti di sviluppo, quindi non so quale sia la procedura, volendo potresti lasciare il file object, con relativo file .h, da linkare assieme al resto del codice quando compili, il problema è farlo da IDE di Arduino visto che compila con una sua logica e non usa makefile, con questo sarebbe un attimo inserire i file object per il linker.
Da Atmel Studio è possibile creare direttamente le librerie precompilate, però non puoi farlo con uno sketch di Arduino, lo puoi fare solo se si tratta di codice C/C++ puro.

In questo caso, o comunque generalmente nei chip embedded si parla quasi solo ed esclusivamente di librerie statiche.
Dato che il compilatore è made in *nix allora la libreria sarà in estensione .a e si ottiene compilando, in questo caso, con avr-ar.
Una volta che si è in possesso della propria libmylib.a in fase di link basta passare il flags della propria libreria "-lmylib" che se non si trovasse nella directory di default bisognerà specificare con "-L/dir/completo"

Lasciamo stare i discorsi sul mascherare il codice tramite l'obfuscate, che comunque in qualche ora si riesce sempre e comunque a risalire al sorgente.Ma anche con la libreria anche se non si riesce ad ottenere un perfetto codice C si riesce comunque a visualizzarlo o altresì si può visualizzare il suo sorgente in Assembly.
L'unica soluzione consiste nel criptare il codice compilato.

Infine come suggerito per linkare tramite Arduino occorre modificare il file platform manualmente Perché l'ide non implementare niente di simile ne tantopiu il compilatore GCC a differenza di altri non permette pragma di linkaggio a librerie.

Grazie per le risposte,

Vedo che il Mangle-It C++ Obfuscator alla fine costa circa 80.00 eur, lo comprerei anche, ma se poi facendo un reverse eng posso ottenere il sorgente è una spesa inutile.

occorre modificare il file platform manualmente

alla fine hai un file objetc che è il precompilato

mi sa che è un po’ troppo difficile per le mie conoscenze, dato che non so di cosa state parlando :slight_smile: e non so nemmeno casa iniziare a studiare :sweat_smile:

pablos:
Vedo che il Mangle-It C++ Obfuscator alla fine costa circa 80.00 eur, lo comprerei anche, ma se poi facendo un reverse eng posso ottenere il sorgente è una spesa inutile.

Quello era un esempio, ma se fai un po' di ricerche ... vedrai che ne trovi anche gratuiti ...

Nonostante quello che dice VB ... provalo ... perché, ovvio che tutto si fa, incluso il reverse engineering, ma, ovviamente ... "il gioco deve valere la candela" ... :wink:

Guglielmo

@gbp01 il reverse di un obfuscated è abbastanza semplice, sopratutto quelli generati in automatico dai software.
@gbp01 fatti il reverse di una mia vecchia firma:

#include <stdio.h>
int main(){int m[5] = {707406378,42,0x58454256,1296388692,69};int o;int(*e)(const char*,...)=printf;for(o=0;o<0x97;o++)e("%s",(char*) m);e("%s",(char*)&m[2]);for(o=0;o<0x97;o++)e("%s",(char*)m);e("*");return 0;}

vbextreme:
@gbp01 il reverse di un obfuscated è abbastanza semplice, sopratutto quelli generati in automatico dai software.

... ci sono software e software ... ovvio che spesso ... è purtroppo questione di $$$ e li si cade, ancora una volta, nello stesso dilemma, ovvero "se il gioco vale la candela".

Non ho idea cosa pablos voglia proteggere da sguardi indiscreti ... e quindi non posso valutare quanto "valga il gioco" ... è una considerazione che deve fare lui, così come deve considerare il "target" del prodotto ... se è un "target" di "smanazzoni" che si mettono a perdere ore/uomo ($$$) per cercare di capire cosa fa il codice, o se sono degli utenti finali NON specializzati che non si mettono di certo a perdere tempo per cercare di capire cosa è nascosto nel codice. :wink:

Guglielmo

P.S.: Dipende come la leggi ... come caratteri mi viene "*** VBTRE" ... ::slight_smile:

Niente di segreto, nessun capitale milionario nascosto, nessuna ricchezza da realizzare in futuro, capisco anche che possono esseci idee opposte sull'argomento opensource, volevo solo conoscere qualcosa per me oscuro sul core e tutto ciò che gira dietro all'ide, dalle librerie alle compilazioni, file hex, c, c++, bin, insomma entrare un po' più dietro le quinte. Però noto che il moderatore (che reputo competente nel suo sgabuzzino, ma scarso in qualità di insegnate), piuttosto che spiegarti da dove incominciare, preferisce dirti (come a me a tutti gli altri) .... "ma si offusca con un prog free che fai prima tanto probabilmente che sarà mai quello che devi fare".

Io ho fatto una domanda precisa e spiegato che è a titolo di studio, mi piacerebbe saperne di più, ma continuo a leggere cose vaghe che non portano a nulla tendenti alla rinuncia.
Se poi si fanno i cross posting perchè dove è stata inizializzata la domanda non si hanno risposte soddisfacenti, non lamentatevi (non mi rifersco a tutti quelli che hanno risposto che ringrazio ancora).

saluti

@pablos se vuoi imparare veramente l'unico consiglio saggio è quello di purgare l'ide Arduino.
Installa le avr bin util, avr-GCC, Make e tutto il corredo quale libc, avrdude, etc etc etc.
Una volta che hai il toolkit, impara a crearti il tuo makefile e inizia a programmare direttamente gli avr in C senza usufruire del pacco Arduino.
Una volta presa padronanza di tutto il corredo Avr allora guardando internet sara semplice creare la propria libreria e risulterà elementare capire il funzionamento di Arduino.

D'ora in poi le tue ricerche falle, ad esempio, con "avr328 makefile" e mai più con "Arduino makefile"

In bocca al lupo, i primi mesi sono duri ma poi diventa semplice.

Grazie Vb, mi ci metto :slight_smile:
ciao

pablos:
... Però noto che il moderatore (che reputo competente nel suo sgabuzzino, ma scarso in qualità di insegnate), piuttosto che spiegarti da dove incominciare, preferisce dirti (come a me a tutti gli altri) .... "ma si offusca con un prog free che fai prima tanto probabilmente che sarà mai quello che devi fare".

Allora, la tua domanda ben precisa era :

pablos:
Vorrei creare una libreria che fosse in .hex (o altra estensione) ma che nel contempo fosse possibile usarla con un normale sketch, quindi in pratica non leggibile e non modificabile.

Domanda è possibile nell'ide avere una lib hex e richiamare le varie funzioni di essa con un normalissimo sketch ? Oppure altri metodi che portino allo stesso risultato. L'ideale sarebbe con Ide arduino che tutti conoscono.

T'è stato puntualmente risposto "NO, dall'IDE non si può fare" ... e quindi la tua risposta l'hai avuta, poi...
... t'è stato spiegato quali potevano essere soluzioni alternative (es. modifica di platform.txt) e, supponendo che ti interessasse NON rilasciare il sorgente, ti sono state fatte delle proposte alternative, tra cui quella di offuscare il codice ... ma neanche quelle ti vanno bene, quindi ...

SE PO' SAPE' ESATTAMENTE CHE VOI ? ? ? :grin: :grin: :grin:

Guglielmo