Le reverse engineering est une démarche déductive avant d’être une technique. Elle consiste à remonter le fil d’un système déjà conçu — une boîte noire, assemblée, compilée, livrée — pour en élucider le fonctionnement interne, là où l’ingénierie ordinaire va du besoin vers l’objet. C’est en somme l’ingénierie prise à rebours.
Définition
L’IEEE définissait dès 1990 le reverse engineering logiciel comme « le processus d’analyse d’un système afin d’identifier ses composants et leurs relations, en vue d’en établir une représentation sous une autre forme, ou à un niveau d’abstraction plus élevé ». Le système, ici, est le produit final d’un développement logiciel.
On distinguera d’emblée la rétro-ingénierie logicielle, qui nous occupera, de la rétro-ingénierie matérielle, qui relève d’autres instruments.
Le mouvement de l’analyse
Rétro-concevoir n’est pas lire un programme ligne à ligne dans l’espoir qu’un sens émerge. C’est un va-et-vient entre trois gestes qui s’entretiennent mutuellement : évaluer la complexité de ce que l’on affronte, documenter au fur et à mesure ce que l’on comprend, et déterminer les composants et leurs relations.
flowchart TB A[Évaluer la complexité] --> B[Documenter] A --> C[Déterminer les composants] B --> C C -.retour.-> A
La documentation n’est pas un sous-produit de l’analyse : elle en est le moteur. C’est en écrivant ce que l’on croit avoir compris que l’on met au jour ce que l’on n’a pas encore saisi.
À quoi cela sert
Les motivations sont diverses, et toutes ne relèvent pas de la sécurité offensive :
- déboguer un programme dont on n’a pas le source, ou dont le source ment ;
- retrouver un code source perdu à partir du seul binaire ;
- analyser des vulnérabilités, en isolant les portions dangereuses ;
- étudier un code malveillant, dont on veut comprendre l’obfuscation et les vecteurs d’infection.
Ces usages partagent une même exigence méthodique, que je développe dans la note sur la méthodologie, et supposent une familiarité minimale avec l’architecture des machines et l’assembleur — le plus bas niveau d’abstraction encore intelligible à l’humain.