PDA

View Full Version : [C++] proteggere sw


marxt
04-01-2008, 11:13
ciao a tutti,

avrei bisogno di inserire nel mio programma un meccanismo di protezione, qualcosa che sia più affidabile del semplice controllo di una password scritta nel codice, pensavo a file di licenza che l'utente deve tenere in una determinata cartella e la cui presenza viene controllata ad ogni avvio del programma.

Qulcuno di voi conosce come si fanno queste cose? esiste una procedura standard? Cosa mi consigliate di fare?
magari utilizzando librerie .NET che potrebbero semplificarmi la vita.

Grazie a tutti

isAlreadyInUse
04-01-2008, 11:14
Ma devi proteggere l'accesso o la copia del programma

marxt
04-01-2008, 13:21
l'accesso

isAlreadyInUse
04-01-2008, 13:24
Impronta digitale

variabilepippo
04-01-2008, 13:28
Qulcuno di voi conosce come si fanno queste cose? esiste una procedura standard?


Se esistesse una procedura standard per proteggere esisterebbe anche un crack universale... :rolleyes: Invece la protezione di un software è affidata alla fantasia e all'esperienza del programmatore. In realtà esistono librerie e componenti che permettono di proteggere un'applicazione, ma io eviterei di usarle per quanto scritto prima.


magari utilizzando librerie .NET che potrebbero semplificarmi la vita.


Stai sviluppando in Managed C++? :confused:


l'accesso


Sei proprio sicuro di voler proteggerne l'accesso (cosa intendi per "accesso"?) e non la possibilità di usare copie non regolarmente acquistate del software?

marxt
04-01-2008, 14:47
voglio che il software sia usabile solo dagli utenti autorizzati a cui verra rilasciata una chiave o una licenza.

come dicevo mi basta qlc di più di una semplice password all'avvio, quindi mi va bene anche usare delle librerie standard.

avete qlc link o qlc procedura da consigliarmi?

variabilepippo
04-01-2008, 15:03
Quale compilatore C++ utilizzi? Fai ricorso a framework particolari?

RaouL_BennetH
04-01-2008, 15:15
Non per mia personale esperienza ma in genere per questo tipo di problematica, molti utenti esperti su questo forum hanno consigliato in passato una chiave hardware.

marxt
04-01-2008, 16:21
uso visual studio 2005, framework 2.0

ho visto da qualche parte che ci sono librerie .NET per il licensing, ma non trovo maggiori informazioni

tomminno
04-01-2008, 18:12
uso visual studio 2005, framework 2.0

ho visto da qualche parte che ci sono librerie .NET per il licensing, ma non trovo maggiori informazioni

Allora non stiamo parlando di C++.
Se usi il framework .NET evita quell'abominio del C++ managed.
Però stai attento che l'IL è perfettamente in chiaro per chi detiene l'assembly, devi ricorrere a tool come dotFuscator (non so se sia presente in tutte le versioni di VS2005), i quali limitano alcune proprietà del linguaggio come la Reflection.

Potresti affidarti ai tradizionali product key basati sull'Elliptic Curve Cryptografy.

Il problema che non sono mai riuscito a risolvere è che comunque nel codice del programma è presente la chiave per decifrare il product key, se in C++ ci vuole una certa perizia anche solo per capire che dei numeracci messi lì costituiscono la chiave (si può pensare anche di tenerli in modo che siano necessarie determinate operazioni prima di ottenere i singoli byte della chiave), con .NET tutto diventa più semplice (a lavoro per test ho cracckato un nostro stesso programma protetto con queste chiavi e offuscato, chiaramente non sapevo dove cercare la chiave, ma non è stato troppo complicato trovarla).

marxt
04-01-2008, 18:57
per l'esattezza uso C++/CLI,
sapete niente di una certa classe "License" e "LicenceManager" e di come si utilizzano??

variabilepippo
04-01-2008, 19:09
per l'esattezza uso C++/CLI


Come proteggi il tuo codice dalla decompilazione?


sapete niente di una certa classe "License" e "LicenceManager" e di come si utilizzano??


L'uso di tale classe è illustrato in How to: License Components and Controls (http://msdn2.microsoft.com/en-us/library/fe8b1eh9.aspx), come puoi notare non serve per proteggere un'applicazione ma i propri componenti.

marxt
04-01-2008, 19:50
allora mi sa che mi manca qualche pezzo.

qual'è la differenza tra proteggere componenti e proteggere l'uso dell'applicazione?

c'è un modo per fare quello che voglio fare io?

variabilepippo
04-01-2008, 19:55
c'è un modo per fare quello che voglio fare io?


Progettare un TUO schema di protezione customizzato?

Devi inventare un meccanismo per la generazione e la verifica di codici seriali ed integrarlo nella tua applicazione.

71104
04-01-2008, 22:40
ciao a tutti,

avrei bisogno di inserire nel mio programma un meccanismo di protezione, qualcosa che sia più affidabile del semplice controllo di una password scritta nel codice, pensavo a file di licenza che l'utente deve tenere in una determinata cartella e la cui presenza viene controllata ad ogni avvio del programma.
ti propongo un'idea migliore: il file di licenza contiene una chiave crittografica che viene utilizzata per decriptare una parte chiave del programma. però ovviamente ciascun utente regolare deve avere una licenza diversa, il che significa che a ciascun utente regolare devi distribuire una copia crittografata diversamente.

dupa
04-01-2008, 22:50
inizia a usare un encrypter e compressore di exe.. che di sicuro renderà la vita meno agevole al cracker di turno.

ciao

marxt
05-01-2008, 11:52
ti propongo un'idea migliore: il file di licenza contiene una chiave crittografica che viene utilizzata per decriptare una parte chiave del programma. però ovviamente ciascun utente regolare deve avere una licenza diversa, il che significa che a ciascun utente regolare devi distribuire una copia crittografata diversamente.

cosa intendi per decriptare una parte chiave del programma? criptare una parte del codice?
ma come si fa praticamente a compilare un programma con un pezzo del suo codice cifrato?

71104
05-01-2008, 12:42
cosa intendi per decriptare una parte chiave del programma? criptare una parte del codice?
ma come si fa praticamente a compilare un programma con un pezzo del suo codice cifrato? veramente criptare una parte dell'eseguibile principale sarebbe un po' troppo complicato, dovresti avere a che fare con codice automodificante; io avevo in mente più che altro una DLL o un file essenziale.

marxt
05-01-2008, 14:02
ho capito, e cosa potrei usare per criptare/decriptare?

variabilepippo
05-01-2008, 14:18
Potresti usare la classe Rijndael (Rijndael Class) del namespace System.Security.Cryptography.

Non hai risposto alla mia domanda precedente: come proteggi la tua applicazione dalla decompilazione (http://www.aisto.com/roeder/dotnet/)?

cionci
05-01-2008, 14:19
Potresti pensare ad una chiave hardware ;)

tomminno
05-01-2008, 14:26
Potresti pensare ad una chiave hardware ;)

Le chiavi hardware sono decisamente costose, inoltre c'è sempre il problema rappresentato da Reflector.

cionci
05-01-2008, 14:30
Le chiavi hardware sono decisamente costose, inoltre c'è sempre il problema rappresentato da Reflector.
No perché nella chiave hardware ci si può mettere una parte dell'eseguibile.
A meno che reflector non vada a prendere l'immagine in memoria dell'eseguibile è impossibile decompilarlo...

tomminno
05-01-2008, 14:49
No perché nella chiave hardware ci si può mettere una parte dell'eseguibile.


La chiave hardware è comunque più costosa della stampa di un CD, sempre se stiamo parlando di un software che ha i numeri per essere stampato. Se invece il software è distribuito via internet il costo si fa spropositato.


A meno che reflector non vada a prendere l'immagine in memoria dell'eseguibile è impossibile decompilarlo...

Se è in .NET ti basta aprire l'eseguibile con Reflector per trovarti il codice sorgente spiattellato sotto gli occhi, operazione semplicissima.

cionci
05-01-2008, 17:37
Se è in .NET ti basta aprire l'eseguibile con Reflector per trovarti il codice sorgente spiattellato sotto gli occhi, operazione semplicissima.
Appunto, con una chiave hardware l'eseguibile risiede in parte sulla chiave in forma cifrata ;)

marxt
05-01-2008, 20:29
Potresti usare la classe Rijndael (Rijndael Class) del namespace System.Security.Cryptography.

Non hai risposto alla mia domanda precedente: come proteggi la tua applicazione dalla decompilazione (http://www.aisto.com/roeder/dotnet/)?

non lo porteggo...

variabilepippo
06-01-2008, 01:21
non lo porteggo...


Quindi in sostanza stai chiedendo come chiudere le finestre al terzo piano quando lasci aperto il portone principale della tua abitazione... :rolleyes:

71104
06-01-2008, 10:35
Quindi in sostanza stai chiedendo come chiudere le finestre al terzo piano quando lasci aperto il portone principale della tua abitazione... :rolleyes: in generale non ha senso scervellarsi troppo su come proteggere il proprio software dai crackers o comunque da gente esperta in fatto di programmazione, perché tanto il modo alla fine lo trovano comunque (l'hanno trovato per l'attivazione di XP, vorresti riuscire a fare di meglio tu?). ha senso invece proteggere il proprio software dalla pirateria messa in atto da utenti non esperti (cioè da banali copie insomma) e nulla più; per il resto conviene dedicarsi a migliorare la qualità del programma correggendo errori e aggiungendo funzionalità.

marxt
06-01-2008, 11:49
allora:

a me non interessa che il software venga copiato e distribuito, anzi meglio!

il problema è che si può accedere al sw in modalità di prova con funzionalità limitate o in modalità completa con tutte le funzioalità attive.
Ora per accedere in modo completo c'è una password all'avvio, ma non mi piace molto e mi piacerebbe avere un file di licenza da distribuire con il programma.

...Ecco da cosa è nata la mia richiesta!

L'unica soluzione è criptare un componente del programma con una chiave che sta nel file di licenza?

71104
06-01-2008, 12:43
L'unica soluzione è criptare un componente del programma con una chiave che sta nel file di licenza? no, ora che hai spiegato tutto m'è venuta in mente una soluzione decisamente migliore: assieme alla licenza distribuisci anche i componenti contenenti le funzionalità che mancano nella versione di prova, così quelle funzionalità non ci stanno materialmente. inoltre per evitare che qualche cracker paghi una licenza e poi distribuisca gratuitamente a tutto il mondo i componenti mancanti, fai in modo che tali componenti siano criptati con la chiave crittografica contenuta nella licenza (ogni licenza ha una chiave crittografica diversa).
infine, per evitare anche che qualcuno paghi una licenza e distribuisca gratis tutto quanto (licenza e componenti mancanti), fai in modo che la chiave crittografica contenuta nella licenza sia in qualche modo legata alla specifica copia del programma. per esempio potrebbe essere legata al codice seriale, o meglio ancora, codice seriale e chiave della licenza potrebbero costituire due chiavi crittografiche asimmetriche: i componenti mancanti sono criptati col seriale del programma e possono essere decriptati solo con la chiave della licenza.
è ancora possibile fregare questo sistema, ma puoi fare in modo che per un utente normale sia troppo rognoso.

dupa
06-01-2008, 13:20
allora:

a me non interessa che il software venga copiato e distribuito, anzi meglio!

il problema è che si può accedere al sw in modalità di prova con funzionalità limitate o in modalità completa con tutte le funzioalità attive.
Ora per accedere in modo completo c'è una password all'avvio, ma non mi piace molto e mi piacerebbe avere un file di licenza da distribuire con il programma.

...Ecco da cosa è nata la mia richiesta!

L'unica soluzione è criptare un componente del programma con una chiave che sta nel file di licenza?

perchè semplicemente non distribuisci la demo compilata senza le righe di codice delle funzionalità che nn vuoi offrire? e poi a chi lo compra lo mandi in versione completa.

71104
06-01-2008, 13:44
perchè semplicemente non distribuisci la demo compilata senza le righe di codice delle funzionalità che nn vuoi offrire? e poi a chi lo compra lo mandi in versione completa. perché così chi lo compra può distribuirlo gratis a tutti mettendolo sul suo sito internet.

variabilepippo
06-01-2008, 13:55
in generale non ha senso scervellarsi troppo su come proteggere il proprio software dai crackers


Vero, ma con il mio post volevo soltanto sottolineare che è inutile cercare di sviluppare uno schema di protezione complicatissimo&efficientissimo quando il sorgente dell'applicazione è completamente accessibile tramite decompilazione...


perché così chi lo compra può distribuirlo gratis a tutti mettendolo sul suo sito internet.

È molto più facile distribuire un seriale o un keygen rispetto ad una versione completa (magari contenente informazioni in forma criptata sull'utente che l'ha regolarmente acquistata).

71104
06-01-2008, 14:20
Vero, ma con il mio post volevo soltanto sottolineare che è inutile cercare di sviluppare uno schema di protezione complicatissimo&efficientissimo quando il sorgente dell'applicazione è completamente accessibile tramite decompilazione... non ha senso cercare di difendersi da un cracker perché non si dura molto; ha più senso cercare di difendersi da utenti comuni, quindi gente che se anche riuscisse per miracolo a decompilare il codice poi non ci capirebbe niente.

È molto più facile distribuire un seriale o un keygen rispetto ad una versione completa (magari contenente informazioni in forma criptata sull'utente che l'ha regolarmente acquistata). la mia idea era più efficace di entrambe le cose: prevedeva che assieme al seriale venisse distribuito anche il file di licenza e alcuni componenti mancanti nella versione di prova. per fare ciò è necessario individuare il tutto, operazione fattibilissima per un cracker ma non necessariamente per un utente comune.

variabilepippo
06-01-2008, 14:36
ha più senso cercare di difendersi da utenti comuni, quindi gente che se anche riuscisse per miracolo a decompilare il codice poi non ci capirebbe niente


Siamo d'accordo sul fatto che sia assolutamente inutile implementare un qualsiasi (=da quello più banale a quello più sofisticato) schema di protezione quando il relativo sorgente risulta disponibile?

ficofico
06-01-2008, 14:46
io non mi intendo assolutamente di programmazione, ho fatto un semplice programma usando autoit-v3 e già mi sento al settimo cielo........ però , dalla mia esperienza personale, posso dire che il metodo migliore secondo me è quello di bloccare via internet il software.
In poche parole, rendi necessaria la connessione ad internet, e poi sviluppi un sistema, vedi tu come e quale, che riesce a capire se una tua replica di programma con uguale numero di serie è attiva contemporaneamente su più computer.

certo, c'è la grossa limitazione del collegamento ad internet, però oramai sono più i computer collegati ad internet che non quelli scollegati.

Per esempio funzionano così diversi programmi per cellulari symbian, questo a mio modo di vedere è il metodo più sicuro, infatti questi programmi (non me ne viene in mente neanche uno adesso, incredibile) non sono ancora stati craccati, e dietro i programmi symbian c'è una pirateria pazzesca...

dupa
06-01-2008, 15:11
perché così chi lo compra può distribuirlo gratis a tutti mettendolo sul suo sito internet.

bè metti su un sito scaricabile una demo dove non esistono fisicamente le porzioni di codice che vuoi rendere disponibili solo nella versione full.

a chi compra il software spedisci una versione completa dove c'è un file di licenza che rende disponibili tutte le funzioni.

ficofico
06-01-2008, 16:08
allora a questo punto, l'utente che ha comprato il software ma che al contempo è anche amico della community, comprime la sua cartella con winrar, e la uploda sul suo ftp....