News... | Hack-Acad | Downloads | Web-Projekte | System-Check | Kontakt
HACKACAD - Quelltext Encodierung (Tutorial)

Hin und wieder stolpert man über Seite die es offentsichtlich versuchen Bilderdiebstahl, Sourcecode Kopierung und ähnliches zu verhindern. Dies kann von einfachen "Rechter Mausklick" unterbinden bis hin zu Quelltext Kodierung führen. Während man einen Rechten Mausklick oftmals einfach per "strg (halten) + return (halten) + rechter Mausklick (halten) ... strg loslassen, return loslassen und Maustaste loslassen" doch ins Leben rufen kann, so stellt der Sourcecode manchmal eine halbe Minute mehr Arbeit da.

Ein schönes Beispiel: www.myrrthronth.de

Hier sind offentsichtlich Javascript Fetischisten am Werk. Grundsätzlich alles ausschalten was auch nur irgendwie "Diebstahl" zulässt. Über Metal Map -> Germany suche man sich irgendeine Band raus. Auf deren Discographie Seite schaue man sich den Quelltext an (wer Probleme wegen dem Frameset und der Deaktivierten Statuszeile hat, sollte einfach mal in den Browserverlauf schauen um an die separate URL zu kommen). Beispiel Quellcode von der Band DNS:

<html><head><meta http-equiv="expires" content="2"><meta http-equiv="imagetoolbar"
content="no"><meta http-equiv="Content-Language" content="de"><meta http-equiv="Content-Type"
content="text/html; charset=windows-1252"><title>Darkened Nocturn Slaughtercult - = MYRRTHRONTH
= - Black Metal Index - The Pest Called Humanity | Split with Pyre | Follow The Calls For Battle | Split
with Donkelheet | Nocturnal March</title><base target="_self"> <script language="JavaScript"
fptype="dynamicanimation">
<!--
function dynAnimation() {}
function clickSwapImg() {}
//-->
</script> <script language="JavaScript1.2" fptype="dynamicanimation" src="../../animate.js">
</script></head><body bgcolor="#000000" text="#C0C0C0" background="../../images/kreuz_background.gif"
link="#008080" vlink="#008080" alink="#008080" leftmargin="50" onload="dynAnimation()"><script
language="JavaScript" type="text/javascript"><!--
var q=77,g="",c="k:8BFfqSIl27\"AeV45RnDUgj&ZsNLW6hTKduy1JHv=p()PxoC/3r
.c|aiz-9OE<b_w;#!0M>GYtm",a="";eval(unescape("%66%75%6E%63%74%69%6F%6E%20%70%28%64%29%7B%76%
61%72%20%75%3D%27%27%2C%66%2C%69%2C%6D%2C%6E%3B%66%6F%72%28%66%3D%30%3B%66%3C%64%2E%6C%65%6E%67%74%
68%3B%66%2B%2B%29%7B%69%3D%64%2E%63%68%61%72%41%74%28%66%29%3B%6D%3D%63%2E%69%6E%64%65%78%4F%66%28%
69%29%3B%69%66%28%6D%3E%2D%31%29%7B%6E%3D%28%28%6D%2B%31%29%25%71%2D%31%29%3B%69%66%28%6E%3C%3D%30%
29%7B%6E%2B%3D%71%7D%75%2B%3D%63%2E%63%68%61%72%41%74%28%6E%2D%31%29%7D%65%6C%73%65%7B%75%2B%3D%69%
7D%7D%67%2B%3D%75%7D%3B%66%75%6E%63%74%69%6F%6E%20%65%65%65%28%29%7B%64%6F%63%75%6D%65%6E%74%2E%77%
72%69%74%65%28%67%29%7D"));p("bN| z(m.2iDjyijVpAHi=iI| z(mA.m1(VpAmVom3&i=iN| z(mAGb099\nqyD|mzCD.|y)P{ Vmy
D.qi2NV}qyD|mzCD.Cky)VP{zq)Vc;Tz|TppJP{;zDuC;c
V2ViNV<=VDmN)<=VDmc>EgI<>E4<P#;zDuC;cCDkCyNVkC=VpDy22}}qyD|mzCD.D )VP{zq)Vc;Tz|TppJP{;zDuC;c|i(my
V<=VDmN)<=VDmc>EgI<>E4<P#;zDuC;cCDkCyNVkC=Vp|y}zq)Vc;Tz|TpprP{ Vmy
D.qi2NV}}qyD|mzCD.|=)P{=(pV=VDmc_ymmCD#zq)=(pp7aa=(pprPi2V
m)yDVN|i(V)AKTzN.qyD|mzCD.zN.DCm.i=iz2i_2VcAPP}zCpuC|ykVDmci22#iVpuC|ykVDmcjVm<2VkVDmF1lu#zq)zCP{zq)iVP{uC|
ykVDmcCDNV2V|mNmi
mp|y#uC|ykVDmcCD|CDmVomkVD");p("yp|y}V2NV{uC|ykVDmcCDkCyNVuC;Dp|=}}zq)iVZZ0zCP{uC|ykVDmcCDkCyNVuC;Dp|y#uC|ykV
DmcCDkCyNVy(pD #uC|ykVDmcCD|CDmVomkVDyp|y}zq)uC|ykVDmc2i1V NP{;zDuC;c|i(my
V<=VDmN)<=VDmc>EgI<gxa<=VDmc>EgI<UE6LP#;zDuC;cCDkCyNVuC;DpD
#;zDuC;cCDkCyNVy(pCky}qyD|mzCD.SiM)P{;zDuC;cNmimyNpA.A#NVmKzkVCym)ASiM)PA,RMP}SiM)P#qyD|mzCD.SiJ)P{ Vmy D.m
...
  

Auf den ersten Blick recht chaotisch... doch das "Geheimnis" liegt einzig in der Javascript Funktionen Unescape. Als Übergabe Parameter erhält unescape einen String. Dieser String wird in reguläre ASCII-Zeichen umgewandelt. Dieser übergebene String wird mit einem Prozentzeichen (%) und dem entsprechenden Hexadezimalwert des Zeichens (siehe ASCII-Zeichentabelle) zusammengesetzt..

Als Beispiel nehmen wir einmal das Wort "test". Zunächst brauchen wir die Hexwerte: 

Hierfür kann man sich schnell ein Hilfprogrammbasteln:

 <script language="javascript">
 <!--
 function getHexWerte(string)
 {
    var string = string;
    var int,hex,tmp,rest;

    for (var i = 0; i < string.length; i++)
    {
     tmp = 0;
     hex = '%';

     int = ''+string.charCodeAt(i);

     do
     {

        tmp = Math.floor(int/16);
        rest = int-(16 * tmp);

        if(tmp>=10)
           tmp = String.fromCharCode(55+tmp);

        hex = hex+''+tmp;

     }
     while (rest > 16);

     if(rest>=10)
     rest = String.fromCharCode(55+rest);

     hex = hex+''+rest;

     document.write('<b>'+hex+'</b>');
    }
 }
 -->
 </script>
  

Zum prüfen nehmen wir nun die eigentliche unescape Funktion: 

  <script>
  <!--
  document.write(unescape('%74%65%73%74'));
  -->
  </script>
  

Schön und gut, doch was bringt das jetzt??? Nun der Quellcode könnte also in HEX Werte umgewandelt werden und per Javascript innerhalb eines document.writes wie eben geschildert ausgegeben werden. Schaut sich jemand den Quellcode an wird er wie im Beispiel von myrrthronth.de (oder ein kleiner Beispielabschnitt im Sourcecode dieser Seite) nur wirres Zeug sehen. Der Laie lässt sich abschrecken... obwohl der Schlüssel zum decodieren gezwungener Maßen im Quellcode steht !!!

Unschwer erkennt man das HEX Muster im Codeauszug der myrrthronth.de Seite. Es wird somit zunächst eine Funktion angelegt die unseren Klartext verunstaltet. Im einfachen Fall einfach eine Buchstabenverschiebung, so dass a = e, b = f, usw. ist (oder ähnliche Muster). Durchaus lassen sie auch komplexere Methoden entwerfen. Diese "Verunstaltungsfunktion" wird nicht auf der eigentliche Seite veröffentlicht, stattdessen muss dort die Rückwandlungsfunktion versteckt werden.

Das bedeutet einfach nur wenn wir 'a' als 'e' ausgeben, dann muss der Browser später auch wieder 'a' erhalten, da sonst wirklich nur Unfug rauskommt.

Fangen wir klein an. Klicke hier und ein Alert Fenster öffnet sich. Durchsucht man nun den Quellcode dieser Seite, so wird sich zwar das Wort Alert finden lassen, aber nicht der eigentliche Javascript Code, bzw. die eigentliche Funktion. Warum ???

Ganz einfach weil diese Methode "verunstaltet" wurde. Doch nun zur Sache... nehmen wir einfach mal den HEX Code Abschnitt aus dieser Seite:

%3C%73%63%72%69%70%74%20%6C%61%6E%67%75%61%67%65%3D%22%6A%61%76%61%73%63%72%69%70%74%22%3E%0D%0A%66%75%6E%63
%74%69%6F%6E%20%78%41%28%62%29%7B%0D%0A%76%61%72%20%74%6D%70%31%3D%75%6E%65%73%63%61%70%65%28%62%29%3B%20%0D
%0A%76%61%72%20%74%6D%70%32%3D%27%27%3B%0D%0A%66%6F%72%28%69%3D%30%3B%69%3C%74%6D%70%31%2E%6C%65%6E%67%74%68
%3B%69%2B%2B%29%0D%0A%74%6D%70%32%20%2B%3D%53%74%72%69%6E%67%2E%66%72%6F%6D%43%68%61%72%43%6F%64%65%28%74%6D
%70%31%2E%63%68%61%72%43%6F%64%65%41%74%28%69%29%2B%31%29%3B%0D%0A%0D%0A%64%6F%63%75%6D%65%6E%74%2E%77%72%69
%74%65%28%75%6E%65%73%63%61%70%65%28%74%6D%70%32%29%29%3B%0D%0A%7D%0D%0A%3C%2F%73%63%72%69%70%74%3E

Lassen wir uns diesen HEX String nun per unescape ausgeben erhalten wir:



Geht man dieses Skript durch erkennt man schnell das hier der Funktion xA ein String übergeben wird. Innerhalb der ForSchleife wird die bereits angesprochene Buchstabenverschiebung vorgenommen. Das heisst wenn wir 'test' reingeben, wird am Ende 'uftu' raus kommen. xA ist unsere Decodierungsfunktion. Ein erneuter Blick in den Quellcode zeigt uns das unmittelbar hinter dem HEX Wirrwarr tatsächlich ein xA Auruf erfolgt!!

Diese Zeichenfolge ';rbqhos=etmbshnmdqvhrbgs'(z`kdqs'&oqhl`&(:|;.rbqhos=' wird also an xA weitergereicht.
Und das kommt bei heraus:



Jetzt sollte das Prinzip klar werden. Zuvor wurde mit dem Gegenstück zu xA jedes Zeichen eines Strings im Zeichenwert um -1 verändert. Anhand eines Buchstabenbeispieles hat also die 2. Funktion nennen wir sie xB aus 's' ein 'r' gemacht. xA wird also mit dem Ergebnis von xB gefüttert und wandelt alles wieder schön in "verständliche" Worte um, die wir vielleicht trotzdem nicht verstehen, aber zumindest kann es der Browser und dieser zeigt wiederum die Seite vernünftig an.

Und zum üben entschlüssel man nun den myrrthronth code