Travail d étude Les techniques de protection du logiciel

Documents pareils
Les techniques de protection du logiciel

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Structure d un programme

Logiciel de base. Première année ENSIMAG

SSTIC Désobfuscation automatique de binaires. Alexandre Gazet. Yoann Guillot. Et autres idyles bucoliques...

Architecture des ordinateurs

Initiation à la sécurité

Architecture des ordinateurs : Programmation des processeurs avec l'environnement «y86» (INF155)

Programmation assembleur : aperçu

Débogage de code* Mardi 13 décembre Romaric DAVID Université de Strasbourg - Direction Informatique Pôle HPC. hpc.unistra.

Playing with ptrace() for fun and profit

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Architecture des ordinateurs

Résumé Génération de code Le code intermédiaire

Conventions d écriture et outils de mise au point

Traduction binaire dynamique de l extension SIMD Néon de l ARMv7 dans Qemu

Désobfuscation automatique de binaire - The Barbarian Sublimation

DU BINAIRE AU MICROPROCESSEUR - D ANGELIS CIRCUITS CONFIGURABLES NOTION DE PROGRAMMATION

Solution du challenge SSTIC Emilien Girault ANSSI/COSSI/DTO/BAI 06/06/13

Compilation (INF 564)

Département informatique de l université d Angers

IV- Comment fonctionne un ordinateur?

Temps Réel. Jérôme Pouiller Septembre 2011

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Les structures. Chapitre 3

Chapitre 1 I:\ Soyez courageux!

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Programmation C. Apprendre à développer des programmes simples dans le langage C

GlobalScape Secure FTP Server Buffer Overflow

Programmation C++ (débutant)/instructions for, while et do...while

Ordinateurs, Structure et Applications

Les failles Format String

Cours de Systèmes d Exploitation

Bases de programmation. Cours 5. Structurer les données

Assembleur i8086. Philippe Preux IUT Informatique du Littoral. Année universitaire 95 96

Traduction des Langages : Le Compilateur Micro Java

Introduction au langage C


Introduction aux buffer overflow, CS335

ERESI : une plate-forme d'analyse binaire au niveau noyau. The ERESI team

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Rappels d architecture

STAGE IREM 0- Premiers pas en Python

ET 24 : Modèle de comportement d un système Boucles de programmation avec Labview.

GenDbg : un débogueur générique. Didier Eymery Jean-Marie Borello Jean-Marie Fraygefond Odile Eymery Philippe Bion

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Encryptions, compression et partitionnement des données

Le Projet BINSEC. Automatiser l analyse de sécurité au niveau binaire. Airbus group, CEA, IRISA, LORIA, Uni. Joseph Fourier. p.

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Initiation. àl algorithmique et à la programmation. en C

4. Initiation à l'assembleur

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Plan du cours. Historique du langage Nouveautés de Java 7

Déprotection semi-automatique de binaire

Algorithmique et Programmation, IMA

Algorithmique et structures de données I

Quelques éléments de compilation en C et makefiles

Cours Programmation Système

Outils pour la pratique

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

CM2 L architecture MIPS32

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Utiliser Dev-C++ .1Installation de Dev-C++ Table des matières

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Jeu d instructions NIOS II

//////////////////////////////////////////////////////////////////// Administration bases de données

Cours 1 : Qu est-ce que la programmation?

AVERTISSEMENT. D'autre part, toute contrefaçon, plagiat, reproduction encourt une poursuite pénale. LIENS

Conception de circuits numériques et architecture des ordinateurs

Annexe : La Programmation Informatique

Nouvelle version de Zonecheck, la 3.0, avec tests DNSSEC

Eclipse atelier Java

Notions fondamentales du langage C# Version 1.0

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Solutions du chapitre 4

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

UE Programmation Impérative Licence 2ème Année

PG208, Projet n 3 : Serveur HTTP évolué

Systèmes d Exploitation & Machines Virtuelles. Format de l enseignement. Objectif du cours

Cours 1 : La compilation

Licence Sciences et Technologies Examen janvier 2010

La mémoire. Un ordinateur. L'octet. Le bit

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Système de Gestion de Fichiers

Assembleur. Faculté I&C, André Maurer, Claude Petitpierre

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

ACTIVITÉ DE PROGRAMMATION

1) Installation de Dev-C++ Téléchargez le fichier devcpp4990setup.exe dans un répertoire de votre PC, puis double-cliquez dessus :

Algorithme. Table des matières

Les fichiers. Chapitre 4

Gestion mémoire et Représentation intermédiaire

Représentation des Nombres

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Mandataires, caches et filtres

Présentation du logiciel

Yphise optimise en Coût Valeur Risque l informatique d entreprise

Transcription:

Travail d étude Les techniques de protection du logiciel Julien Burle Présenté par: Térence Scalabre Licence Informatique

Comment et pourquoi protéger son logiciel? Tout d abord intéressons-nous aux raisons de protéger son code. Nous traiterons aussi de l aspect juridique de la défense d un logiciel. Puis nous étudierons les techniques pratiques de protections appliquées au langage C sous l environnement UNIX.

Pourquoi protéger son programme?

Pourquoi protéger son programme? Les avantages et inconvénients de la protection: Avantages : Empêcher la réutilisation des techniques développées Contrôler les versions du client Ne pas dévoiler d éventuelles failles Inconvénients : Impossibilité d amélioration par un tiers Difficulté de réutilisation et de lisibilité du code Coût des protections en temps et en argent

Pourquoi protéger son programme? Aspects juridiques : La loi française : Protection contre le piratage et l espionnage industriel. Droit Commun: interdiction de pénétrer dans un système élément de la propriété d autrui. Droit d'auteur: le logiciel est considéré comme une oeuvre de l esprit La décompilation est tolérée sous certaines conditions: droit d utilisation du logiciel décompilation limitée au nécessaire on ne peut pas écrire un nouveau logiciel à partir d un logiciel décompilé Les informations acquises ne doivent servir qu à la réalisation de l interopérabilité.

Pourquoi protéger son programme? Aspects juridiques (suite): La loi européenne : Le conseil européen a proposé le 18 mai 2004, une directive sur la brevetabilité des inventions mises en oeuvre par ordinateur, telles que les algorithmes, types de fichiers ou logiciels. Cette décision pourrait contraindre les acteurs du logiciel libre à des dépôts de brevets défensifs.

Pourquoi protéger son programme? Cependant les techniques de protections sont couramment utilisées. Étudions leurs principes de fonctionnement.

Techniques de protections du code source Nous pouvons distinguer plusieurs types de protections: Celles visant à empêcher l utilisation d un débogueur. Celles n autorisant l exécution du code que sous certaines conditions Celles visant à rendre le code désassemblé incompréhensible.

Techniques antidébogueur

Détecter l appel système ptrace

Détecter l appel systéme ptrace L appel système ptrace sous UNIX permet de tracer un processus (changer sa mémoire, modifier ses registres...). Il sert aussi à déboguer les processus. Comment l utiliser comme protection? Un processus peut être tracé qu'une fois. Grâce à la requête TRACEME, un programme se trace lui-même, ce qui empêche une autre trace ou détecte une trace existante.

Détecter l appel systéme ptrace Exemple d utilisation : int main(void) { if (ptrace(ptrace_traceme, 0, 1, 0) < 0) { printf("debugging... Bye\n"); return 1; } printf( Hello\n ); return 0; } On peut également appliquer cette technique à strace qui a un fonctionnement similaire.

Détecter les points d arrêt

Détecter les points d arrêt (breakpoints) Un point d arrêt (breakpoint) permet dans les débogueurs de faire une pause ou de stopper l'exécution d'un processus. Comment détecter un breakpoint? L instruction assembleur d un breakpoint est int3 (l opcode correspondant est 0xCC). Lorsqu un débogueur met un breakpoint à une certaine adresse il sauve l opcode courant pour mettre à la place 0xCC.

Détecter les points d arrêt (breakpoints) Pour se protéger des breakpoints, on va scanner notre code à la recherche de l opcode 0xCC. Seul désavantage de cette technique, un code peut contenir l opcode 0xCC sans que ce soit forcément un breakpoint.

Poser de faux breakpoints

Poser de faux breakpoints Comme la précédente, cette méthode s appuie sur la détection des breakpoints. Lorsqu un programme rencontre l opcode 0xCC, il reçoit un signal SIGTRAP. Comment modifier le comportement par défaut? o En utilisant la fonction signal nous allons traiter le signal SIGTRAP.

Poser de faux breakpoints Considérons par exemple ce programme : void sighandler(int signal) { printf("le pass est \"salut\"\n"); exit(0); } int main(void) { signal(sigtrap,sighandler); asm ("int3"); printf("pris au piege\n"); return EXIT_FAILURE; }

Protection de l exécution

Protection par code Checksum

Protection par code Checksum Cette méthode vérifie si le code original n a pas été modifié. A chaque exécution du programme, un algorithme vérifie que la somme des opcodes du programme n est pas changée.

Protection par code Checksum Etudions le programme suivant : globl main main: xorl %eax,%eax cmp $1,%al je coool pascoool: /* exit(0); */ exit: xorl %eax,%eax xorl %ebx,%ebx inc %eax int $0x80 coool: xorl %eax,%eax movb $4, %al // 4 = SYS_write xorl %ebx,%ebx inc %ebx // 1 = STDOUT movl $chaine,%ecx // l adresse de Gagne xorl %edx,%edx mov $8,%edx // on ecrit 8 octets int $0x80 // on execute le syscall write jmp exit chaine:.string Gagne!\n Voyons comment protéger la partie coool en implémentant un checksum.

Protection par code Checksum Nous ajoutons le test de vérification :.globl main main: jmp checksum rett: xorl %eax,%eax cmp $1,%a1 je coool pascoool: exit: [...] coool: [...] jmp exited checksum: xorl %ebx,%ebx mov $checksum,%ecx sub $main,%ecx // boucle de main jusqu'àchecksum mov $main,%esi // on part de main boucle: lodsb add %eax,%ebx // la somme dans ebx loop boucle cmpl $4079,%ebx jne baaad jmp rett baaad: // message d'erreur [...] jmp exit [...] // si la somme est fausse

Techniques anti-désassemblage

Faux désassemblage (false dissasembly )

Faux désassemblage (false dissasembly ) Le but est de brouiller le code désassemblé. Comment fausser les résultats? o On rajoute dans notre code, les opcodes d un jump vers une instruction que nous voulons exécuter. o Entre ces deux parties, on place de faux opcodes destinés à faire perdre l alignement du code désassemblé

Faux désassemblage (false dissasembly ) Voici un exemple de code ainsi traité : main: xorl %eax,%eax movb $3,%al xorl %ebx,%ebx movl %esp,%ecx mov $4, %edx int $0x80.ascii "\xeb\x01\xe8" cmpl $0x73736170, (%ecx) je good [ ]

Faux désassemblage (false dissasembly ) La ligne.ascii "\xeb\x01\xe8" ajoute les opcodes d'un jmp +1 (\xeb\x01), puis un opcode de début de call (\xe8) (que l on va sauter). L'alignement est donc perdu au désassemblage. Cette technique est donc très utile pour cacher une portion sensible de code (par exemple lorsque l on détecte l appel système ptrace).

Polymorphisme

Polymorphisme Le but est de décourager le reverser o Pour arriver à un résultat voulu nous allons passer par de nombreuses étapes inutiles. Par exemple : L instruction movl $1,%eax peut être remplacée par xorl %eax,%eax cdq // équivaut à un xor %edx,%edx leal 1(%edx),%eax // place 1 dans eax movl %fs,%ebx // le registre fs contient toujours 0 add %ebx,%eax // équivaut à add $0,%eax

Strip

Strip Cette technique utilise l outil STRIP sous UNIX. o Cet outil enlève toutes les références aux symboles dans un binaire (sans changer le fonctionnement du programme). o Au désassemblage, un binaire traité par STRIP ne contient plus de références aux noms des fonctions (même pas le main). o Il devient plus difficile de mettre un point d arrêt sur une fonction que l on doit alors désigner par son adresse.

Cryptage

Cryptage Une méthode célèbre pour compliquer l ingénierie inverse consiste à crypter la section TEXT (le code) directement dans le binaire. Au démarrage, un bout de code va décrypter toute la section afin que le programme s'exécute normalement.

Obfuscateurs

Obfuscateurs Cette méthode complique le code source d un programme afin de le rendre le moins compréhensible possible. Cette technique n est malgré tout pas très puissante. Il suffit d un peu de temps et de courage pour retrouver le code initial. Elle pourra retarder le reverser déterminé ou décourager les novices.

Conseils divers lors de l implémentation de protection

Conseils divers lors de l implémentation de protection Ne jamais laisser un mot de passe codé en clair. Pas de message d erreur Protection agressive (désactivation du clavier, plantage de la machine) Utilisation de saut conditionnel

Pour conclure Utilisées de façon combiné ces techniques simples permettent des protections plus complexes. L implémentation de ces techniques est cependant très coûteuse en temps et en argent, sans être infaillible. Après cette étude nous pensons qu un programmeur n a pas intérêt de protéger son logiciel (avantages : correction de bugs, possibilité d amélioration et d évolution, gain de temps ).