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 />
exemplu, pentru tipul int putem folosi ca identificator i, i1, i2, …, pentru tipul String putem folosi s,<br />
s1, s2, …, etc. Deoarece variabila locală 1 este folosită pentru prima dată, aici trebuie să avem o<br />
declaraţie. Prin urmare instrucţiunile ..store pot genera cod sursă. Prefixul a al instrucţiunii ne spune<br />
că este încărcată o valoare de tip referinţă. Deci, ţinând seama că metoda getParameter(), din clasa<br />
Applet, returnează un String, putem scrie instrucţiunea:<br />
String s = getParameter(“snows”);<br />
59 aload_1<br />
60 ifnonnull 72<br />
63 aload_0<br />
64 bipush 100<br />
66 putfield snow/snows I<br />
69 goto 83<br />
Instrucţiunea aload_1 încarcă în stivă variabila locală 1, deci, din punctul de vedere al<br />
decompilatorului, identificatorul s. Instrucţiunea ifnonnull extrage din stivă referinţa la un obiect, în<br />
cazul nostru s, şi o compară cu referinţa null. În cazul în care nu coincid, execuţia codului continuă de<br />
la offset-ul 72. Prin urmare, instrucţiunile ifnull şi ifnonnull generează cod sursă. Pentru ca<br />
decompilarea să continue de la offset-ul 63 şi nu de la 72, vom scrie testul invers. Deci avem<br />
structura:<br />
if(s==null){<br />
}<br />
Evoluţia stivei în timpul execuţiei instrucţiunilor de mai sus este:<br />
s<br />
this<br />
s<br />
100<br />
this<br />
s<br />
Instrucţiunea bipush 100 încarcă în stivă valoarea întreagă de tipul byte 100 care apoi va fi încărcată<br />
în atributul snows (şi deci obţinem cod sursă). Instrucţiunea goto 83 determină ca execuţia codului să<br />
contnue de la offset-ul 83. În concluzie, avem o structură de tipul if-else. Prin urmare avem codul:<br />
if(s==null){<br />
snows = 100;<br />
}else{<br />
}<br />
Pe varianta “else” se execută codul:<br />
- 27 -