Appunti su chiavi Hasp e SmartCards by BlackDruiD

Questo file ha il solo scopo di approfondire la vostra conoscenza sulle chiavi HASP e sulle SmartCards, quindi non mi assumo nessuna responsabilità per quello che farete con le informazioni contenute su questo file.

musica di supporto morale: Machine Head, Korn, Manowar,Helloween,Angra,Dickinson.
saluto tutti i menbri di Crack-It ed in particolare i r|ngzeristi, ^courier,YaDo e Furb3t YaDo, ^Courier, Furb3t, NCG e xOA.
Scrivo questo testo con il solo scopo didattico (hehehe), quindi, se fate qualche cazzata con questo testo ,bè, cazzi vostri. Il mio obiettivo è mostrare ai programmatori il funzionamento delle chiavi hasp e delle smartcard in modo che, conoscendole meglio imparino a proteggere al meglio i propri prog, impedendo che questi vengano reversati.

Per ogni critica(costruttiva) scrivetemi a black_druid@hotmail.com.

Evitate di mandarmi insulti per ciò che ho scritto, se pensate che non serva a un cazzo, smettete di leggere ora. 

 

Introduzione alle chiavi Hasp

Argomenti trattati:

1.Introduzione alle chiavi

2.Metodi di protezione

3-Funzionamento

4-PCS

Le Hasp sono tra le migliori chiavi di protezione del software poichè, a differenza di altre utilizzano + metodi di protezione simultaneamente.

Caratteristiche comuni delle hasp:

-Il codice(Developer Code) che viene assegnato ad un acquirente è univoco e non modificabile poichè e 'salvato' all'interno di un ASIC(Application Specific Integrated Circuit) cioè un circuito che si trova all'interno della chiave.In questo modo, anche smontando la chiave è impossibile vedere tale codice.

-Le password fornite con la chiave sono 2 e anch'esse non modificabili.

-I metodi di protezione sono 2: Envelope e API.

-Ogni chiave ha un ID number univoco.

-Le hasp supportano una grande quantità di compilatori.

-Le hasp supportano diverse piattaforme(ibm pc, unix, apple e nec)

-Utilizzo di algoritmi di protezione avanzati e di tecniche anti debugging sviluppati direttamente dalla casa costruttrice.

-Utilizzo di comunicazioni criptate: le comunicazioni tra l'applicazione e la chiave è criptata impedendo così l'emulazione software della chiave.

In commercio esistono numerosi tipi di hasp che si differenziano per le loro caratteristiche ma che hanno di base tutte le funzionalità sopra descritte:

-Hasp-3: la hasp + economica, senza memoria.

-Hasp36:come la hasp3 ma utilizzata sui nec pc

-MemoHasp: hasp dotate di una memoria di lettura/scrittura utilizzabile anche run-time

le MemoHasp si suddividono in MemoHasp-1(con 112 byte di memoria) e MemoHasp-4(496 byte di mem).

-NetHasp: come le MemoHasp-4 ma con alcune funzionalità in più:

-connettendo una sola chiave ad un computer facente parte di una rete, l'hasp è in grado di proteggere un software e limitare il numero dei pc che possono usare tale applicazione.

-TimeHasp e TimeHasp-4: dotate di un real time clock che le rendono perticolarmente adatte alla protezione time-limited demo.Hanno una zona di memoria di 16 byte che contiene informazioni sulla data di 'scadenza' di un'appl.(le TimrHasp-4 hanno un'altra zona di memoria di 496 byte).

Pausa, vado un attimo a bere, torno subito.

Metodi di protezione

1-Envelope
il metodo envelope consiste nel proteggere e criptare uno o più EXE(o anche Win DLL) dell'applicazione in modo da renderla(secondo i tecnici hasp) non debuggabile e non disassemblabile .

2-API
questo metodo consiste nell' utilizzare le API specificatamente create per le hasp all' interno di un'applic.
Attraverso le API si possono inserire call all'interno del prog da proteggere per verificare la presenza della chiave, verificare le password, ecc.
Le api supportano una grossa quantità di compilatori e sistemi operativi : dos,windoz,windoz32, os/2;
Ah, dimenticavo, le api sono protette e criptate.

E' possibile utilizzare entrambi i metodi di protezione (soluzione più sicura) oppure uno dei due.
Le chiavi hasp consentono inoltre di utilizzare il metodo PCS (pattern code security) che spiegerò in dettaglio più avanti.

Le Hasp come ho già scritto sopra impediscono il debugging ed il disassembling del codice in questo modo:
-'bloccando' gli interrupt del debugger rendendo difficile l'attivazione del debugger stesso.

-implementando 'trappole' speciali per gli hardware debugger.

-rendendo difficile il tracing del codice.

-utilizzando delle 'trappole a tempo'

-usando il PCS

-rilasciando spesso nuove release con nuovi metodi di protezione

-inserendo il virus ebola all'interno della chiave e liberandolo all'esterno ad ogni tentativo di reversing riscontrato.

-allegando al pacco contenente la chiave un  negrone di 2 metri particolarmente dotato che si diverte col tuo culo in caso ti veda reversare

N.B. gli ultimi 2 metodi di protezione sono ancora in fase di studio e verranno rilasciati solo con la release 7.0 (la casa produttrice dell'hasp cerca urgentemente volontari per testare i due nuovi  metodi)

 

Funzionamento

Allora, come ho già scritto prima, ogni acquirente ha un codice(Developer code) univoco e non modificabile.
All'interno di ogni chiave c'è un circuito che contiene un algoritmo per la generazione di valori di ritorno e tale algoritmo si basa sul Dev Code.
Per verificare che la chiave connessa sia effettivamente quella giusta, all'interno dell'applicazione invio alla chiave una o più call passandogli come parametro 1 numero casuale(seed code); il numero passatogli viene utilizzato(dal circuito con l'algoritmo) per calcolare 4 codici di ritorno che andrò a verificare per vedere se la chiave connessa è quella giusta.
Per rendere più dura la vita del reverser si devono usare le funzioni messe a disposizione dalla casa produttrice dell'hasp
cioè bisogna eseguire spesso call per verificare i valori di ritorno(cambiando il seed code ogni vlta), fare un check sull'id della chiave ecc. Per migliorare la protezione, il check dei valori di ritorno ed il seed value dovrebbero essere criptati e cambiati ogni volta(es. prendendo il valore della data attuale o dell' ora in modo che il prog abbia un numero pressochè infinito d codici).
Ovviamente due chiavi con Dev Code diversi, eseguendo una call con seed code uguale, rirorneranno dei valori diversi dato che l'algoritmo di computazione dei 4 valori di ritorno si basa sul Dev Code.

 

PCS

Per rendere ancora più duro il reversing delle chiavi hasp, quei quattro pirla degli sviluppatori hasp, hanno implementato una funzione chiamata pcs per cercar di far sclerare il reverser durante il tracing del codice.

Infatti mentre senza pcs il funzionamento è il seguente:

1 Chiamata alla procedura di protezione

2.verifica dei codici di ritorno

3.esecuzione di  una determinata azione se i codici sono errati(chiudere l'appl, ecc).

con il pcs invece ad ogni chiamata di funzione, come per magia ne vengono generate un numero a scelta tra 1 e 25 ognuno con un seed code differente; non solo ma vengono generate in diversi punti del codice quindi son cazzi amari.

 

Introduzione alle SmartCards

Una smart card è una 'tessera' di plastica di dimensioni pari a quelle di una carta di credito, con un chip inserito all'interno anzichè la classica banda magnetica.

Ci sono tre tipi di smart card:
-A memoria: hanno una zona di memoria nella quale si può leggere/scrivere dati)
-A memoria protetta: come la carta a memoria ma con in aggiunta una funzione di protezione dalla scrittura.
- A CPU: con una cpu all'interno che offre un'elevata sicurezza, vari livelli di password e gestione dei file in memoria. Alcuni tipi di carte a cpu dispongono anche di algoritmi di criptazione(DES,TESA7 ecc.)

Le smartcard sono principalmente utilizzate per:

-firma elettronica
-transazioni bancarie
-schede per cellulari gsm
-decoder satellitari
-carta di identita elettronica(che in Italia è stata da poco approvata in parlamento)

le smartcard sono conformi agli standard internazionali ISO 7816-1(che definisce le caratteristiche fisiche della carta) e ISO 7816-2(definisce la dimensione e la posizione del chip all'interno della carta).

le carte a cpu sono inoltre conformi ai seguenti standard:

-ISO 7816-3: definisce i segnali e i protocolli di trasmissione in questo modo:
    -Protocollo T0 :Protocollo di trasmissione caratteri asincrono e half-duplex.
    -Protocollo T1: come il T0 ma permette il trasferimento dei dati in blocchi
    -Protocollo T14:riservato per i protocolli non standardizzati

ISO 7816-4:definisce il livello di applicazione.

Per quanto riguarda le carte a memoria, non esiste uno standard universale, perciò questo tipo di carta si basa sull'ISO 7816-3 che definisce le procedure di funzionamento delle carte con protocollo sincrono

 Carte a Memoria

le carte a memoria usano un protocollo di comunicazione sincrono.Non hanno capacità di gestione dei file ma solo di immagazzinamento dati.  Le carte a memoria non hanno sicurezza poichè permettono sia operazioni di lettura che di scrittura senza richiesta di password. Le carte a memoria che conosco personalmente sono divise in due 'famiglie': I2C e Extende-I2C.

I2C: hanno 2 o 4 kilobits di memoria EEPROM.
X-I2C:hanno fino a 64 kilobits di EEPROM

Carte a Memoria Protetta:

Le carte a memoria protetta utilizzano logica cablata per controllare gli accessi in lettura e scrittura.
Alcune carte a memoria protetta da 2 o 3 bus sono conformi agli standard ISO 7816-3 per quanto riguarda l'alimentazione della carta e l'ATR(answer to reset) mentre altre non lo sono.

Le carte a memoria protetta sono la miglior soluzione per applicazioni nelle quali dati riservati devono essere salvati in zone di memoria protettE da scrittura ma che non richiedono un'elevata sicurezza.

Ad esempio una nota società petrolifera italiana usa questo genere di carte nei distributori di benzina per le varie offerte commerciali.
Le carte a memoria protetta si distinguono in carte a 2bus e a 3bus

carte a 2 bus:

32 dei 256 byte di memoria hanno un bit di protezione che permette il 'bloccaggio' dei dati nel rispettivo byte di memoria.

carte a 3 bus:

il bit di protezione è esteso a tutta la memoria(1024 bytes).

le carte a memoria protetta contengono una password per l'accesso in scrittura(PSC) che ne aumenta il livello di sicurezza.

In questo tipo di carte, l'accesso in lettura è libero mentre per poter scrivere bisogna fornire una password; il numero di errori non è però infinito, infatti solitamente dopo tre fallimenti la carta si blocca definitivamente e può essere letta ma mai più scritta.

Carte a CPU

le carte a cpu dispongono di un microprocessore che gestisce le operazioni ed utilizzano un protocollo asincrono conforme agli standard ISO7816-3T=0,T=1 e T=14.

le carte a cpu supportano:

-gestione di file
-gestione di chiavi di accesso
-regole di accesso ai dati
-autenticazione
-crittografia

una delle caratteristiche principali di questo genere di carte è la capacità di gestire più applicazioni e salvarle in file e directory differenti.

Le carte a cpu supportano livelli multipli di chiavi di accesso.E' possibile usare le chiavi per definire precise regole di accesso ai file e alle directory.Alcune carte hanno inoltre algoritmi di criptazione che migliorano notevolmente la sicurezza dei dati.

Un potente meccanismo di autenticazione assicura che le carte a cpu siano utilizzate esclusivamente dal proprio padrone e soloin un 'ambiente' predefinito.

 Carte T=0

Il protocollo di trasmissione per queste carte è sempre unidirezionale.

ISO 7816-3 definisce un set di comandi nel seguente formato:

wpe1.jpg (2639 bytes)

Class e instruction forniscono il comando ISO7816-3.P1 e P2 parametri specifici per ogni comando.P3 indica la lunghezza la lunghezza dei dati.

I dati sono sono usati per i comandi di scrittura.

Struttura di ritorno dalla carta all’applicazione:

wpe2.jpg (2454 bytes)

sw1 e sw2 indicano lo stato dell’operazione svolta.I valori cambiano in base al tipo di carta.Quando un’operazione è eseguita con successo,sw1 e sw2 ritornano sempre 90,00 indipendentemente dal tipo di carta.

Carte T=1 e T=14

Nel protocollo T=1 i comandi da e verso la carta sono eseguiti in una singola operazione di trasmissione.

Struttura di trasmissione:

wpe3.jpg (1467 bytes)

NAD: the Node Address Destination è composto da 2 nibbles: sorgente e destinazione. Quando si stanno inviando dati alla carta, il sorgente è l’applicazione e il destinatario è la carta e viceversa per l’operazione inversa.

I valori del NAD dipendono dal tipo di carta utilizzata.

DATA: determina il tipo dioperazione da effettuare(lettura,scrittura ecc.).

Caratteristiche delle carte a memoria protetta a 3 bus

wpe4.jpg (11759 bytes)

Caratteristiche delle carte a memoria protetta a 2 bus

wpe5.jpg (12967 bytes)

 

per chiarimenti o commenti scrivete a black_druid@hotmail.com