28.04.2013 Views

Ingineria inversă

Ingineria inversă

Ingineria inversă

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Protecţia programelor împotriva ingineriei inverse<br />

• Se scriu în tabela constantelor toate mesajele criptate şi se incrementează /<br />

decrementează CONSTANT_Utf8.length dacă este necesar,<br />

• Se adaugă la tabela constantelor intrările suplimentare cu numele şi semnătura<br />

metodei de decriptare, numele şi semnăturile metodelor invocate de aceasta,<br />

valorile literale folosite,<br />

• Atributul Code al fiecărei metode care conţine un mesaj criptat trebuie să suporte<br />

următoarele modificări: Bytes_Count şi Code_Count sunt incrementate cu 3*N<br />

(unde N este numărul de mesaje criptate ale metodei), Max_Stack este incrementat<br />

cu 1 şi, pentru fiecare mesaj criptat, o instrucţiune invokestatic (care apelează<br />

metoda dd, iar parametrul ei este un index la tabela constantelor, la o intrare de tip<br />

CONSTANT_Methodref inserată de asemenea) este inserată dupa codul<br />

instrucţiunii ldc, care încarcă în stivă referinţa la mesajul criptat,<br />

• Se adaugă codul de octeţi al metodei dd, după ultima metodă şi înainte de<br />

atributele clasei,<br />

• Se incrementează câmpul Methods_Count cu 1.<br />

Să presupunem în continuare că stringul aleatoriu este:<br />

String key = ".\rT\3752>l:h\u1212";<br />

şi presupunem de asemenea că metoda de criptare este:<br />

String encrypt (String s) {<br />

char[] ac = s.toCharArray();<br />

char[] ac1 =key.toCharArray();<br />

for(int k = 0; k < ac.length; k++)<br />

ac[k] ^= ac1[k % ac1.length];<br />

return new String(ac);<br />

}<br />

De exemplu, dacă aplicăm metoda encrypt stringului “Java is a portable language”,<br />

obţinem următorul mesaj criptat:<br />

dl\"\234\022W\037\032\t\u1232^b&\211S\\\000_H\u127eOc3\210SY\t<br />

Acum, dacă aplicăm aceeaşi metodă stringului criptat, obţinem stringul iniţial. Prin urmare<br />

funcţia encrypt este idempotentă. Acesta este doar un exemplu. Nu este obligatoriu ca<br />

funcţia de criptare să coincidă cu cea de decriptare.<br />

- 47 -

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

Saved successfully!

Ooh no, something went wrong!