28.04.2013 Views

Ingineria inversă

Ingineria inversă

Ingineria inversă

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Exemple: ingineria <strong>inversă</strong> a programelor Java<br />

public void init(){<br />

}<br />

Codul fiecărui atribut începe cu o referinţă la tabela constantelor unde se găseşte numele atributului.<br />

Urmează apoi numărul de octeţi ai atributului. Cel mai important atribut al unei metode este atributul<br />

Code. Acesta conţine pe lângă informaţiile de mai sus câmpurile Max_Stack, ce indică dimensiunea<br />

maximă a stivei de operanzi în timpul execuţiei metodei, Max_Locals, numărul maxim de variabile<br />

locale utilizate în codul metodei, Code_Count, numărul de octeţi ai codului metodei şi codul popriu-<br />

zis al metodei. În cazul metodei init atributul Code este stocat pe 553+6 octeţi, stiva atinge<br />

dimensiunea maximă 5, are 4 variabile locale, iar codul propriu-zis ocupă 369 de octeţi.<br />

Method #1<br />

000007ec Access Flags ACC_PUBLIC<br />

000007ee Name init<br />

000007f0 Type ()V<br />

000007f2 Attributes Count 1<br />

000007f4 Attribute Name Code<br />

000007f6 Bytes Count 553<br />

000007fa Max Stack 5<br />

000007fc Max Locals 4<br />

000007fe Code Count 369<br />

Urmează acum partea cea mai dificilă şi anume decompilarea codului metodei. Pentru a reuşi acest<br />

lucru trebuie să cunoaştem setul de instrucţiuni cu care operează Maşina Virtuală Java (alcătuit din<br />

201 instrucţiuni). Ideea de bază constă în simularea execuţiei codului respectiv. Vom utiliza o stivă<br />

abstractă în care vom încărca în loc de valori, identificatori, operatori,…, deci cod sursă.<br />

0 aload_0<br />

1 new java/util/Random<br />

4 dup<br />

5 invokespecial java/util/Random/ ()V<br />

8 putfield snow/rand Ljava/util/Random;<br />

Instrucţiunea aload_0 încarcă în stivă valoarea variabilei locale 0. Pentru orice metodă de instanţă,<br />

variabila locală 0 va stoca întotdeauna referinţa la obiectul curent, reprezentată în limbajul Java prin<br />

cuvântul rezervat this. Noi vom scrie în stivă this. Instrucţiunea new crează în zona de memorie liberă<br />

a JVM un nou obiect de tipul specificat şi va introduce în stivă referinţa la zona respectivă. Noi vom<br />

scrie în stivă new Random. Instrucţiunea dup dublează vârful stivei, deci din nou în vârful stivei avem<br />

new Random.<br />

- 23 -

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!