Descompilarea

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Decompilarea este activitatea de inginerie inversă prin care codul sursă este reconstruit pornind de la un fișier executabil în limbajul mașinii .

Principii de baza

Pur și simplu, compilarea constă în traducerea codului sursă de nivel înalt în cod obiect de nivel scăzut. Prin intermediul acestui proces, pe lângă traducerea literală a instrucțiunilor din instrucțiunile echivalente pentru procesoare , funcțiile conținute în biblioteci sunt înlocuite și comentariile inserate de dezvoltator sunt eliminate. Mai mult, fișierul executabil poate fi compus din mai multe module, agregate în faza de legătură .

Operația inversă, de exemplu, neputând cunoaște a priori bibliotecile utilizate, produce o reprezentare fiabilă, dar inevitabil mai puțin lizibilă decât originalul. Comentariile originale, de altfel, sunt iremediabil pierdute.

Acest proces nu afectează doar fișierele executabile ale programului (de ex. Fișierele .EXE), ci orice fișiere produse de un proces de compilare, cum ar fi animațiile Adobe Flash .

Aplicații

Decompilarea poate fi utilă în următoarele cazuri:

  • Recuperarea codurilor sursă pierdute, având necesitatea modificării executabilului;
  • Traducerea codului scris în limbi învechite nu mai este acceptată de instrumentele de compilare actuale;
  • Determinarea existenței virușilor sau a software-ului rău intenționat în programe;
  • Analiza codului pentru a urmări algoritmii utilizați.
  • Eliminarea protecțiilor shareware ( cracking )

Istorie

Nașterea decompilatoarelor este contemporană cu cea a compilatoarelor, dar primul decompilator real a fost scris de Joel Donnelly în 1960 la Naval Electronic Labs pentru a decompila codul mașinii programelor NELIAC pe un computer Remington Rand Univac M-460 Countess , un proiect vizualizat de prof. Maurice Halstead care a lucrat la decompilare între anii 1960 și 1970 și a publicat tehnici care stau la baza compilatorilor de astăzi.

În anii 1960, decompilarea a fost utilizată în procesul de conversie a programelor de la a doua la a treia generație; în acest fel, programele pentru mașinile de a treia generație au fost rescrise automat.

Între anii 1970 și 1980, decompilarea a fost utilizată pentru portabilitatea software-ului, documentarea, depanarea , refacerea codurilor sursă pierdute și modificarea fișierelor executabile existente.

Începând cu anii 1990, această tehnică a devenit un instrument de inginerie inversă capabil să asiste utilizatorii în verificarea programelor pentru a verifica prezența codului rău intenționat, a verifica dacă compilatorul generează cod corect, a traduce programele binare de la o mașină la alta este de a înțelege implementarea a unei funcții de bibliotecă specifice.

Tehnici de descompilare

Decompilarea pentru mașini reale

Descompilatoarele pentru mașini reale pot fi:

Una dintre cele mai mari probleme în descompilarea codului sursă este că nu toate compilatoarele generează cod în același mod, deoarece fiecare își face propriile optimizări. Aceasta înseamnă că ar trebui implementate proceduri specifice de compilare pentru fiecare compilator, pentru a avea șanse mai mari de a înțelege codul.

Din acest motiv, combinate cu informațiile care se pierd inevitabil, tehnicile de decompilare din codul mașinii au fost abandonate progresiv sau, în orice caz, utilizate doar pentru experimentele academice.

Cercetătorii din acest domeniu au lăsat astfel în urmă metodele clasice de descompilare pentru a lua diferite căi (metode statistice), ale căror rezultate nu au fost însă dezvăluite. [ fără sursă ]

Decompilare pentru mașini virtuale

Există diferențe majore între codul mașinii pentru aplicațiile mașinii reale (cum ar fi Assembler ) și codul mașinii pentru aplicațiile mașinii virtuale (cum ar fi Bytecode ). În special, aceste diferențe se referă la informațiile referitoare la codul sursă care este stocat în codul mașinii.

Dintre toate mașinile virtuale cea mai faimoasă este mașina virtuală Java al cărei „cod mașină” se numește bytecode .

Bytecode conține mult mai multe informații decât codul mașinii.

Implicatii legale

Această operațiune este clasificată prin lege ca o formă de „copiere”.

În mod normal, multe programe software sunt protejate prin drepturi de autor de către autori. Aceasta înseamnă că copierea aceleiași idei într-un alt program este interzisă prin lege.

Decompilarea este legală numai în unele cazuri specifice descrise în legea italiană privind dreptul de autor 633/1941 în articolul 64quater. În rezumat, este posibilă decompilarea unui executabil numai dacă acest lucru este necesar pentru a avea informații utile pentru realizarea interoperabilității cu un program creat independent, cu condiția ca decompilarea să fie efectuată de cei care au licența de a utiliza executabilul care urmează să fie decompilat și că informațiile căutate nu sunt deja ușor disponibile. În plus, descompilarea trebuie limitată la părțile indispensabile interoperabilității. Informațiile obținute nu pot fi utilizate în alte scopuri decât interoperabilitatea sau dezvăluite terților în alte scopuri.

Întrebarea cu privire la utilizarea dreptului de decompilare este substanțială atunci când codul sursă originală este păstrat secret: de exemplu, poate fi necesar să decompilați un sistem de operare pentru a înțelege cum funcționează, pentru a scrie un program care funcționează pe acea precizie. platformă.; sau descompilați un program comercial rival pentru a înțelege cum funcționează pentru a crea software care generează formate de fișiere de ieșire compatibile.

Ne confruntăm cu un adevărat conflict de interese . Pe de o parte, interoperabilitatea programelor între ele este considerată importantă în interesul public. Pe de altă parte, secretul codului sursă este o practică de piață foarte obișnuită: este o formă de protejare a programelor proprii de modificări nelegitime și de colectare a informațiilor importante de la concurenții de pe piață. Prin urmare, directiva a fost concepută pentru a împiedica utilizarea dreptului de descompilare, astfel încât protecția conferită prin secret să nu fie pusă în pericol.

Condițiile și limitările prevăzute pentru dreptul de decompilare sunt obligatorii. Redactarea este adesea neclară, motiv pentru care există incertitudine cu privire la interpretarea pe care o vor oferi instanțele în acest caz „la limită”. Dreptul la decompilare trebuie, în orice caz, utilizat cu precauție extremă. Este nevoie de consiliere juridică adecvată pentru a evita greșelile.

Cele mai importante condiții care trebuie respectate se traduc în faptul că informațiile obținute prin utilizarea dreptului de decompilare pot fi utilizate numai cu scopul de a asigura interoperabilitatea între programe și nu pot fi transferate către terți, cu excepția cazului în care este necesar pentru cele menționate anterior. scopul. În practică, singura modalitate de a fi sigur de acest lucru este prin utilizarea unei „camere curate”. Procedura este următoarea:

  1. Compania identifică o cameră dată ca o „cameră curată”. Calculatoarele sunt instalate în cameră, fără conexiune la Internet.
  2. Unii membri ai personalului sunt desemnați să efectueze lucrările efectuate în camera curată. Numai aceștia și alți personal autorizați în mod special au dreptul să intre în cameră. Camera este utilizată doar pentru a descompune și analiza software-ul. Nicio informație referitoare la decompilare nu poate fi transmisă în afara camerei (fie pe hârtie, fie sub formă digitală).
  3. Odată ce informațiile necesare pentru interoperabilitate au fost extrase, personalul de decompilare întocmește un raport, în care sunt raportate doar informațiile utile pentru interoperabilitate. Acest lucru poate fi scos în siguranță din cameră.
  4. După munca satisfăcătoare făcută de compania care efectuează descompunerea, toate documentele sunt distruse și memoria formatelor și discurilor sunt formatate. Doar la sfârșitul acestor operații camera curată poate fi folosită din nou fără limitările menționate anterior.

Acest proces nu poate fi realizat în lumina soarelui. În practică, doar o companie cu resurse substanțiale va putea profita de dreptul de decompilare.

Protecție împotriva descompilării

Protejarea codului dvs. împotriva descompilării este un obiectiv dificil. Cu toate acestea, este posibil să adoptați expedienți adecvați, să limitați operațiunea de decompilare de către utilizatori mai puțin experimentați sau cel puțin poate complica viața noilor biscuiți .

Să luăm în considerare Java , care spre deosebire de alte limbaje de programare are ca scop principal să lucreze pe orice tip de hardware echipat cu o implementare a mașinii virtuale. În practică, atunci când compilăm o listă Java, clasa .q pe care o obținem nu este codificată în limbajul mașinii unui procesor specific, ci este „tradusă” într-un fel de „macro-limbaj”. Prin urmare, executarea fișierului .class în cauză nu va fi procesorul, ci un software care interpretează codurile secundare și execută instrucțiunile codate. Ca și în cazul oricărui alt limbaj de programare, codul generat după compilare poate fi întotdeauna demontat. Cu toate acestea, fișierele .class create de compilatorul Java și destinate unei mașini virtuale, păstrează un număr mult mai mare de informații despre codul sursă decât un traditional.exe. Acest lucru face mai ușoară construirea de software care permite un proces de inginerie inversă foarte aprofundat, care depășește cu mult procesul de demontare. De fapt, există mai multe programe pe net, atât freeware , cât și comerciale, care permit decompilarea efectivă a fișierelor de clasă. Aceste programe sunt capabile să recreeze un cod sursă care diferă cu adevărat puțin de cel original.

În general se folosește ofuscarea codului. Această tehnică constă în complicarea codului în faza de programare, ceea ce face mai dificilă înțelegerea algoritmilor. Un exemplu de ofuscare ar putea fi, de exemplu, transformarea unei operații simple, cum ar fi

 c = a * b;

în

 c = 0
în timp ce (b -> 0)
   c = c + a;

Această tehnică poate descuraja cel puțin crackers-ul novice atunci când se trezesc încercând să înțeleagă lista. Un alt exemplu tipic este schimbarea numelor variabilelor și metodelor în nume fără sens.

O altă tehnică încă folosită pentru a proteja împotriva decompilării este de a modifica bytecode-ul fișierelor de clasă în așa fel încât să nu le compromită funcționalitatea, ci să genereze erori în programele de decompilare. Aceasta este pentru a profita de bug-urile decompilatorului.

Presupunând că aceștia din urmă îndeplinesc o sarcină foarte complexă, presupunem că au întotdeauna erori și încercăm să le identificăm și să le exploatăm. Dacă acest decompilator este un executabil, realizat de exemplu în C sau într-un alt limbaj compilat, una dintre principalele puncte slabe ale acestor limbaje poate fi exploatată: debordările . O primă idee care îmi vine în minte, analizând limbajul Java, este că aceasta din urmă nu limitează lungimea numelor variabilelor. Inserăm o variabilă wildcard, în interiorul clasei pentru a fi protejată cu un nume foarte lung.

De asemenea, inserăm, în cadrul clasei de protejat, o metodă inutilă care declară 514 variabile locale. Acest al doilea expedient determină o creștere a codului ușor mai mare decât Kbyte.

Există și alte tehnici pentru ofensarea codurilor, cum ar fi criptarea clasei. Cu toate acestea, nu este necesar să recurgeți la modificarea manuală a bytecode-ului, deoarece există programe create exclusiv în acest scop.

Elemente conexe

Controlul autorității LCCN ( EN ) sh2006006021
Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT