\section{Qu'est ce que l'ingénierie inverse?}

L'ingénierie inverse  est une technique permettant  de déterminer l'utilité
et le fonctionnement d'un programme. Le programme est alors assimilée à une
boîte noire dont on essaye de  trouver qu'elle est la fonction qui permet à
partir d'une certaine entrée, d'obtenir la sortie constatée.

Pour ce faire  on utilise des 'techniques de  reverse-engeneering' qui nous
permettent de passer d'un code  compréhensible par la machine, mais pas par
l'homme, à un code lisible par  l'homme mais plus par la machine. Il s'agit
de désassembler ou de décompiler par exemple.

L'ingénierie inverse peut être utilisée pour un grand nombre de raisons:
\begin{itemize}
  \item  Analyser  et  comprendre  un  code  inconnu  (pour  déterminer  un
    algorithme par exemple),
  \item  Récupérer  du  code  source   perdu  (on  ne  possède  plus  qu'un
    exécutable),
  \item  Déterminer  l'existence de  virus  ou  de  code parasite  dans  un
    programme,
  \item Déterminer des failles de sécurité, ou des erreurs (bogues),
  \item Déterminer les protections logicielles,
  \item   Comprendre  le   fonctionnement   d'un  logiciel   insuffisamment
    documenté, pour, par exemple, faire un logiciel qui intéropère avec
    le logiciel tracé.
\end{itemize}
Ceux-ci ne  sont que des exemples  d'applications, on peut  en trouver bien
d'autres.   Leur nombre  fait  de l'ingénierie  inverse  une pratique  très
courante.


