Introduction au Reverse Engineering

Ecrit par Warfo, le 01 Dec 2004 dans la catégorie Reverse Engineering

C'est parti. Cette partie est consacrée aux éléments de base, qui vous serviront à comprendre les tutoriaux sur le cracking, et essentiellement ceux qui suivront celui-là ;).
Bon, qu'est-ce-que le cracking ? Comme vous l'avez remarqué, certains programmes sont limités à une période d'évaluation, ou encore les jeux vous demandent le cd pour jouer. Et bien le cracking consiste à modifier le code désassemblé, déclaré, du soft pour en enlever les protections. Pour cela, il va non-seulement vous falloir des bases en assembleur, ainsi que plusieurs logiciels indispensables :

D'un point de vue général :

Pour l'unpacking :

Il existe bien sûr d'autres logiciels qui vous permettront de cracker, mais je ferai mes tutos en utilisant ceux-là, donc il faudra que vous sachiez déjà utiliser les progs dont vous vous servirez si ce ne sont pas ceux-là.

Dernière précision ;) : si vous lisez ce tut en vous disant que vous allez pouvoir épater vos potes en leur montrant votre premier crack, et que vous serez dans quelques jours un dieu du crack craint et respecté dans le monde de l'underground, sachez que le monde du cracking n'est pas un monde de lamers (ces idiots qui croient tout savoir, qui pensent pouvoir révolutionner le monde avec leur a priori à la con, et qui ne connaissent strictement rien à l'informatique). Si vous vous reconnaissez dans ce que je viens de dire, inutile d'aller plus loin, retournez faire vos devoirs pour demain.

Définitions :


- Assembleur : c'est le langage de programmation ultime, la dernière étape entre l'homme et la machine. Tous les langages de programmation sont d'abord traduits en assembleur avant d'être interprétés par l'ordinateur. C'est aussi ce langage que vous allez voir quand vous désassemblerez votre soft avec un désassembleur/débuggueur.

- API : fonction définit dans une librairie (DLL) et importée par un programme. Ex : MessageBox, MessageBeep, GetLocalTime... Chaque API a sa propre utilité, et il en existe des centaines.

- BreakPoint : permet au logiciel d'être en PAUSE. Pour cela, une interruption, l'int 3, est placée par le débuggueur sur une adresse de manière à ce que le programme s'arrête lors du passage à cette adresse.

- Brute-Force : exécutable qui possède la même routine de vérification qu'un exécutable tierce et qui via des routines d'incrémentation permet de filtrer chaque serial incrémenté.

- Débuggueur : outil permettant de tracer un soft pas à pas les instructions d'un programme et ainsi d'observer les valeurs prises par les différents registres après chaque instruction. Il peut aussi permettre la modification de code en mémoire. Les plus connus sont SoftIce et OllyDbg.

- Désassembleur : outil qui permet d'obtenir en assembleur le listing des instructions d'un programme.

- DLL : bibliothèque de données. Ce sont dans ces DLLs que ce trouvent les APIs que vous importez pour vos programmes, telles que MessageBoxA (user32.dll). Cependant, toutes les DLLs n'exportent pas d'APIs.

- Editeur héxadécimal : prog qui permet d'éditer un soft au format héxadecimal et ASCII; les plus connus sont: Hiew, Hex workshop, Ultraedit et Winhex (que je trouve très bien d'ailleurs).

- Entry Point : point d'entrée d'un programme. C'est la première instruction qui sera exécutée par celui-ci. EP = OEP - ImageBase

- ImageBase : adresse mémoire à laquelle le programme est censé être chargé. S'il ne peut pas être chargé à cette adresse, Windows recalcule les adresses absolues à l'aide de la table des relocations. Notez que l'ImageBase est une adresse virtuelle attribuée par le compilateur.

- Jump : saut vers une autre partie du programme. Il existe plusieurs types de saut (je, jne, jmp...).

- Keygen : programme qui calcule un serial valide, généralement en fonction d'un nom d'utilisateur.

- Live approach : fait de tracer le soft en mémoire.

- Loader : programme permettant de charger un autre soft en mémoire. On parle notamment de loaders avec les packers/crypters. Dans le cas de ces derniers, du code exécutable est rajouté (généralement dans une nouvelle section du programme packé), puis il est exécuté (pour décrypter le code) et saute ensuite vers le code original (OEP), après l'avoir décrypté.

- Manual Unpacking : comme son nom l'indique, cela consiste à unpacker manuellement un programme préalablement compréssé.

- Mnémonique : l'assembleur est constitué d'instructions nommées par un mnémonique, c'est-à-dire un nom court aisé à retenir. Par exemple, add pour "addition", sub pour "subtraction", ret pour "return"...

- OEP : on différencie l'EP et l'OEP dans le cas de packers/crypteurs, puisque ceux-ci modifient l'entry point du programme. OEP = EP + ImageBase.

- Opcode : les opcodes sont les séquences hexadécimales correspondant à chaque instruction assembleur. Par exemple, l'instruction "inc eax" a pour opcode 040h (ou 0x40, qui est la notation en C).

- Packer : programme permettant à la fois de réduire la taille d'un exécutable et de le protéger contre le cracking en déplaçant son Entry Point dans une nouvelle section, en ajoutant des anti-debug... Les plus connus sont : UPX, Armadillo, AsProtect...

- Patch : programme modifiant un exécutable sur le disque.

- PE : format de fichier utilisé par les exécutables , DLLs, ocx...

- Reverse Engineering : le RE est fondamentalement différent du cracking. Si ce dernier consiste à déplomber les protections d'un soft, le reverse consiste quant à lui à l'art de modifier un prog, par exemple pour lui rajouter des fonctions ou corriger des bugs après compilation.

- Serial Fishing : recherche du bon serial d'un soft.

- Strings Datas Refs : données, notamment phrases ou mots, contenues dans un programme, comme par exemple le titre ou le texte d'une MessageBox.

- Tracing : suivi des codes d'un programme pas à pas.

- Visual Basic : langage de programmation qui utilise ses propres APIs. Pour le vb, il n'y a rien de mieux que SmartCheck, qui est un débuggueur spécial vb créé par NuMega (la société qui a créé SoftICE).

Les différents types de protections :


- Nag :

Par contre, un nag apparait souvent une fois la période d'évaluation d'un software terminée, et il faut dans ce cas là cracker le soft. Virer le nag ne suffit pas, puisqu'il y a généralement d'autres protections et le soft ne marche donc pas à 100% (même si il arrive qu'un soft soit uniquement protégé par un nag, mais c'est rare).

- Serial : protection la plus utilisée. Elle est très simple et pratique pour les auteurs de logiciels, puisque les utilisateurs rentrent dans le programme le serial qu'on leur a donné quand ils l'ont acheté (hum), transformant donc le soft en version complete. Un serial peut avoir plusieurs formes : il est soit unique a toutes les licences, soit est calculé en fonction du nom de l'utilisateur.

- Cd check : technique utilisée pour empêcher la copie de cd, ou alors, dans le cas des jeux, de lancer le programme sans la présence du cd original. Il existe plusieurs types de protection : cd-cops, discguard, laserlock, lockblocks, safedisc, securom, starforce...

- Time-limit : protection utilisée pour les versions d'évaluation. Il existe plusieurs méthodes pour que votre prog sache quand est-ce-que sa période d'évaluation est terminée : soit il enregistre la date de son installation, soit il utilise une variable. Dans ce cas là, il incrémente la variable de 1 chaque jour et quand v=30, c'est fini (il peut aussi avoir une variable qu'il décrémente chaque jour et quand v == 0, a pu :D).

- Base de registre : dans ce cas là, votre soft va créer une clé dans la base de registre, et y spécifier si il est enregistré ou pas. On trouve souvent des cas où le prog crée une clé quand vous entrez le serial (bon bien sûr), et disant alors au programme qu'il est enregistré et l'autoriser à se lancer.

- Keyfile : ici, le programme vérifie la présence d'un certain fichier contenant les informations d'enregistrement de l'utilisateur.

Cette liste est bien sûr très loin d'être exhaustive, il existe de nombreuses autres protections mais ci-dessus sont celles les plus souvent rencontrées.

Les principales instructions :


- nop : opcode 0x90 => ne fais rien

- call : opcode 0xE8 => appelle une sous-routine

- ret : opcode 0xC3 => saute vers l'adresse poussée sur la pile, ce qui permet donc de revenir d'un call (c'est son but principal, bien que cette instruction puisse aussi servir de jmp).

- push registre/valeur : opcode 0x6A .. : permet de placer soit une valeur, soit la valeur contenue dans un registre sur la pile

- sauts :

JE Saut si égalité 0x74
JNE Saut si inégalité 0x75
JMP Saut 0xEB, 0xE9
JA Saut si au-dessus 0x77
JAE Saut si supérieur ou égal 0x73
JB Saut si en-dessous 0x72
JBE Saut si en-dessous ou égal 0x76
JG Saut si plus grand 0x7F
JGE Saut si plus grand ou égal 0x7D
JL Saut si plus petit 0x7C
JLE Saut si plus petit ou égal 0x7E
JS Saut si négatif 0x78
JNS Saut si positif 0x79

APIs :


Je vais ici vous énoncer les APIs les plus utilisées et les plus rencontrées en cracking/reversing, mais sachez qu'il en existe bien d'autres. La liste est donc non-exhaustive.

- Réception et attribution de messages dans un buffer :

- Recherche de clés au niveau de la base de registre :

- Lecture / Ecriture de fichiers :

- Récupération de la date et de l'heure :

- System Information :

En toute fin, je tiens à rappeler que programmeur est un métier, et que pas mal de gens qui mettent leur prog en shareware le font pour vivre. Et puis une autre alternative aux sharewares reste l'open-source, mais bon, c'est tellement bien de cracker :).

Si vous avez un commentaire à faire à l'auteur de cet article, cliquez ici !