Gehaxelts Blog

IT-Security & Hacking

Javascript obfuscaten

Ein kurzer Blogpost darüber, wie man Javascript "obfuscaten" kann. Man kann clientseitig ausgeführte Sprachen eigentlich kaum unveränderbar machen, da diese eben beim Client ablaufen, und dieser diese bearbeiten kann.

Trotzdem gibt es einige Möglichkeiten den Eingriff zu erschweren.

Heutzutage basieren viele Webanwendungen auf Javascript bzw. Ajax, welche clientseitig ablaufen und wo Manipulationspotential seitens des Benutzers besteht.

Da man als Programmierer die Manipulation bestmöglich verhindern möchte, aber dies eben nicht möglich ist, kann man einige Tricks nutzen, um Javascript zu "obfuscaten", also unleserlich zu machen. Serverseitige Checks der Eingaben sind natürlich ein muss.

Code Beispiel

Nehmen wir mal folgendes Code-Beispiel, welches wir der Reihe nach obfuscaten bzw. unleserlich machen wollen:

1
2
3
4
5
6
7
8
9
10
function doSomeThing() {
  alert("Hallo " + someName());
}

function someName() {
  var str = "Mega";
  return str + "Hacker";
}

doSomeThing();

Das Script macht eigentlich nicht viel, denn es gibt eine Alert-Box mit dem String "Hall MegaHacker" aus. Also nichts komplexes ;)

JS Minifier/Compressor

Zunächst können wir den Code durch einen "Minifier" jagen, sodass unnötige Zeichen entfernt werden und der Code kompakter wird. Dies wird normalerweise dazu genutzt, um die Ladezeiten von Webseiten zu optimieren.

Bei größeren bzw. umfangreicheren Scripten werden Variablen gekürzt und zusammengefasst, etc.

In unserem Beispiel liefert YUI-Compressor folgenden Output:

1
function doSomeThing(){alert("Hallo "+someName())}function someName(){var a="Mega";return a+"Hacker"}doSomeThing();

Da alles hintereinander in eine Zeile gepackt wird, ist die Leserlichkeit schon etwas geringer, da zu dem die Variablennamen gekürzt werden.

Unter Javascriptcompressor.com kann man noch einen Schritt weiter gehen, und die Variablennamen verkürzen, sowie base62 encoden, sodass folgender Output entsteht:

1
eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||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}('0 1(){4("5 "+2())}0 2(){6 3="7";8 3+"9"}1();',10,10,'function|doSomeThing|someName|a|alert|Hallo|var|Mega|return|Hacker'.split('|'),0,{}))

Wer jetzt auf den ersten Blick noch erkennt, was diese Funktion macht: Hut ab :)

Wir können aber noch einen Schritt weiter gehen, und den neu generierten Code durch JS-Fuck schicken.

JS-Fuck übersetzt die lesbaren Zeichen in Kombinationen aus [,],(,),!,+ ,sodass man das Script kaum mehr entziffern kann. Jedoch steigt damit auch die Länge bzw. Größe des Scriptes sehr stark an. Darunter kann die Performance leiden.

Für das Beispiel, welches mit YUI minimiert wurde, liefert JS Fuck folgendes:

Hier gehts zur Lösung:

Für das Beispiel, welches mit JS Compressor verkleinert wurde, liefert JS Fuck folgendes:

Hier gehts zur Lösung

Wie schon gesagt nimmt die Länge der Scripte nach der Bearbeitung mit JS Fuck stark zu. So werden aus Beispiel 1 mit 116 Byte plötzlich 503259 Byte (~496KB), also ein Wachstum um mehr als 427500%.

Im zweiten Beispiel ist der Unterschied noch größer. Aus anfänglich 367 Byte werden danach 3528459 Byte (3,4MB), also eine Vergrößerung um stolze 961000%.

Ich verlinke an dieser Stelle auf die entsprechenden Dateien, da die JS-Fuck Scripte wirklich sehr lang und groß sind. Für den alltäglichen Gebrauch auf einer Webseite eigentlich kaum zu empfehlen.

Fazit

Clientseitige Scripte kann man nicht unbedingt vor Manipulation schützen, jedoch diese (sehr) erschweren.

Wenn man dazu entsprechende Tools, wie JS Fuck nutzt, muss man bedenken, dass die Performance bzw. Ladezeit der Seite/des Scripts stark darunter leiden kann.

Trotzdem dürfen nach einer solchen Bearbeitung die serverseitigen Prüfungen nicht wegfallen.

Gruß

gehaxelt

coding

« Teamspeak Server Backup Script Kostenloses Buch über freie Software »