Reverse engineering software

Objectifs

Reverse engineering software

L'analyse par rétro-ingénierie logicielle (software reverse-engineering) vise à vérifier la bonne implémentation de fonctionnalités et/ou la robustesse d'applications par rapport aux menaces qui la ciblent, à partir de la version compilée et distribuée de celles-ci et notamment:

  • Le cassage de ses protections
  • Les erreurs d'implémentations
  • La possibilité d'altérer son fonctionnement
  • La fuite d'informations sensibles

Elle se base sur une analyse statique et dynamique du code de celle-ci, à l'échelle du micro-processeur. Les applications compilées pour des ordinateurs tout comme celles prévues pour des mobiles peuvent être analysées.

Demande d'informations

Méthodologies

La méthodologie d'analyse par rétro-ingénierie logicielle est composée de deux phases distinctes :

  • l'analyse statique : durant cette phase, nous désassemblons le code de l'application et identifions des problèmes de sécurité, ainsi que des points d'ombres à éclaircir à l'aide d'une analyse dynamique (seconde phase). Nous pouvons être amenés dans cette phase à développer des outils d'attaques permettant de transformer l'exécutable afin de contourner des protections.

  • l'analyse dynamique : cette phase permet de confirmer ou d'infirmer les éléments identifiés lors de l'analyse statique, mais aussi d'extraire des informations capitales de la mémoire de l'application ciblée lors de son exécution. Cette phase permet aussi d'interagir avec les composants internes, voire de modifier le comportement de l'application à l'aide de modifications apportées à son code.

Nous employons les outils suivants lors de nos tests :

  • des logiciels de désassemblage et de débogage, tels que : IDA Pro, OllyDbg, Immunity Debugger, gdb, apktool, dex2jar
  • des outils permettant l'unpacking et le patching : LordPE, PeID, StudPE, HxD, ImpRec, OllyDump, Godup, OllyScript
  • des outils de développement : python, Code::Blocks, Visual Studio, Masm, Radasm

Livrables

Le livrable présente les différentes phases effectuées lors de nos tests, et les résultats produits. Ainsi, nous détaillons les éléments suivants :

  • l'analyse du ou des binaires : compilateur utilisé, particularités et éléments remarquables
  • la présence de protections logicielles commerciales
  • les différents mécanismes de sécurité identifiés et les vulnérabilités associées
  • les analyses de protocole propriétaire, avec les outils développés à l'occasion
  • les attaques effectuées et leur impact sur l'application analysée
  • les rouages internes de l'application identifiés, et leurs vulnérabilités fonctionnelles s'il y en a

Le livrable propose un descriptif technique complet de l'analyse de l'application, ainsi que des vulnérabilités identifiées. L'ensemble des modifications apportées au binaire ainsi que leurs conséquences sont documentées et accompagnées des codes sources développées dans ce contexte. Enfin, une synthèse présente les conclusions de l'expertise et fait le point sur les risques auxquels l'application fait face, et propose des contre-mesures adaptées.


Cas d'études

Une société développe un jeu utilisant un système novateur de contrôle de l'application visant à interdire la triche et la copie illicite du jeu, et souhaite s'assurer que :

  • son système anti-triche est efficace et ne peut être contourné
  • les mécanismes de vérifications des licences du jeu ne peuvent être cassés et contournés

Lors de l'analyse par rétro-ingénierie, nous effectuons une analyse statique du code basée sur un désassemblage du code de l'application (visant à obtenir une version lisible du code machine). Cette analyse permet d'identifier notamment :

  • de possibles fuites d'informations ou des paramètres par défaut,
  • la présence de protections logicielles et leur degré de complexité
  • les fonctionnalités implémentées au sein de l'application
  • les dépendances de celles-ci et leurs interactions
  • la présence de chiffrement et les algorithmes employés

Une analyse dynamique complémentaire est menée et permet notamment de :

  • contourner des protections logicielles visant à empêcher l'accès au code machine original (mise en œuvre de techniques d'unpacking)
  • comprendre le fonctionnement de l'application et identifier des lacunes dans sa sécurité
  • retrouver des algorithmes propriétaires non-documentés à partir du code machine
  • contourner des protections restreignant la copie du jeu
  • contourner des protections empêchant la triche

Ces différents tests impliquent une modification de l'exécutable voire dans certains cas l'emploi de techniques avancées permettant d'altérer lors de l'exécution le fonctionnement de l'application.