La rétro-ingénierie en informatique est un sous-domaine de la rétro-ingénierie appliquée aux systèmes, logiciels ou appareils informatiques. Elle a pour but d'analyser un système pour en créer une représentation à un plus haut niveau d'abstraction. Les objectifs de la rétro-ingénierie sont multiples, certains pouvant être autorisés voire nécessaires, et d'autres plus malveillants sont combattus de différentes méthodes.

Description La rétro-ingénierie informatique regroupe l'ensemble des techniques et des outils liés à la compréhension d'un système logiciel et/ou matériel existant, sans le bénéfice des spécifications originales. Réalisée généralement en deux phases, elle consiste en l'identification des composants du système et de leurs relations, puis leurs représentations à un niveau d'abstraction plus élevé et plus compréhensible par les humains (spécifications, documentations, plans, schémas). Cela n'implique ni la modification, ni la création d'un nouveau système fondé sur cette rétro-ingénierie. C'est un processus d'analyse, et non d'altération ou de réplication. Le résultat de cette analyse peut être particulièrement bénéfique, ou complètement inexploitable, selon la personne effectuant la rétro-ingénierie, et sa connaissance de l'objet étudié. Ces résultats seront d'autant plus bénéfiques grâce à l'utilisation d'outils dédiés et le futur de la rétro-ingénierie sera fondé sur des preuves d'efficacité de ces méthodes et outils dans un contexte donné.

La rétro-ingénierie est un défi technique pour plusieurs raisons (liste non exhaustive) : l'intention du programmeur n'est pas claire ; le problème initial peut ne pas être résolu correctement ; le code a été altéré pour répondre à des besoins de maintenance ; le logiciel est un portage d'un environnement différent ; la plateforme matérielle a changé ou évolué ; la sémantique du langage a changé. C'est principalement pour cela que les mainteneurs de logiciel doivent souvent faire des suppositions, telles : « que fait ce module ? », « pourquoi cette opération est-elle réalisée de cette façon » ?». Un des autres défis clé de l'analyse de programme est de prendre en compte la haute dynamicité. Les langages de programmation les plus répandus aujourd'hui permettent l'utilisation de ce concept, qui constitue un mécanisme de développement puissant, mais qui rend son analyse plus difficile. Par exemple, les langages comme Java introduisent les concepts de réflexion et la possibilité de charger des classes pendant l’exécution du programme. La rétro-ingénierie est passée d'une analyse à une dimension (statique), à une analyse à deux dimensions (statique et dynamique). Elle tend à en ajouter une troisième, qui consiste en l'étude de l'historique des données extraites des dépôts de logiciels.

But La rétro-ingénierie a deux objectifs principaux : la redocumentation et la récupération du modèle de conception. La redocumentation a pour but de produire une vue alternative d'un modèle, au même niveau d'abstraction. La récupération du modèle de conception vise à recréer les modèles d'abstraction à partir du code source, de la documentation existante, de la connaissance des experts ainsi que toutes autres sources d'informations. Le but de la rétro-ingénierie d'un logiciel est d'améliorer sa compréhension globale, autant pour sa maintenance que pour son développement futur. Son analyse sera menée selon les axes suivants: faire face à la complexité : création de méthodes et outils, combinés aux environnements CASECASE pour Computer-Aided Software Engineering, afin de fournir un moyen d'extraire des informations pertinentes ; générer des vues alternatives : les représentations graphiques sont considérées comme des aides à la compréhension ; récupérer l'information perdue : l'évolution d'un système de taille conséquente entraîne la perte d'information, les modifications ne sont généralement pas documentées ; détecter les effets de bord : la conception initiale ou les modifications successives peuvent entraîner des effets de bords involontaires ; créer des abstractions : la discipline nécessite des méthodes et outils afin de créer des abstractions à un niveau plus haut ; faciliter la ré-utilisation : la rétro-ingénierie peut aider à trouver des logiciels potentiellement ré-utilisables. Au-delà de la maintenance logicielle, la rétro-ingénierie peut être utilisée dans d'autres domaines, notamment à des fins de tests ou d'audit de sécurité et de vulnérabilités. Cadre légal

Une quantité significative de litiges légaux impliquant les logiciels informatiques se concentrent autour de la rétro-ingénierie.

La législation est restée longtemps imprécise, avec des concepts mal compris. Là où auparavant le secret commercial se heurtait au manque de textes de loi (en témoigne le nombre d'articles sur le sujet au début des années 2000), la législation autour de la rétro-ingénierie trouve aujourd'hui ses réponses notamment autour de la jurisprudence. (cas Sega v. Accolade et par exemple)

La légalité de la rétro-ingénierie dépend beaucoup de l'intention et du pays :

En Europe, la (Article 5 et 6, ainsi que la révision de 2009) tolère la rétro-ingénierie pour des buts d'interopérabilité, mais interdit toute reproduction commerciale ou la publication d'informations obtenues via rétro-ingénierie.

Aux États-Unis, la publication des brevets permet d'étudier un système sans rétro-ingénierie (mais empêche toujours l'exploitation commerciale). La rétro-ingénierie des logiciels, spécifiquement, est en général prohibée directement dans le CLUFCLUF pour Contrat de Licence Utilisateur Final, qui peut prévaloir sur certaines lois (voir ). Mais comme en Europe, le DMCADMCA pour Digital Millennium Copyright Act autorise la rétro-ingénierie pour l'interopérabilité.

Au Japon, la n'interdit pas explicitement la rétro-ingénierie. Elle précise cependant ne pas s'étendre aux langages de programmation, loi ou algorithmes.

Enfin en Australie, autre grand acteur des technologies de l'information, la (notamment par son amendement de 2006), proscrit toute forme de contournement des protections faites pour empêcher la copie ou la reproduction, sauf dans des cas spécifiques tels que : étude/recherche, critique/journalisme, parodie, procédure judiciaire.

Enseignement

Une étude a été menée à l'université de Missouri-Rolla. Des cours sur les techniques de rétro-ingénierie et l'étude de produits réels ont été ajoutés au cursus. 77 % des étudiants pensent que ces cours ont renforcé les concepts présentés durant les cours magistraux. Et 82 % veulent que les cours futurs suivent également cette approche. Cela rend les cours plus pratiques, intéressants, et fun.

Le premier avantage de l'enseignement de la rétro-ingénierie est une meilleure compréhension des concepts logiciels et du fonctionnement matériel. Effectivement, tous ces concepts sont cachés derrière notre OSOS pour Operating System (Système d'exploitation) et notre IDEIDE pour Integrated Development Environment (Environnement de développement intégré) préféré mais sont indispensables à tout informaticien. Il est extrêmement bénéfique de se plonger dans un code source inconnu, dans du matériel ou des protocoles qui nous sont étrangers. De plus, lire et analyser du code écrit par des programmeurs plus expérimentés est très formateur.

Ensuite, l'évolution des technologies nous conduit à maintenir et migrer de plus en plus de systèmes hérités. Il faut donc comprendre et pouvoir modifier ces systèmes dont la compréhension n'est pas triviale. La rétro-ingénierie met à disposition un certain nombre d'outils qui permettent de résoudre ces problématiques. C'est pourquoi leur enseignement permet de former des ingénieurs capables de s'adapter à ces problématiques.

Enfin, la rétro-ingénierie est l'art de disséquer, de s'auto-motiver, et de construire ses capacités de réflexion logique.

Applications Commencée avec le besoin de maintenance et modernisation des vieux logiciels, la rétro-ingénierie s'est montrée un outil parfait pour pallier ce problème. Cependant, au-delà de cette nécessité économique, la rétro-ingénierie s'avère aussi indispensable pour plusieurs cas notables. On peut par exemple retrouver des applications sur des systèmes récents tels que iOS, ou sur du matériel comme des circuits ou des semi-conducteurs.

Optimisation D'autres cas d'applications incluent la documentation d'un programme ou de ses bases de données relationnelles, l'identification d'éléments réutilisables, la restauration d'architecture, celle de patrons de conception, le calcul de l'impact d'un changement, le renouvellement des interfaces graphiques, l'identification des clones, la traduction d'un programme, la réalisation d'une migration...

Modernisation Il s'est révélé de plus en plus nécessaire, au fur et à mesure que les développeurs d'origine des systèmes déménageaient ou disparaissaient, de pouvoir comprendre et modifier l'existant. Il faut en effet comprendre les intentions du logiciel pour le moderniser et le porter sur des systèmes modernes, notamment avec l'avènement des applications web où d'anciennes applications sont converties vers ce nouveau support. Afin d'effectuer ces transitions, les abstractions des systèmes existants vers des langages de modélisation modernes tels que l'UMLUML pour Unified Modeling Language ou Langage de modélisation unifié sont nécessaires Une fois le modèle extrait, il devient possible de l'implémenter sous une autre forme, selon le format de E. J. Byrne.

Sécurité La rétro-ingénierie occupe une place importante en sécurité informatique. Elle peut être utilisée autant pour l'attaque que pour la défense. Pour un attaquant, elle permettra de connaître les vulnérabilités d'un système. Pour un expert en sécurité, elle sera utilisée pour comprendre comment fonctionnent les programmes malicieux, tels que les virus, les rootkits ou d'autres types de menace.

Dans la lutte contre la cybercriminalité le temps est très souvent un élément important, c'est pourquoi les méthodes de rétro-ingénierie en sécurité sont toujours en évolution pour pouvoir être maîtrisées et appliquées efficacement contre les menaces.

Étude / Recherche Appliquer une rétro-ingénierie sur un élément ou un système complet reste un excellent moyen d'apprentissage. Mais ces études permettent aussi de réaliser l'interopérabilité de plusieurs autres éléments avec un système tiers. C'est aussi un vaste sujet de recherche dans l'objectif d'améliorer les outils de sécurité, comme cité précédemment.

Réalisation De nombreux outils et méthodes ont été créés afin d'aider les mainteneurs de logiciels à comprendre la structure et les comportements d'un système. Dans la plupart des cas, il n'est pas surprenant que ces outils soient développés, ou que leur développement soit largement influencé, par une application spécifique. Cela implique une disponibilité d'outils de rétro-ingénierie nombreux et variés, à la fois en termes de fonctionnalités, et de méthodes de visualisation fournies. Cependant, il est difficile de juger de l'efficacité de ces outils de manière objective, surtout lorsqu'il s'agit de prototype de recherche, développé comme des preuves de concept, en appuis de nouvelles méthodes. Comme la plupart des domaines d'application ont des caractéristiques uniques et spécialisées, il est essentiel que ces boîtes à outils doivent être à la fois extensibles et polyvalentes.

Méthodes usuelles