Code impenetrable
Les informations figurant dans cet article ou cette section doivent etre reliees aux sources mentionnees dans les sections << Bibliographie >>, << Sources >> ou << Liens externes >> ().
Le code impenetrable d'un programme informatique est un code dont la comprehension est tres difficile pour un humain tout en restant parfaitement compilable par un ordinateur.
Le procede par lequel du code est rendu impenetrable est appele brouillage[1],[2], offuscation[1], ou par anglicisme usuel obfuscation. Cette technique de programmation - qui va a l'encontre des usages habituels - a ses raisons.
C'est tout d'abord un moyen de proteger les investissements de developpement d'un logiciel par des techniques de generation de code objet rendant plus difficile la retro-ingenierie. Il consiste notamment au remplacement d'identificateurs et de labels mnemoniques par des labels non signifiants.
Il s'agit egalement d'un hobby pour certains programmeurs. Ce loisir consiste en l'ecriture de code source dont la fonction est difficile a determiner. L'usage d'une syntaxe illisible, de particularites semantiques peu connues ou peu recommandables du langage utilise ou d'algorithmes peu naturels sont differentes techniques d'obscurcissement.
La premiere forme d'obscurcissement concerne le code objet genere a fin de distribution d'un programme alors que la seconde concerne le code source.
Quelques obscurcissements historiques
[modifier | modifier le code]Assembleur
[modifier | modifier le code]Il existe des programmes eliminant tous les commentaires d'un programme-source et remplacant toutes les etiquettes (par exemple BOUCLE, REPRISE, ERREUR par des termes moins parlants (ETI00001, ETI00002, ETI00003, voire des melanges de O, de 0, de I et de 1 les rendant penibles a distinguer pour un lecteur humain sans penaliser le moins du monde le programme assembleur).
Une variante, plus perverse encore, consiste a remplacer les commentaires par des informations qui n'apportent absolument rien.
Par exemple :
Turbo Pascal 3
[modifier | modifier le code]Du temps de Turbo Pascal 3 (circa 1985) existait un programme supprimant tous les blancs non significatifs d'un code source, tassant celui-ci a raison de 255 caracteres par ligne, et remplacant toutes les variables par des combinaisons de l (L minuscule) de 1 (chiffre 1), de O (O majuscule) et de 0 (chiffre 0). Par exemple A := B + C devenait l0O1l10O:=O1ll10O0+O0O1l00ll. La necessite de ces offuscateurs venait du fait que Turbo Pascal 3 ne permettait pas de distribuer des sous-programmes autrement que sous forme de code source[3].
Utilisation d'un langage generant de l'assembleur
[modifier | modifier le code]Dans les annees 1960 et 1970, la plupart des constructeurs utilisaient pour leurs developpements des langages de type PL (PL/360, PL/M, PL/C, PL/S, PL/1600...) qui traduisaient un code source semi-evolue en assembleur. Les applications n'etant vendables a l'epoque que si leur code source etait disponible[4], c'est ce code assembleur genere qui etait mis a disposition des clients. Ainsi, une instruction comme A=B+31; devenait :
LR 4,BADD 4,=31
ST 4,A
Version que le client etait moins enclin a modifier, d'autant que la version suivante l'aurait oblige a recommencer toutes ses modifications. Le but premier etait moins de masquer le code source que de limiter les modifications des programmes par les clients, la maintenance a distance par les editeurs etant plus difficile pour les programmes modifies.
Batch
[modifier | modifier le code]Bien que rudimentaire, le langage Batch (MSDOS) permet lui aussi de complexifier le code, rendant la comprehension des programmes difficile. L'instruction "Set" permet de definir une equivalence. Par exemple : Set A = B. Il est alors possible d'utiliser A a la place de B en appelant A entre deux symboles "%". Exemple : %A%. Cela devient interessant quand on substitue une vraie instruction a une chaine de caracteres complexe.
Exemple : Set #A = Dir
L'utilisation de %#A% appellera ainsi la commande "Dir". On peut pousser le systeme a l'extreme en remplacant la commande Set par une equivalence, et utiliser cette equivalence pour encoder de nouvelles instructions.
Exemple :
Set -=Set%th%%-% d=If Exist%th%
%-% =Echo%th%
...//...
%% thAkhenatonth>>%2
%d% i%2 %Th% F%th%
Ren %2 i%2%th%
%% @%% Off>%2%th%
Find "th"<%e%>>%2
%% %d% i%2 %Th% E>>%2%th%
Cette technique de masquage de code est utilisee par certains virus informatiques (Akhenaton, Catlord, etc.) codes en Batch. Ces virus sont rudimentaires et peu frequents mais ont le merite d'avoir su exploiter les failles d'un langage primitif comme le Batch et masquer ainsi leur code viral.
Fortran
[modifier | modifier le code]En plus des techniques classiques valables pour tous les langages, l'obscurcissement d'un code Fortran utilisant le format fixe utilise avant Fortran 90 peut etre obtenu en supprimant toutes les espaces (y compris entre un mot cle du langage et un nom de variable) et en utilisant des noms differents pour une meme variable dans differentes parties du code par le biais des EQUIVALENCE ou des COMMON. Mais le format libre utilise depuis Fortran 90 ne permet plus cette suppression de toutes les espaces. Les instructions EQUIVALENCE et COMMON sont considerees comme obsoletes depuis la norme Fortran 2018.
Obscurcissement algorithmique
[modifier | modifier le code]La division en sous-chaines egales d'une chaine de longueur n prouve que n est non premier (si n 2). L'usage d'une expression rationnelle pour un tel test est donc possible, bien que peu naturel et plutot lent. Une preuve de concept a ete ecrite en Perl[5].
Une forme particuliere d'obscurcissement est un programme multilingue qui fait la meme chose quand il est execute par differents interpreteurs ou compilateurs. Il existe ainsi un programme qui s'execute indifferemment interprete par Perl et compile en C, et dont cela constitue d'ailleurs le seul interet[6],[7].
Autres
[modifier | modifier le code]L'obscurcissement utilise souvent des recoins peu utilises d'un langage et peut quelquefois contribuer a la detection de bugs.
L'IOCCC (International Obfuscated C Code Contest) est le concours annuel d'obscurcissement en C.
The Perl Journal a organise des concours d'obscurcissement en Perl.
Certains JAPH sont des obscurcissements.
Certains langages comme le C, le Perl et l'APL se pretent tres bien a l'obscurcissement. Dans The Humble Programmer, Edsger Dijkstra a des mots tres durs pour les langages riches qui se pretent a de telles techniques et se fait l'avocat de langages plus modestes. Larry Wall affirme en revanche qu'un langage qui essaierait d'interdire de mauvaises pratiques telles que l'obscurcissement empecherait aussi d'ecrire des programmes legitimes tels que les unilignes.
References
[modifier | modifier le code]- | a et b << brouillage >>, Grand Dictionnaire terminologique, Office quebecois de la langue francaise (consulte le ).
- | Commission d'enrichissement de la langue francaise, << brouillage >>, sur FranceTerme, ministere de la Culture (consulte le ).
- | "Borland Turbo Pascal 3.x. Borland Turbo Pascal is a Pascal programming language compiler"
- | http://www.redbooks.ibm.com/redbooks/pdfs/sg247000.pdf page 45 : << Few people know that open source was the business model that software began with! In the 1960s, nobody would buy a computer (a huge investment at that time) that was not immediately ready for some use. Software had to be given away by manufacturers as "a way to sell the hardware faster," and free of charge for that reason. The source code was distributed so that anybody could change it. At the time, nobody would or could use a computer without having programming skills.
In the 1970s, legislation in many countries decided that giving away software for free was unfair competition toward new companies that were developing competitive software and selling it for a living. Therefore, software had to be billed by law. It was still lawful to give the source for free as an option to anybody who bought a software product, and IBM did just this.
In the late 1970s, centralized support to end-users began to get difficult because they did not know whether they used "vanilla" software (object code from IBM) or software modified by their IT group. Since only very few people ordered the source, but were causing most of the work, IBM had to adopt an object-code-only (OCO) distribution mode. This may have been one of the reasons universities began to switch from VM/CMS to UNIX, because UNIX code was available to play with. >> - | Expression rationnelle pour tester la primalite d'un nombre.
- | (en) << Perl is C >>.
- | (en) << C is Perl >>.
Annexes
[modifier | modifier le code]Voir aussi
[modifier | modifier le code]- Offuscation
- Offuscateur
- International Obfuscated C Code Contest
- Logiciel libre / Logiciel proprietaire
- Retro-ingenierie
- Langage de programmation exotique dont Malbolge concu pour etre impenetrable
- Programmation spaghetti
Liens externes
[modifier | modifier le code]- (fr) L'assombrissement par les << mongueurs >> de Perl
- (fr) Unilignes Perl
- (fr) Techniques d'offuscation : proteger le code source contre l'ingenierie inversee
- (fr) Offuscateur de PreEmptive
- (en) International Obfuscated Ruby Code Contest
- (en) Unilignes Perl
- (en) The Humble Programmer