Ingineria inversă
Ingineria inversă
Ingineria inversă
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 -