Tutti noi ci siamo chiesti almeno una volta ma come vengono crackati i programmi ? Esistono diversi metodi per aggirare la protezione di un programma o di un gioco la risposta è intrisa di complessità. Oggi, vorrei illustrarvi la tecnica dell’ingegneria inversa, comunemente conosciuta come reverse engineering. Prima d’iniziare è importante sottolineare che il cracking è un’attività illegale che può comportare conseguenze penali.
L’ingegneria inversa è una pratica che coinvolge l’analisi di un prodotto per capire come è stato creato e come funziona. Nel contesto del cracking dei programmi, l’obiettivo è bypassare le misure di sicurezza implementate dai creatori del software. In questo articolo, esamineremo i passaggi chiave coinvolti nell’ingegneria inversa e come viene utilizzata per violare la protezione dei programmi.
Creieremo, a scopo didattico, una semplice applicazione protetta da codice seriale, mostrando come, tramite reverse engineering, si possa facilmente violare il codice di protezione.
Strumenti e tecniche:
Esistono diverse tecniche di reverse engineering, ognuna con i suoi strumenti specifici. Tra le più utilizzate troviamo:
- Disassemblaggio: Converte il codice macchina in linguaggio assembly, rendendolo più comprensibile e leggibile.
- Decompilazione: Ricostruisce il codice sorgente originale partendo dal codice macchina, facilitando la comprensione e la modifica del programma.
- Analisi statica: Esamina il codice software senza eseguirlo, rilevando potenziali vulnerabilità, errori di programmazione o comportamenti indesiderati.
- Analisi dinamica: Esamina il codice software mentre viene eseguito, monitorando il suo comportamento in tempo reale e identificando eventuali anomalie o vulnerabilità nel processo di esecuzione.
Iniziamo Costruiamo la nostra app protetta da serial number
Per illustrare l’utilizzo degli strumenti di reverse engineering, creeremo una semplice applicazione in linguaggio C. Questa applicazione richiederà all’utente l’inserimento di un codice seriale (esempio: “x6pw2023!”), e se il codice inserito risulterà corretto, l’applicazione mostrerà un messaggio di benvenuto e non richiederà più il codice ai successivi avvii. Viceversa, se il codice inserito non è valido, l’applicazione avviserà l’utente. Utilizzeremo un editor testuale per digitare il seguente codice, salvando il file come segue “hjapp.c” all’interno del Desktop.
#include <stdio.h> #include <string.h> int main() { char codiceCorretto[] = "x6pw2023!"; char codiceInserito[20]; int sbloccato; // Leggi lo stato di sblocco dal file FILE *file = fopen("support-file.txt", "r"); if (file) { fscanf(file, "%d", &sbloccato); fclose(file); } else { // Se il file non esiste, crealo sbloccato = 0; file = fopen("support-file.txt", "w"); fprintf(file, "%d", sbloccato); fclose(file); } // Controlla se il programma è già sbloccato if (sbloccato) { printf("Il programma è già sbloccato. Puoi utilizzarlo senza problemi.\n"); } else { // Chiedi all'utente di inserire il codice seriale printf("Inserisci il codice seriale: "); scanf("%s", codiceInserito); // Controlla se il codice seriale è corretto if (strcmp(codiceInserito, codiceCorretto) == 0) { printf("Hai sbloccato l'utilizzo del programma, ora puoi utilizzarlo senza problemi.\n"); sbloccato = 1; // Aggiorna lo stato di sblocco nel file file = fopen("support-file.txt", "w"); fprintf(file, "%d", sbloccato); fclose(file); } else { printf("La password inserita non è corretta. Riprova.\n"); } } return 0; }
Il passo successivo sarà quello di compilare la nostra applicazione, ovvero trasformala da codice C in linguaggio macchina, per compilare l’app utilizzeremo da ambiente Windows il compilatore MinGW
- Scarichiamo il programma di installazione di MinGW: Scarichiamo MinGW cliccando qui, una volta scaricato procediamo con l’installazione del file
mingw-get-setup.exe
.
- Selezioniamo i componenti da installare: Durante la procedura di installazione, verrà visualizzata una finestra che ci permetterà di selezionare i componenti da installare. Selezioniamo la voce “mingw32-base” e “mingw32-gcc-g++” sotto la categoria “Basic Setup”. È possibile anche selezionare altri pacchetti se necessario, ma per compilare programmi C standard, questi due pacchetti sono generalmente sufficienti.
- Impostiamo il percorso di installazione: Durante l’installazione, ci verrà chiesto di selezionare il percorso di installazione di MinGW. Di solito, è consigliabile mantenere il percorso predefinito proposto dall’installatore.
- Completiamo l’installazione: Una volta selezionati i componenti desiderati e il percorso di installazione, facciamo clic su “Install” o “Next” per avviare l’installazione. Seguiamo le istruzioni visualizzate per completare l’installazione di MinGW.
- Aggiungiamo il percorso di MinGW alle variabili d’ambiente: Dopo aver installato MinGW, è necessario aggiungere il percorso della directory bin di MinGW alle variabili d’ambiente del sistema. Selezioniamo la variabile “Path” (o “PATH”) e facciamo clic su “Modifica“. Nella finestra successiva, facciamo clic su “Nuovo” e aggiungiamo il percorso della directory
bin
di MinGW (solitamenteC:MinGWbin
). Assicurandoci che ci sia un punto e virgola;
prima del nuovo percorso per separarlo dagli altri percorsi.
Se abbiamo eseguito tutto correttamente , procediamo con la compilazione del programma
- Apriamo il prompt dei comandi: Apriamo una finestra del prompt dei comandi (cmd) . Possiamo farlo cercando “cmd” nel menu Start o premendo contemporaneamente i tasti “Windows + R” e digitando “cmd” nella finestra di dialogo “Esegui”.
- Navighiamo nella directory del file sorgente: Utilizziamo il comando
cd
per navigare nella directory in cui abbiamo salvato il file sorgente hjapp.c. Nel nostro caso il file si trova all’interno desktop. Quindi utilizzeremo il seguente comando:
cd Desktop
- Compiliamo il programma: Una volta nella directory corretta, utilizziamo il compilatore GCC per compilare il file sorgente
hjapp.c
. utilizzando il seguente comando :
gcc -o hjapp.exe hjapp.c
Questo comando compilerà il file sorgente hjapp.c
e genererà un file eseguibile chiamato hjapp.exe
.
Decompiliamo la nostra Hjapp.exe
Per decompilare la nostra applicazione utilizzeremo il sito opensource DogBolt alias “Decompiler Explorer” che racchiude al suo interno tutta una serie di decompilatori interattivi, tool che, al contrario di quello che fanno i compilatori, cercano di risalire al codice sorgente partendo da un’applicazione compilata.
- Impostiamo DogBolt:
- Su DogBolt, selezioniamo i decompilatori BinaryNinja e Ghidra (vedi box). Deselezioniamo gli altri predefiniti (angr, BinaryNinja e Hex-Rays).
- Carichiamo il file:
- Nella sezione “Upload file”, clicchiamo su “Scegli file” e selezioniamo la nostra app hjapp.exe (DogBolt supporta file fino a 2MB). Il file verrà caricato ed elaborato automaticamente.
- Attendiamo l’elaborazione:
- L’elaborazione potrebbe richiedere alcuni minuti, in base alla lunghezza della coda. I decompilatori genereranno il codice sorgente in linguaggio C.
- Analizziamo il codice:
- Per un programmatore esperto, analizzare il codice sorgente e individuare informazioni utili è un compito relativamente semplice. Per agevolare questo processo, possiamo recarci nella sezione BinaryNinja, individuando la riga 215, dove potremo trovare la password del nostro programma in chiaro.
In conclusione, l’analisi del codice sorgente di un software può avere diverse finalità. Un hacker potrebbe esaminarne il funzionamento al fine di sviluppare crack appropriati, mentre i produttori concorrenti potrebbero studiarne alcune parti per migliorarle, dando così vita a un’applicazione alternativa, magari persino più performante. Tuttavia, è importante notare che in entrambi i casi si potrebbe incorrere in azioni illegali perseguibili dalla legge.