Creare un Crack Me Linux utilizzando le Qt Libraries - Le basi delle basi delle Qt Libraries
Pubblicato da blAAd! il 09/02/2001
Livello base
Introduzione
Linux è notoriamente un sistema 'free' & 'open source', quindi la stragrande maggioranza dei programmi che girano sotto questo sistema operativo, non necessitano di particolari attenzioni da parte del 'cracker'. Nulla però ci impedisce di creare degli appositi 'Crack Me' in stile Window$.
Quello che cercherò di fare in questo tute, è di spiegare come realizzare un Crack Me con vari 'push button' e 'message box' varie, utilizzando le comuni Qt libraries (è richiesta in questo caso una minima conoscenza del C++, in quanto le Qt sono progettate in una ottica ad 'oggetti'. Questo vi assicuro, facilita di molto il lavoro....).
Le librerie le troverete molto probabilmente, già installate sul vostro Linux, ed ancor più probabilmente sotto la directory /usr/lib/qt***/. Un consiglio che vi posso dare, è di andarvi a leggere i vari tutez presenti (anche perchè molto di ciò che troverete qui, è preso da lì :).
Un'ultima cosa sulle librerie Qt: sembra che si sia da poco risolta la questione sulle licenze GPL (cioè un tipo di licenza creata dalla GNU, che lega il programma alla filosofia 'free').
Prima la sua licenza era di tipo QPL (con maggiori restrinzioni rispetto alla GPL). Le versioni precedenti la 2.2 quindi (compresa la nostra 1.44) presentano dei lievi 'handicap' a livello di documentazione e di sorgente (comunque niente di grave).
FINE DELL'ANSA.
Scarica l'allegato.
Programmi usati
Iniziamo
Le librerie Qt forniscono all'interno di Linux, l'ossatura su cui si basa il sistema KDE. Nascono da una idea di un norvegese, Troll (un troll??), e presentano oltre ai tradizionali componenti visuali per la creazione di finestre, edit line, message box, ecc., anche un alquanto semplificato sistema di gestione degli eventi. Ma andiamo con ordine, analizzando gli elementi base che riguardano l'utilizzo delle Qt.
Ho incluso nel tutorial il file di -making- e di codice, relativi al programma finale. Per gli altri esempi più brevi, controllate quelli allegati alla documentazione delle Qt libraries (ho comunque inserito i listati)...
Consideriamo il classico programma HELLO WORLD (lo traggo uguale, dai tutorials ufficiali delle librerie Qt):
#include <qapplication.h>
#include <qpushbutton.h>
int main (int argc, char **argv)
{
QApplication app(argc, argv);
QPushButton hello("Hello World");
hello.resize(100,30);
app.setMainWidget (&hello);
hello.show();
return app.exec();
}
Questo breve programma, include dei primi importanti elementi:
#include <qapplication.h>
#include <qpushbutton.h>
#include <qfont.h>
int main (int argc, char **argv)
{
QApplication a (argc,argv);
QWidget w;
w.resize(200,120);
QPushButton hello("Hello UIC", &w);
hello.move (62,40);
hello.resize (75,30);
hello.setFont(QFont ("Times",18,QFont::Bold));
QObject::connect(&hello,SIGNAL(clicked()),&a,SLOT(quit()));
a.setMainWidget(&w);
w.show();
return a.exec();
}
Qui la cosa si fà più interessante. Vediamo perchè:
#include <qapplication.h>
#include <qfont.h>
#include <qpushbutton.h>
#include <qwidget.h>
class Controllo : public QWidget {
Q_OBJECT
public:
Controllo(QWidget *parent=0, const char *name=0);
public slots:
void esci();
private:
QPushButton* quit;
};
Controllo::Controllo (QWidget *parent, const char *name)
:QWidget (parent,name)
{
quit = new QPushButton ( "Quit",this, "quit");
quit->move( 47, 40 );
quit->resize( 106, 30 );
quit->setFont( QFont( "helvetica", 18, QFont::Bold ) );
connect( quit, SIGNAL(clicked()), SLOT(esci()));
}
void Controllo::esci() { quit() }
Questa classe, con relativo costruttore e funzione slot, all'interno di un programma fornisce lo stesso risultato finale dell'esempio precedente, ma tecnicamente porta con sè profonde differenze. Innanzitutto la classe Controllo eredita public la classe QWidget (che a sua volta eredita da QObject). Subito dopo la parentesi '{' troviamo la macro Q_OBJECT, che permette di creare all'interno della nostra classe, i SIGNAL/SLOT necessari, tramite public slots e signals. Ora nel costruttore poniamo, oltre all'istanziamento del pulsante, la sua gestione tramite la funzione connect(), che in questo caso richiede solo un puntatore (quit), in quanto la SLOT a cui è connessa, è interna alla classe stessa. Altra cosa molto importante da notare, è come all'interno dello header del costruttore, gli argomenti siano posti a 0. In questo caso avremo una top level window (abbiamo ridefinito gli argomenti nel costruttore, come quelli della classe QWidget da cui eredita). const char *name stà ad indicare l'ID della finestra (e non la title bar), mentre parent, come dicevamo, impostato a 0 dà una posizione di gerarchia "superiore" al nostro widget.
int main (int argc,char **argv)
{
QApplication a (argc,argv);
Controllo w;
a.setMainWidget( &w );
w.show();
return a.exec();
}
Provate ora a compilare il programma.... Probabilmente (anche se tutto è stato fatto correttamente), avrete un errore in output, relativo alla mancanza di una table pointer, cioè una tabella con dei puntatori alle funzioni di slot/signal, che si riferisce nel nostro caso, alla sola funzione esci(). Come possiamo risolvere il problema?? Qui entra in gioco il moc (acronimo di META OBJECT COMPILER). Il moc legge le dichiarazioni delle classi, e genera un file sorgente C++ che contiene tutti i nomi degli slots e dei signals interni alla classe. Questo file deve essere poi incluso nel nostro codice, per venir compilato e linkato con il programma (guardate il programma finale, l'include sopra main()).
#include "/usr/include/qt/qapplication.h" // i paths degli header files installati sul mio
sistema
#include "/usr/include/qt/qpushbutton.h"
#include "/usr/include/qt/qfont.h"
#include "/usr/include/qt/qlineedit.h"
#include "/usr/include/qt/qlabel.h"
#include "/usr/include/qt/qwidget.h"
#include "/usr/include/qt/qmessagebox.h"
#include "string.h"
class Controllo : public QWidget {
Q_OBJECT // macro necessaria se si vogliono immettere slots e/o signals
public:
Controllo(QWidget *parent=0, const char *name=0);
// costruttore che imposta il nostro widget a top level window
public slots:
void decodifica(); // la nostra slot
private:
QPushButton* quit; // definizione dei widgets child che useremo nel nostro crackme
QLabel *qlab; // chiaramente potete inserirne a vostro piacimento
QLabel *info;
QLineEdit *qle;
};
// codice del costruttore della classe Controllo
Controllo::Controllo (QWidget *parent, const char *name):QWidget (parent,name)
{
setCaption ("title bar"); // immette il titolo alla finestra
setMinimumSize( 200, 180 );
// misure massime e minime per la finestra coincidono
setMaximumSize( 200, 180 ); // quindi non è possibile far variare la sua misura
quit = new QPushButton ( "Check It",this,"check" ); // crea il pulsante che useremo per il
controllo del seriale
quit->move( 47, 40 );
quit->resize( 106, 30 );
quit->setFont( QFont( "helvetica", 18, QFont::Bold ) );
qlab = new QLabel("SERIALE : ",this,"hl"); // crea l'etichetta da affiancare alla edit line
per il seriale
info = new QLabel("",this,"nfo"); // nuova etichetta "espansa" come Box in cui scrivere
informazioni personali e regole per il crack me
info->setFrameStyle( QFrame::Box | QFrame::Sunken);
info->setText ("info e condizioni di regolamento"); // controllare le specifiche per le
informazioni varie di dimensionamento, etc...
info->move(1,75);
info->resize(200,100);
info->setAlignment(AlignHCenter | AlignVCenter);
qle = new QLineEdit(this); // creazione della edit line su cui viene inserito il seriale per
un massimo di 15 caratteri
qle->setMaxLength(15);
qle->move(80,1);
qle->resize(120,30);
connect( quit, SIGNAL(clicked()), SLOT(decodifica())); // 2 connects che controllano il
seriale quando viene premuto il pulsante
connect( qle, SIGNAL(returnPressed()), SLOT(decodifica())); // o quando viene premuto enter
nella edit line
}
// codice della funzione decodifica() interna allla classe Controllo
void Controllo::decodifica()
{
bool flagga=FALSE;
// dove inserirete la vostra eventuale routine di crypt del codice
// qle->text() preleva il seriale dalla edit line
if (flagga == TRUE) // condizione che si verifica nel caso si indovini il seriale
QMessageBox::information ( 0,"titolo della message box","INDOVINATO", QMessageBox::Ok);
else
QMessageBox::information ( 0,"titolo della message box","SBAGLIATO", QMessageBox::Ok);
// le message box sono varie nelle qt, quindi vi consiglio di controllare le specifiche
// chiaramente questo è solo una semplice impostazione di routine di crypt e controllo
%che
// potete variare a vostro piacimento
}
#include "crackme.moc" // importante : imposta la tavola di puntatori per le slots e i
signals
int main (int argc,char **argv)
{
QApplication a (argc,argv);
Controllo w; // questa riga sostituisce ora QWidget w;
a.setMainWidget( &w );
w.show();
return a.exec();
}
Cosa fà il programma?? Rileva la pressione del pulsante, o del tasto enter all'interno della edit line. E visualizza la message box relativa al successo o meno. Chiaramente dovrete inserire una routine di protezione vostra. Il programma, una volta capito il funzionamento generale delle librerie Qt, può essere tranquillamente stravolto creando un crackme ad esempio, del tipo nome/seriale, e così via.Conclusioni
Un saluto a tutti quelli della RACL ovviamente.
Sicuramente questo tutorial non è esauriente riguardo all'argomento delle Qt libraries, e tantomeno pretende di esserlo.
Comunque ho cercato di fondere un po' delle informazioni dei tutorials ufficiali con la mia esperienza personale, cercando di rendere estremamente facile il discorso (che poi non è particolarmente complesso), sperando che il tutto serva almeno ad avvicinare qualcuno alla programmazione ed al reversing sotto Linux (il che sarebbe veramente molto), magari creando e risolvendo crackme (per iniziare và più che bene). Sono molto graditi degli approfondimenti o delle correzioni sull'argomento. Ok, questo è quanto. ) I A 0 ;-)
Attenzione
Questo tutorial è a solo scopo informativo. Ne io, ne i possessori del sito, siamo responsabili di un eventuale abuso di ciò che è stato trattato, per scopi di pirateria e violazione di copyright.
In qualsiasi caso rubare è sbagliato, e i vari tutorial presenti sul sito dovrebbero aiutare a comprendere l'impegno profuso da parte dei programmatori, per la creazione d'ogni singolo programma.