Ofuscació de codi

De la Viquipèdia, l'enciclopèdia lliure
No s'ha de confondre amb Ofuscació (llenguatge).

L'ofuscació de codi o fer el codi impenetrable d'un programa d'ordinador és una tècnica d'escriure codi que sigui molt difícil d'entendre per a un ésser humà mentre es manté perfectament compilable per un ordinador. El procés pel qual el codi es fa impenetrable s'anomena ofuscació o també ofuscament. Aquesta tècnica de programació, que va en contra de l'ús habitual del codi informàtic, té les seves raons d'existir.[1]

Objectius[modifica]

En primer lloc, és un mitjà per protegir les inversions en desenvolupament de programari mitjançant tècniques de generació de codi objecte que dificulten l'enginyeria inversa. Consisteix especialment en la substitució d'identificadors i etiquetes mnemotècniques per etiquetes no significatives. També és un hobby per a alguns programadors. Aquesta afició consisteix en escriure codi font la funció del qual és difícil d'esbrinar. L'ús de sintaxis il·legibles, particularitats semàntiques poc conegudes o desagradables del llenguatge utilitzat o algorismes no naturals són diferents tècniques d'ofuscament.[2]

La primera forma d'ofuscació es relaciona amb el codi objecte generat per a la distribució d'un programa, mentre que la segona té a veure amb el codi font.

Algunes ofuscacions històriques[modifica]

Hi ha programes que eliminen tots els comentaris d'un programa font i substitueixen totes les etiquetes (per exemple LOOP, RESUME, ERROR per termes menys significatius (ETI00001, ETI00002, ETI00003, fins i tot mescles d'O, de 0, d'I i 1 dificultant la lectura), fent-lo difícil d'entendre per a un lector humà però sense penalitzar el programa assemblador el més mínim.

Una variant, encara més perversa, és substituir els comentaris per informacions que no aporten absolutament res.

Per exemple :

      LR    15,=X'0F'       ; On charge X'0F' dans le registre 15

TurboPascal 3[modifica]

En el moment de Turbo Pascal 3 (al voltant de 1985) hi havia un programa que eliminava tots els espais en blanc insignificants del codi font, l'empaquetava a 255 caràcters per línia i substituïa totes les variables per combinacions de l (L minúscula) d'1 (dígit 1).), O (O majúscula) i 0 (dígit 0). Per exemple A := B + C es va convertir en l0O1l10O:=O1ll10O0+O0O1l00ll. La necessitat d'aquests ofuscadors prové del fet que el Turbo Pascal 3 no permetia la distribució de subrutines que no fos en format de codi font.[3]

Utilitzant un llenguatge generador d'assemblador[modifica]

A les dècades de 1960 i 1970, la majoria de fabricants utilitzaven llenguatges de tipus PL per al seus desenvolupaments (PL/360, PL/M, PL/C, PL/S, PL/1600, etc.) en els que traduïen un codi font semi-avançat en assemblador. Com que les aplicacions només es podien vendre en aquell moment si el seu codi font estava disponible, va ser aquest codi assemblador generat el que es posava a disposició dels clients. Així, una instrucció com A=B+31; s'estava convertint :[4]

      LR     4,B
      ADD    4,=31
      ST     4,A

Versió que el client estava menys propens a modificar, sobretot perquè la següent versió l'hauria obligat a refer totes les seves modificacions. L'objectiu principal no era tant el fet d'amagar el codi font com el limitar les modificacions dels programes per part dels clients, sent més difícil el manteniment remot per part dels editors dels programes modificats.

Batch[modifica]

Encara que rudimentari, el llenguatge Batch (MSDOS) també pot fer que el codi sigui més complex, dificultant la comprensió dels programes. La declaració "Set" s'utilitza per definir una equivalència. Per exemple : Set A = B. Aleshores és possible utilitzar A en lloc de B trucant a A entre dos símbols "%".

Exemple : %HAS%. Es torna interessant quan es substitueix una instrucció real per una cadena de caràcters complexa.

Exemple : Set #A = Dir

L'ús de %#A% cridarà així el commandament "Dir". Es pot portar el sistema a l'extrem substituint l'ordre Set per una equivalència i utilitzar aquesta equivalència per codificar noves instruccions.

Exemple :

      Set ¯=Set%þ%
      %¯% ð=If Exist%þ%
      %¯% =Echo%þ%

      ...//...

      %% þAkhenatonþ>>%2
      %ð% î%2 %Þ% F%þ%
      Ren %2 î%2%þ%
      %% @%% Off>%2%þ%
      Find "þ"<%ê%>>%2
      %% %ð% î%2 %Þ% E>>%2%þ%

Aquesta tècnica d'ofuscació de codi la fan servir alguns virus informàtics (Akhenaton, Catlord, etc.) codificats en Batch. Aquests virus són rudimentaris i poc freqüents però tenen el mèrit d'haver pogut explotar els defectes d'un llenguatge primitiu com és el llenguatge Batch i amagar així el seu codi viral.

Fortran[modifica]

A més de les tècniques clàssiques vàlides per a tots els idiomes, l'ofuscació d'un codi Fortran utilitzant el format fix utilitzat abans de Fortran 90 es pot obtenir eliminant tots els espais (inclosos entre una paraula clau d'idioma i un nom de variable) i utilitzant noms diferents per a la mateixa variable. en diferents parts del codi mitjançant EQUIVALÈNCIA o COMÚ. Però el format lliure utilitzat des de Fortran 90 ja no permet aquesta supressió de tots els espais. Les declaracions EQUIVALÈNCIA i COMÚ es consideren obsoletes des de l'estàndard Fortran 2018.[4]

Ofuscació algorítmica[modifica]

Dividir una cadena de longitud n en subcadenes iguals demostra que n no és primer (si n ≠ 2). Per tant, l'ús d'una expressió regular per a aquesta prova és possible, encara que poc natural i bastant lent. S'ha escrit una prova de concepte en Perl.[5]

Una forma especial d'ofuscació és un programa multilingüe que fa el mateix quan és executat per diferents intèrprets o compiladors. Hi ha, doncs, un programa que s'executa indiferentment interpretat per Perl i compilat en C, i del qual això constitueix de fet el seu únic interès.[6][7]

Altres[modifica]

L'ofuscació empra sovint racons poc utilitzats d'un idioma i de vegades pot ajudar a trobar errors.

L'IOCCC (International Offuscated C Code Contest) és el concurs anual d'ofuscació en codi C.</br> The Perl Journal ha fet concursos d'ofuscació de Perl.</br> Alguns JAPH són ofuscacions.

Certs llenguatges com el C, el Perl i el APL es presten molt bé al obscurcissement. A The Humble Programmer, Edsger Dijkstra té paraules molt dures pels llenguatges rics qui es presten a de tals tècnics i es fa l'advocat de llenguatges ja modestos. Larry Wall afirma per contra que un llenguatge qui tractés de prohibir males pràctiques com l'ofuscament impediria també d'escriure programes legítims com per exemple els programes d'una línia (oneliners).[8]

Referències[modifica]

  1. «brouillage» (en francès). Grand dictionnaire terminologique, 13-05-2013. [Consulta: 28 juny 2022].
  2. «[EWD340.PDF (utexas.edu) The humble programmer]» (en anglès). cs.utexas.edu, 15-06-2022. [Consulta: 27 juny 2022].
  3. "Borland Turbo Pascal 3.x. Borland Turbo Pascal is a Pascal programming language compiler"
  4. 4,0 4,1 «Obfuscation  » (en francès). (developpez.com). [Consulta: 28 juny 2022].
  5. Expression rationnelle pour tester la primalité d'un nombre.
  6. (anglès) « Perl is C ».
  7. (anglès) « C is Perl ».
  8. «Ecrire un programme d'une ligne en Perl» (en francès). Mongueurs de Perl. [Consulta: 28 juny 2022].

Enllaços externs[modifica]