Newsgroup: it.comp.lang.visual-basic
Titolo: Come proteggere un programma realizzato?

 Ciao a tutti
 Ho realizzato un programma in VB 6 che devo istallare sul PC di un mio
amico.
 Come posso impedire che esso possa essere trasferito in altri PC?  In
pratica: esiste
 sistema per proteggere la mia applicazione? Qualcuno mi ha consigliato
di fornirlo di
 un sistema di protezione, ma francamente non ho idea di come poterlo
realizzare.
 Aspetto un vostro consiglio. Grazie!
                 Nicodemo

 ha scritto nel messaggio 
news:1141400823.8...@j33g2000cwa.googlegroups.com...

Hai pensato ad una chiavetta usb??? 

 realizzare.
Piglia il serial dell' hard disk (guardati le API di sistema).
Poi implementaci un tuo algoritmo. (o usane uno già fatto).
Memorizza la stringa nel registry o in un file crittato.
Ad ogni avvio confronta la stringa.
Se è diversa, il pc è un altro.
Bye,
-- 
Carmine ( 
pikachu...@gmail.com
 (Togli la scritta NOSPAM) )
Webmaster di The Total Site 4 : 
http://www.thetotalsite.it
MariokartDS Codice Amico: 532639027909 - CarmineC in MarioKartDS 

 Se è diversa, il pc è un altro.
In questo caso devi fornire tu la "stringa" su richiesta.
E quindi sei tu che devi controllare se la richiesta è per un altro pc o 
solo perchè hanno disinstallato l'app e non si ricordano più la chiave, o se 
gli si è rotto l'hd, o se stanno spostando l'app su un altro pc...
Ciao
-- 
Free .Net Reporting Tool - 
http://www.neodatatype.net
 

 altro pc...
Appunto.
In questo modo sei sicuro che la tua licenza venga utilizzata per un solo 
pc.


 pc.
Secondo me lo sei solo se vai a controllare di persona.
Ciao 


preciso e pungente come il nick precedente ;-)
-- 
ciao, hal

Ho capito che devo ricorrere ad una routine che confronti in numero
seriale dell'HD  ove istallare il programma, con una stringa che devo
fornire io e fin quì tutto ok...ma quale funzione può permettermi di
visualizzare ad esempio su un label od un textbox il numero seriale di
un HD ??
In pratica qual'è la funzione che va a scovare il numero seriale di un
HD?
               ( e comunque grazie a tutti per la collaborazione ^_* )
    Nicodemo

 HD?
Non ricordo di preciso...
Cerca tra le API di windows.


 HD?
http://www.mentalis.org/tips/tip030.shtml
-- 
ciao, hal

 Se è diversa, il pc è un altro.
In realtà, è leggermente più complicato, e senza certezza!
Allora, se ho capito bene:
a) il cd dell'appliativo arriva in qualche modo nelle mani di un possibile
cliente che lo installa;
b) il prohramma avverte che dopo un tot di giri sulla giostra deve
richiedere la versione definitiva inviando una mail con questo numerino
"123456799"
c) il programmatore riceve la mail col numerino, se il caso verifica il
pagamento o prende altri accordi, ricompila il programma con quel numerino,
e rispedisce il solo eseguibile al cliente.
Il programma ricmpilato ha un algoritmo che va a verificare se quel numerino
è tra quelli ammessi.
La cosa funziona con clienti diversi; se è una grossa ditta che ha preso un
sacco di computer tutti insieme, questi facilmente avranno tutti lo stesse
seriale di HD, ho già verificato!
Inoltre è scocciante per un altro motivo: se il cliente cambia HD o pc
bisogna ricompilare e rispedire l'eseguibile; quante volte si può fare e
come verificare che è vero?
--
Greg

Credo che si possa fare qualcosa del genere:
1) creare un database con una sola colonna (ovviamente nascosto) e
posto all'interno del programma,
2) creare una routine che elabori un calcolo che abbia come riferimento
il numero seriale dell'HD  ( qualcuno mi ha assicurato che i numeri
seriali degli HD sono tutti diversi ) trasformandolo, per mezzo di
un'algoritmo di nostra creazione, e che lo inserisca nel database ad
una sola colonna creato in precedenza,
3) Aprire un form con una Textbox, un Label ed un pulsante.
4) La label dovrebbe visualizzarci il numero seriale dell'HD ( e questo
è il punto cruciale da rislvere)
5) a questo punto, associando al numero seriale dell'HD visualizzato
nella Label, il numero seriale stesso, opportunamente  manipolato dal
nostro algoritmo e memorizzato nel nostro database, noi avremmo: a) due
distinti numeri relazionati tra loro (dall'algoritmo) b) un sistema di
controllo che ci consente, nel caso dovesse cambiare l'HD, di bloccare
il programma in quanto sarebbero cambiate le condizioni di relazione
tra i due numeri ( il seriale d'origine e quello elaborato
dall'algoritmo )
6) il nuovo utente (chiamiamolo "abusivo") sarebbe costretto quindi a
contattarci per avere il nuovo codice da abbinare al suo HD. A questo
punto noi che saremo ovviamente in grado di elaborare il numero del suo
HD che lui stesso ci dovrà comunicare, potremo fornire il nuovo numero
che lui scriverà nella TextBox e che tramite il pulsante sboccherà il
suo programma.
7) E' chiaro che una stessa identica routine ed l'algoritmo saranno
allocati e nascosti nel suo programma già all'origine, consentendo
così un controllo totale contro un eventuale tentativo di istallazione
abusiva su altro PC.
Mi pare di aver dato un'idea di come più o meno si possa fare MA resta
un problema, direi l'unico: dove cavolo la trovo una routine che sia in
grado di leggere il numero seriale dell'HD ???
                                                  ( ricchi premi a chi
indovina...ehhe )
                             nicodemo

 numerino, e rispedisce il solo eseguibile al cliente.
E qua che sbagli!
Non bisogna ricompilarlo in quanto l' algoritmo è lo stesso...
allora:
1) Prende il codice hard-disk e lo hasha tramite una chiave definita nel 
programma.
2) Lo critta con qualche algoritmo (Rinjiadel, TripleDES).
3) Il programmatore lo prende e tramite un altro algoritmo lo hasha in modo 
diverso.
4) A questo punto sul pc dell' utente la cosa avviene in modo inverso...
Guarda qui:
http://www.thetotalsite.it/fileserver/AttivazioneSoftware.rar


scusate l'errore di ortografìa al punto 7)   volevo scrivere: " ed
algoritmo"
nicodemo

grado di leggere il numero seriale dell'HD ??? ( ricchi premi a chi indovina...ehhe )
   Dio Google vince il premio....  prova ad usarlo un po' di piu'  ;-)
Ciao

 inverso...
Ci deve essere qualcosa che mi sfugge! Cosa impedisce di installare su 100
pc diversi?
Non capisco....
--
Greg

 su 100 pc diversi?
Il codice del hard disk!!



A dire il vero nulla vieterebbe di portarsi l'hard disk dietro. Basti 
pensare che adesso sono disponibili i "mobile disk".
Mi chiedo se lo stesso principio sia applicabile anche alle altre unità 
rimovibili e non (quali floppy, pendrive, etc).
In caso negativo il potenziale cliente "potrebbe" installarsi il programma 
esternamente all'hard disk e superare il problema.
In un post precedente leggevo che occorre specificare l'unità, e se questa 
fosse diversa da c?
Cooper.

 Non bisogna ricompilarlo in quanto l' algoritmo č lo stesso...
Ma la smettete che tanto non avrete mai nessuna certezza se non quella di 
perdere tempo su sistemi che produrranno piů problemi di quanti ne 
vorrebbero risolvere (senza tra l'altro riuscirci).
Ciao 

 questa fosse diversa da c?
No, perchè dovresti avviare il s.o. dalla pendrive o dal floppy...
In quanto viene letto il seriale dell' hard disk su cui il s.o. viene 
eseguito.


 quanti ne vorrebbero risolvere (senza tra l'altro riuscirci).
Ah davvero?
Allora tu che faresti?
Dai siamo curiosi...


 Dai siamo curiosi...
forse conviene non fare nulla.
tanto, se il programma e` buono e vale la pena chi non lo vuol pagare
lo cracca, mentre se il programma e` scarso non te lo comprano comunque.
-- 
ciao, hal

 Dai siamo curiosi...
a parte il genuine ecc ecc, l'ultimo sw ms 'protetto' a me noto e' stato
word 5.5 per dos...
fa' tu...

 stato word 5.5 per dos...
Vabbe, perņ questo sistema da un minimo di protezione...
Sempre un pņ di tempo ci vuole, e, se non č molto importante un sw del 
genere chi te lo fa fare di craccarlo?
Inoltre crakkare un programma lo fa diventare famoso :-P.


 Inoltre crakkare un programma lo fa diventare famoso :-P.
secondo me hai invertito causa ed effetto: si cracka il programma
perche` e` famoso.
-- 
ciao, hal

 programma perche` e` famoso.
È nato prima l'uovo o prima la gallina???
State disputando di questo, secondo me....
Intendetemi: sono vere entrambe.
Prima di tutto nessuno si mette a crackare un programma
sconosciuto, inutile o che faccia peggio cose che analoghi
programmi freeware fanno meglio di lui.
Per contro un programma protetto è per sua natura diffuso
esclusivamente fra chi lo ha acquistato, e quindi è molto
meno diffuso di un analogo programma crackato...
Ciao.
Mauro 

 Il codice del hard disk!!
Daccordo, ma alla prima esecuzione il rpogramma non ha nulla con cui
confrontare questo codice. L'unica cosa che si puo sapere è questa: quel
codice non è abilitato; da qui la necessità che l'utente invii il codice,
dettato dal programma in una msg, al programmatore, dopodichè il
programmatore provvere ad inderire "anche" quel codice in un array di codici
'riconosciuti', ricompila e spedisce.
Altrimenti ... ogni codice è lecito! O no?
--
Greg

 Dai siamo curiosi...
Niente, perchè non esiste niente che ti mette al sicuro da una copia non 
autorizzata (vedi Microsoft che ha più avvocati che sviluppatori alle sue 
dipendenze ma vorrei vedere in quanti hanno Windows originale).
Ciao 

 Altrimenti ... ogni codice è lecito! O no?
No, certo che no!
Il codice viene calcolato a runtime, non viene confrontato con altri...


 Il codice viene calcolato a runtime, non viene confrontato con altri...
poi, se il gioco vale la candela, un giorno arriva un tizio che scrive
una patch stupidissima che va ad invertire l'istruzione di salto senza
neanche fare la fatica di indovinare l'algoritmo usato <VBEG>
-- 
ciao, hal

 Inoltre crakkare un programma lo fa diventare famoso :-P.
fa diventare famoso te, grazie ai cronisti della giudiziaria :P

 meno diffuso di un analogo programma crackato...
perdonami, ma mi sfugge la logica.
avrei capito "di un analogo programma freeware", per quanto ooo ne abbia
ancora un po' per agguantare mso.
ma "craccato", boh. sara' stato protetto anche lui. o c'e' anche chi cracca
firefox ? :)
quindi non vedo l'opposizione.
ciao, a.

 dipendenze
e questo spiega la procedura di sviluppo sw, con patch=ricorso+sentenza, e i
risultati :)

 avrei capito "di un analogo programma freeware"
La seconda parte del mio post sottindeva la prima, cioč che
di quel programma NON esistessero versioni "analoghe" free
ma solo le versioni "pay", siano poi esse crackate o meno.
In quelle condizioni (programma "unico nel suo genere") si
diffonde piů facilmente se č facilmente crackabile... ;-)
Ciao.
Mauro

 neanche fare la fatica di indovinare l'algoritmo usato <VBEG>
Beh si potrebbero fare istruzioni di salto ricorsive e "spezzettate" che 
rendono più difficoltosa l' operazione del "noopaggio".
E se proprio uno vuole la (quasi) massima sicurezza allora prende una bella 
chiave hw...


Sě, ma su un programma Visual Basic questo č molto piů difficile.... no?
Hai per caso qualche accoppiata di programma VB e patch,
giusto per dare un' occhiata?


Bene amici, vedo che l'argomento ha comunque suscitato parecchio
interesse.
codici, routine, algoritmi ecc.. a parte, credo che in fondo sia
riuscito a trovare
un sistema per evitare, o quantomeno ridurre notevolmente, il rischio
di vedere il
mio programma girare su altri PC non autorizzati ed è in un certo
senso "l'uovo
di Colombo": Mi sono limitato a personalizzare al massimo il programma
che
potrà essere utilizzato in esclusiva da chi me lo ha commissionato e
cioè dai report
ai form alle icone, fino ad arrivare all'Help, tutto è stato
personalizzato ad uso, misura
e consumo di " Tizio " per cui " Caio" potrà al massimo "giocare" col
PC di Tizio,
tutto quì. Dopotutto preferisco ricompilare ogni volta una parte del
programma,
piuttosto che vederlo girare dappertutto senza guadagnarci un
centesimo.
Le protezioni, come avete detto anche voi, non ci garantiscono al 100%
.
Preferisco parcorrere una strada più lunga ma almeno sarò certo di
aver "cucito"
degli abiti su misura.
                                     Ciao a tutti e grazie per
l'interessamento  ^_*
(Nicodemo)

 altri...
Scusa ma non riesco a capire, se viene calcolato e non confrontato, ad ogni
installazione su macchina nuova il calcolo dovrebbe essere sempre ok,
giusto? e quando è che non è ok?
Ma forse facciamo prima se posti 2 riche di codice con un esempio pratico,
grazie
ciao
--
Greg

 pratico,
Questo č un ottimo esempio che ho trovato in rete:
http://www.thetotalsite.it/fileserver/AttivazioneSoftware.rar


 
http://www.thetotalsite.it/fileserver/AttivazioneSoftware.rar
Lo avevo già visto, ma non sono riuscito a leggere nulla; che linguaggio è?
Mi sembra che anndiamo sul complicato, con librerie e algoritmi esterni
fatti da altri.
Ho letto anche la presentazione sul sito ma il tutto mi sembra tanto una
bufala.
Non hai 2 righe in VB, non dell'algortmo che crea la chiave, ma de quello
che decide se la chiave è corretta e in base a cosa.
Non è che un algoritmo, per quanto complesso si metta a fare magia.
Ciao
--
Greg

 che
QUesto č un buon criterio. A nessuno infatti piace vedere su ogni schermata,
e soprattuto su ogni stampa che va in giro, il logo e la pubblicitą del suo
diretto concorrente. Ci fa una pessima figura!
--
Greg

 Sì, ma su un programma Visual Basic questo è molto più difficile.... no?
no, e` comunque un eseguibile.
-- 
ciao, hal

 chiave hw...
ecco, qui il gioco si fa effettivamente ben piu` difficile, a patto che
una parte del codice giri sulla chiave hardware, altrimenti si torna al
discorso di prima, dove un JE diventa JNE o viceversa.
-- 
ciao, hal

 quello che decide se la chiave è corretta e in base a cosa.
Basta che converti quel codice c# in 
vb.net
.


 che una parte del codice giri sulla chiave hardware,
Ovviamente intenevo questo.
Ad esempio dll crittate sulla chiave hw che espongono metodi fondamentali.
E comunque nel "solito metodo" in ogni caso è difficoltoso noopare un sw che 
usa una chiave hw in quanto usa algoritmi ricorsivi che necessitano di un 
attento studio.


 Ad esempio dll crittate sulla chiave hw che espongono metodi fondamentali.
cose da programmatori italiani.
tristissime.
spendiamo decine di milioni in repertori su cd. l'unico con una chiave hw e'
italiano. di uno inglese in 5 cd ho potuto fare la copia funzionante sia su
dvd sia su hd senza il minimo problema.
imho, pensare a questi problemi e' -- con tutto il rispetto per la
categoria -- da ragionieri, non da programmatori.
se comunque devi fare qualcosa del genere, perche' la tua "proprieta'
intellettuale" (cit.) dev'essere protetta (mi auguro ovviamente che sulla
base di questo principio tu non abbia sul pc ne' un mp3 ne' un divx di cui
non possiedi l'originale con bollino siae), falla almeno al passo coi tempi.
quando il programma si apre, si connette alla rete e controlla.
ovviamente avverti _prima_ l'utente che succedera' questo.
(un sw americano che ho registrato anni fa ogni volta che lo apro mi dice
che c'e' la versione nuova. lo so, io ho la 3 e siamo alla 10, ma a me la 3
basta e avanza. inoltre ora ce ne sono decine anche free. mi fa incazzare
che si connette a prescindere, visto che l'ho gia' pagato).
se il tuo sw vale la pena, non temere, l'utente si connettera' ecc ecc.
se l'utente rinuncia, vuol dire che la tua e' proprieta' ma non e'
intellettuale.
veramente, ste robe mi deprimono.
programmatori, concentratevi sulle idee, non sui mezzucci.
a.p.

Certo certo.
Ma questi erano metodi "estremi", roba per software da migliaia e migliaia 
di eurozzi...
E' ovvio che mi sembra un inutile spreco di tempo e risorse fare tutta 'sta 
roba per un programmino...
Ed infatti, la cosa principale è il contenuto del programma, non come viene 
protetto.


 di eurozzi...
non necessariamente.
quanta protezione pensi che abbia un signor database come oracle, ad 
esempio, che vale ben piu` ti tante schifezze  corredate di chiavi e 
controchiavi?
zero.
-- 
ciao, hal

> Sě, ma su un programma Visual Basic questo č molto piů difficile.... no?


 controchiavi?
Pensa che io ad un corso post diploma usavo una versione di Autocad (non 
proprio un sw economico) craccato perchč non avevamo la chiave hw :)
Quindi anche tutte le masturbazioni mentali sulla chiavetta possiamo 
cestinarle... d'altra parte che il controllo avvenga nel sw o nella chiave 
poco importa: la si salta a pič pari e il gioco č fatto.
Ciao 

proprio un sw economico) craccato perchè non avevamo la chiave hw :)
Questa mi fa venite in mente che una 20ina di anni fa mi sono cimentato nella
sprotezione di un programma con chiave sulla parallela.
Era installato sul computer della mia fidanzata e aveva sempre problemi tanto
che doveva apesso andare a muovere il connettore dietro perchè si piantava il
prog e ogni tanto il pc.
Anche il tecnico dell'assistenza non aveva risolto nulla.
In una sera e usando solo il debug del dos (allora non esisteva SoftIce) sono
riuscito ad escludere la chiave scrivendo un sacco di NOP e risolvendole il
problema, quindi non è poi così difficile bypassare certe cose.
--
ciao
  Stefano

 bypassare certe cose.
Si, infatti.
E comunque non vi era nessun pezzo di codice sulla chiave... altrimenti...


E comunque non vi era nessun pezzo di codice sulla chiave... altrimenti...
Mi sembra di ricordare che la routine fosse essenzialmente una routinetta fatta
di un loop con le istruzioni asm OUT IN e poi un CMP, quindi la porta riceveva
qualcosa da fuori, ed  erano dei valori da confrontare con una tabella.
Ma bastava mettere dei 90H (NOP) sulla chiamata alla routine (CALL) e sul salto
successivo per vanificare il tutto.
Credo anch'io che si possa fare di meglio...
--
ciao
  Stefano

 sul salto successivo per vanificare il tutto.
Si infatti potrebbe ricevere un semplice chiave numerica.


ci sarebbe un modo per modificare permanentemente ad esempio una
casella di testo di un programma in cui si inserisce un valore boolean
che diventa true alla prima installazione e blocca installazioni
successive a meno di sblocco da parte di chi distribuisce il software??
una possibilità di questo tipo potrebbe portare anche ad altre
soluzioni analoghe... fatemi sapere gentilmente grazie


Beh no, in quanto può essere comunque cambiato il valore...
Bye,
-- 
Carmine ( 
pikachu...@gmail.com
 (Togli la scritta NOSPAM) )
Webmaster di The Total Site 4 : 
http://www.thetotalsite.it
MariokartDS Codice Amico: 532639027909 - CarmineC in MarioKartDS
"Un problema non è un problema se può essere risolto"