Newsgroup: it.comp.programmare.win32
Titolo: [OT] Impedire copie non autorizzate

Salve,
    dovrei realizzare un meccanismo di protezione del software che sto
sviluppando (per impedire che venga copiato senza autorizzazione). So
che č impossibile realizzare software anticopia ma cercavo qualcosa che
rendesse la copia almeno un po' piů difficile. Avevo pensato a un codice
di abilitazione legato al numero seriale dell'hard-disk o del BIOS. E'
possibile leggere (da VC++) questi parametri in modo semplice. Qualcuno
ha una idea migliore ?
--
       Stefano Malavasi

 ha una idea migliore ?
Io, per la ditta, uso questo:
http://www.rainbow.com
-- 
Luc.

Grazie per il suggerimento, anche se penso che la mia ditta cerchi
qualcosa di più economico che una chiave :( Comunque provo a girare
anche questa soluzione :)
--
       Stefano Malavasi

 Luc.
Io sto usando una chiave hardware EUTRON che ho acquistato nella versione
"startup kit" a prezzo ridotto.
Il tutto mi sembra andare abbastanza bene (un problema con la funzione di
criptazione (GSS) sotto NT, che ancora non ho capito bene), ma non ho nessun
altro termine di paragone, cioč questa chiave EUTRON č la prima ed unica
chiave che ho provato.
Tu ne hai provate diverse? Usi chiavi RAINBOW per una particolare ragione?
Quanto costa una chiave per parallela nella vesrione piů semplice? Hai
qualche suggerimento?
Grazie, DANILO.

 ha una idea migliore ?
GetVolumeInformation
Credo che come metodo di protezione semplice vada bene.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Credo che come metodo di protezione semplice vada bene.
Per caso sai come recuperare il MAC address di una scheda di rete ?
Stefano "HappyMan" (Lago Maggiore - NO)
--
Personal Web 
http://www.sgr.info
Email 
happyman...@libero.it
 [Togliere nospam per scrivermi]
Salsa Web 
http://happyman.n3.net
 [Foto salseri/e & I.A.B.L.A. Ring]

 Per caso sai come recuperare il MAC address di una scheda di rete ?
Compilato con C++ Builder 5.0 funziona:
// Visual C++ 5.0: cl -GX getmac-netbios.cpp netapi32.lib
// Borland C++ 5.0: bcc32 getmac-netbios.cpp
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <strstream>
#include <string>
using namespace std;
bool GetAdapterInfo(int nAdapterNum, string & sMAC)
{
    // Reset the LAN adapter so that we can begin querying it 
    NCB Ncb;
    memset(&Ncb, 0, sizeof(Ncb));
    Ncb.ncb_command = NCBRESET;
    Ncb.ncb_lana_num = nAdapterNum;
    if (Netbios(&Ncb) != NRC_GOODRET) {
        char acTemp[80];
        ostrstream outs(acTemp, sizeof(acTemp));
        outs << "error " << Ncb.ncb_retcode << " on reset" << ends;
        sMAC = acTemp;
        return false;
    }
 
    // Prepare to get the adapter status block 
    memset(&Ncb, 0, sizeof(Ncb));
    Ncb.ncb_command = NCBASTAT;
    Ncb.ncb_lana_num = nAdapterNum;
    strcpy((char *) Ncb.ncb_callname, "*");
    struct ASTAT {
        ADAPTER_STATUS adapt;
        NAME_BUFFER NameBuff[30];
    } Adapter;
    memset(&Adapter, 0, sizeof(Adapter));
    Ncb.ncb_buffer = (unsigned char *)&Adapter;
    Ncb.ncb_length = sizeof(Adapter);
 
    // Get the adapter's info and, if this works, return it in standard,
    // colon-delimited form.
    if (Netbios(&Ncb) == 0) {
        char acMAC[18];
        sprintf(acMAC, "%02X:%02X:%02X:%02X:%02X:%02X",
                int (Adapter.adapt.adapter_address[0]),
                int (Adapter.adapt.adapter_address[1]),
                int (Adapter.adapt.adapter_address[2]),
                int (Adapter.adapt.adapter_address[3]),
                int (Adapter.adapt.adapter_address[4]),
                int (Adapter.adapt.adapter_address[5]));
        sMAC = acMAC;
        return true;
    }
    else {
        char acTemp[80];
        ostrstream outs(acTemp, sizeof(acTemp));
        outs << "error " << Ncb.ncb_retcode << " on ASTAT" << ends;
        sMAC = acTemp;
        return false;
    }
}
int main()
{
    // Get adapter list
    LANA_ENUM AdapterList;
    NCB Ncb;
    memset(&Ncb, 0, sizeof(NCB));
    Ncb.ncb_command = NCBENUM;
    Ncb.ncb_buffer = (unsigned char *)&AdapterList;
    Ncb.ncb_length = sizeof(AdapterList);
    Netbios(&Ncb);
    // Get all of the local ethernet addresses
    string sMAC;
    for (int i = 0; i < AdapterList.length; ++i) {
        if (GetAdapterInfo(AdapterList.lana[i], sMAC)) {
            cout << "Adapter " << int (AdapterList.lana[i]) <<
                    "'s MAC is " << sMAC << endl;
        }
        else {
            cerr << "Failed to get MAC address! Do you" << endl;
            cerr << "have the NetBIOS protocol installed?" << endl;
            break;
        }
    }
    return 0;


 qualche suggerimento?
Mi sembra di aver sentito, qualche mese fa, sulle 30-35 mila lire...
-- 
Luc.

GetVolumeInformation ti restituisce il Volume Serial Number che č un numero
seriale che viene assegnato dopo la formattazione ad un disco. Se riformatto
tale numero cambia, ma, la cosa piů grave č che č possibile modificare tale
numero.
Se copi (es. con ghost) l'hard-disk destinazione ha lo stesso Volume Serial
Number del disco sorgente.
Comunque sono riuscito a trovare in rete del codice per la lettura del
seriale :)
Grazie per la risposta .
--
       Stefano Malavasi

 seriale :)
*Quale* seriale ?
L'unico numero seriale che conosco per un disco fisso e che
sia leggibile su tutti i dischi fissi e', appunto, quello
che viene assegnato all'atto della formattazione...
Ne esistono altri ? c'e' un metodo standard per leggerlo da
tutti i dischi ?


Quel numero a cui fai riferimento è il cosidetto Volume Serial Number (presente
sui sistemi operativi MS dal DOS 4.0, credo, in poi). E' quello che vedi
attraverso il comando vol.
Esiste (ed è quello che chiedevo io) un numero seriale dell'hard-disk (inserito
dal produttore) che non può (per quanto ne so io) essere modificato. Se apri il
PC e guardi l'hard-disk sopra trovi stampato, insieme ad altre cose, un numero
seriale.
Ottenerlo è un po' incasinato comunque sono riuscito a trovare le routine per
VC++.
--
       Stefano Malavasi

 a trovare le routine per VC++.
Dubito molto che esista un modo standard per leggere
questo numero dall'hard disk, perche' temo che la sua
memorizzazione dipenda da produttore a produttore.  
Non e' detto, IMHO, poi, che questo numero sia 
leggibile dall'utente.
Ti dispiacerebbe postare la routine ?


leggibile dall'utente.
E' un valore che ottieni andando a leggere i dati nell'hard disk nello
stesso modo in cui leggi i parametri S.M.A.R.T.
Se vuoi verificare scaricati un mio programmino che fa proprio questo
(vedi sito nella signature).
Il codice d'esempio per leggere questi dati si trova su msdn (cerca
"smartapp.exe")


Il sorgente per fare quello che ti dicevo lo trovi su questo sito
http://www.winsim.com/diskid32/diskid32.html
--
       Stefano Malavasi

 
http://www.winsim.com/diskid32/diskid32.html
"Please note that DiskId32 is NOT warranteed nor 
 supported by WinSim Inc.
 Warning ! This utility may lock up your PC ! 
 Warning !"
Questo mi lascia un po' perplesso.


Beh si ... ma nel mio caso può andare forniamo il PC insieme al programma
e riesco a vedere prima se blocca qualcosa o no.
Anche se usi delle utility tipo stress test hai degli avvertimenti di
quel tipo ... in molti casi li mettono per proteggersi da eventuali
danni che potrebbero essere causati dal software.
Comunque considerata che le chiavi hardware sono state definite "costose"
e qui non si vogliono comprare e che il Volume Serial Number è poco
sicuro (in quanto replicabile) questa è l'unica alternativa che mi resta.
--
       Stefano Malavasi

 sicuro (in quanto replicabile) questa č l'unica alternativa che mi resta.
Gia'.  E' molto interessante sapere che e' possibile recuperare
questi dati.  Una domanda: come mai sotto Windows NT/2K non e'
necessario il vxd ?  Comunque grazie di avermi messo a conoscenza
di questo seriale, puo' tornare molto utile.


 e qui non si vogliono comprare
Eh??? Vendete software + PC e non potete permettervi un dongle da €15???
-- 
Luc.

Non è che NON possiamo ... non vogliono spenderli è diverso. Io realizzo il
software in funzione delle specifiche che mi danno :)
--
       Stefano Malavasi

 software in funzione delle specifiche che mi danno :)
Contenti voi... A noi, per sproteggerci il codice, devono avere le p*alle  
quadrate... 8)
-- 
Luc.

 quadrate... 8)
ROTFL... la possibilita' di sproteggere il software non dipende
dall'uso o meno di una chiave hardware, ma di come si compiono
gli accessi alla chiave per le verifiche.  Io ho visto sproteggere
software protetto da chiavi a botte di PCTools.


 gli accessi alla chiave per le verifiche.
Pensa che il ns. software cambia di comportamento a seconda degli 
algoritmi che sono implementati nella chiave...
Ovviamente, però, nulla è "insproteggibile"! 8)
-- 
Luc.

Beh se metti un riferimento a dell'hardware (sia esso una chiave o
altro) devi comunque disassemblare il codice. Più di così da un punto di
vista del programmatore non si può fare. Se uno poi lo va a
disassemblare non c'è protezione che tenga.
--
       Stefano Malavasi

 algoritmi che sono implementati nella chiave...
Devo ancora vedere un software dotato di chiave hardware che non sia
stato crackato usando esclusivamente degli strumenti software.
Esistono alcuni casi molto particolari in cui la chiave hardware da'
effettivamente una protezione quasi totale dagli hack software (casi in
cui la chiave non solo partecipa attivamente al funzionamento del
programma, ma anche al processo di condizionamento dei dati); nella
maggior parte dei casi invece essa viene soltanto utilizzata in
meccanismi di autenticazione, usando algoritmi il cui grado di sicurezza
e` irrilevante (dato che il crack viene fatto "a monte", capendo gli
effetti di questi algoritmi piu` che il loro funzionamento).
--
Lorenzo

effetti di questi algoritmi piu` che il loro funzionamento).
Forse sono male informato, ma ho sentito che i produttori di chiavi
non rilasciano le esatte specifiche o i sorgenti per leggere/scrivere
in esse. Quindi come fai a fare un buon software che gestisce la
chiave al meglio se sei costretto a usare le Api preconfezionate del
produttore?
Paolo

produttore?
Non ho esperienza in merito, ma so che se possono disassemblare un
programma possono fare tutto...
In passato avevo rilasciato come shareware un programma che aveva una
limitazione temporale, dopo ogni x minuti terminava l'esecuzione.
Qualche tempo dopo ho trovato un crack che applicato al mio exe
(scritto in puro C++ e Win32) toglieva quel timer...
A proposito di disassembler, non e' che con il nuovo formato di exe
generato dall'ambiente .Net e funzionante nella CLR le operazioni
"illecite" sugli eseguibili saranno facilitate ?

produttore?
Che vuol dire "gestire al meglio" ?
La chiave hardware, nella maggior parte dei casi, funge da
"sigillo di garanzia".  Il ponte tra il software e
l'hardware e' costituito dalle API di un determinato
produttore.  Ma se io, via software, riesco a intercettare
il traffico tra il programma e la chiave, il gioco e' fatto:
ho crackato il programma.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]

 ho crackato il programma.
 
Esatto, questo è ovvio. Ed è proprio per questo che le API vengono 
mascherate tramite codice dummy, complicatissimo e fuorviante. Poi gli 
accessi vengono eseguiti in maniera temporal-casuale in modo da rendere 
ancora più complessa la sprotezione del software.
E' dal '97 che nessuno ci sprotegge... prima non si usavano le HW-KEY... 
8)
-- 
Luc.

 E' dal '97 che nessuno ci sprotegge... prima non si usavano le HW-KEY... 
Generalmente chi si vanta di questi successi, viene smentito
il giorno seguente ;)


E' sola una questione di interesse di mercato ... se fai un'applicazione
indirizzata ad una fascia ristretta e poco interessata a chi deve
sproteggere il codice č facile (utilizzando come fate giustamente voi i
migliori accorgimenti) restare protetti piů a lungo.
Ma TUTTI i software fatti che hanno un mercato piuttosto ampio sono stati
sprotetti. Se esistesse un metodo sicuro non credi che la M$ l'avrebbe usato
per XP ?
--
       Stefano Malavasi

 
Se il codice che viene passato al CLR è simile al bytecode di java, 
credo di sì (esistono parecchi tool per riconvertire il bytecode in 
sorgente abbastanza comprensibile e, ovviamente, anche qualche tool per 
"offuscare" il bytecode).
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

 E' sola una questione di interesse di mercato ... 
Sono d'accordo con te. Noi vogliamo solo rendere difficile la vita ad 
eventuali ns. rivenditori 'malintenzionati'.
-- 
Luc.

 il giorno seguente ;)
Ma tu sai che con te mi diverto a dire queste cose... 8)
-- 
Luc.

migliori accorgimenti) restare protetti piů a lungo.
Chiarissimo, inoltre e' evidente che spesso un software "di nicchia"
ha bisogno di assistenza tecnica da parte della software house che
l'ha prodotto, chi ha una copia pirata/sprotetta non ne puo'
usufruire.


senza timer?
Mi spiego meglio, in libera distribuzione avevo messo la versione
completa ma con messaggi e timer per ricordare e invogliare la
registrazione, la versione registrata (che spedivo direttamente "ai
clienti") non aveva queste aggiunte.
La soluzione che ho trovato, volendo continuare a distribuire questa
applicazione senza farmi fregare (ricordando che il realta' tutto cio'
lo facevo e lo faccio per hobby) nelle versioni successive ho
"castrato" a livello di funzioni linkate gli .exe...


senza timer?
Mi spiego meglio, in libera distribuzione avevo messo la versione
completa ma con messaggi e timer per ricordare e invogliare la
registrazione, il crack mi faceva saltare queste chiamate.
La versione registrata (che spedivo direttamente "ai clienti") non
aveva queste aggiunte. 
La soluzione che ho trovato, volendo continuare a distribuire questa
applicazione senza farmi fregare (ricordando che il realta' tutto cio'
lo facevo e lo faccio per hobby) e' stata quella di "castrare" le
versioni successive in fase di link per eliminare fisicamente alcune
funzioni. Chi si registra riceve via email la versione completa
(trattandosi di utility scritte in C++ e Win32 l'exe e' piccolo).


 difficoltà di sprotezione, non eliminarla.
Posso chiederti che cosa scrivete ? software per enti militari ?
Il sistema di controllo degli accessi alla Casa Bianca ?


 Posso chiederti che cosa scrivete ?
Sistemi editoriali.
-- 
Luc.

Salve
Ho il seguente problema, ho realizzato un servizio web (
VS.NET
 Beta2)
e lo vorrei far "esegure" (o meglio invocare) da un cliente. Il
servizio web è in locale, e funziona regolarmente:
se da IE lancio
http://localhost/WebService1/Service1.asmx
funziona tutto, e mi elenca i metodi disponibili e li posso anche
richiamare. Finora tutto ok.
Se pero provo ad invocare un metodo del servizio web da un client
(ovviamente ho creato la classe proxy), mi risponde con l'errore HTTP
401 - Access Denied.
Mi succede la stessa cosa se invece di localhost uso 127.0.0.1 (che
dovrebbero essere equivalenti).
C'è modo di risolvere la situazione, per completezza uso Win XP
Professional + IIS in dotazione con questa versione.
Beppe