Axel Napolitano: Ramses 2 Webkopierschutz - Analyse und Dekodierung

Beitrag lesen

Hallo,

ich habe bei meinem zweiten Chatbesuch in der Überschrift einen Verweis auf die Seiten der frankfurter Firma "ibe-it-guards" <www.ibe-it-guards.de> gefunden.

Dieses Unternehmen behauptet einen wirksamen Schutz gegen den Datenklau im Web zu haben - Ramses nennt sich der Schutz.

Grund genug für mich, mich dem Thema mal anzunehmen - ich konnte das erstmal nicht so glauben...

Der erste Eindruck war: Schön aufgeräumt die Seite (ich hatte Javascript aus und habe nichts gesehen).

Also einschalten...Eine mehr fade als tolle Seite war nun zu sehen - tolle News, wenig Content - das Übliche halt.

Also gleich zum Kopierschutz und mal sehen, was das Ding können soll..

  • Verhindern von Ausdrucken
  • Verhindern des Abspeicherns von Grafiken
  • Verhindern von Textkopien
  • Verhindern von Abspeichern der Seiten etc..

Auf den ersten Blick stimmt das auch alles - sofern JavaScript an ist. Also mal hinter die Kulissen schauen und den Quellcode mal ein wenig analysieren.

Folgendes:

  • Es handelt sich um irgendwas, das mit HTML nicht viel zu tun hat. Der Quellcode startet ausserhalb des Sichtfeldes des Editors und ist auf extrem lange Zeilen verteilt.

Es handelt sich hierbei um ein paar HTML-Fragmente und um JavaScript, das zunächst URL-Codiert(escaped) vorliegt und mittels eval(unescape()) zunächst decodiert und dann ausgeführt wird.

Der erste auf diese untaugliche Art verschleierte Codeblock sieht so aus:

window.status="Website mit Ramses2 geschützt !";
_dw=document.write;
document.write=null;

Auf diesen komplexen Code folgt ein weiterer (augenscheinlich komplexerer) String, der in etwa so aussieht:

_c="q66v75n6Et63k74y69s6Fj6En20l5Fv78h28o73e29n7Bj73n3Dj75n6Ez65b73l63q61b70e65o28t73n29q3Bx74u3Dy41u72c72p61g79f28t29g3Bp74t5Bk30d5Di3Df22x22l3Bc6Ar3Dp30n3Bk66x6Fi72z20h28b69l20b3Dn20v30g3Bq20w69i20h3Ct20k73b2Ee6Ci65j6Er67s74i68w3Bz20s69f2Bq2Bi29x20r7By74q5Be6Ay5Dr2Bk3Db53l74u72n69b6Es67r2Eg66k72h6Fi6D"; [...]

Schon ohne große Analysefähigkeiten hatte ich den Verdacht, das hier nichts wirklich komplex verschlüsselt ist.

Ein Decodieren des darauf folgenden (abermals nur escapten) Blocks brachte die Dekodierroutine zum Vorschein, die mir einen mittleren Lachkrampf abgerungen hatte...

_d="";

for(_i=0;_i<_c.length;_i++)
{
 if(_i%3==0)
 {
  _d+="%";
 }
 else
 {
   _d+=_c.charAt(_i);
 }

eval(unescape(_d));
 _d="";
}

Es handelt sich also bei dem String um eine ebenfalls "URl-Encoded" Zeichenfolge, bei der lediglich das "%" Zeichen durch zufällige Zeichen ersetzt wurde - wow, wie Trickreich!

Nachdem ich nun mittels dieser kleinen Routine den String entschlüsselt hatte, kam eine etwas (wenngleich nicht viel) komplexere Routine zum Vorschein, die den eigentlichen Inhalt der Seite entschlüsselt:

function _x(s)
{
 s = unescape(s);
 t = Array();
 t[0]= "";
 j = 0;

for (i = 0; i < s.length; i++)
 {
  t[j]+=String.fromCharCode(s.charCodeAt(i) + (i%2==0 ? 1 : -1));

if((i+1)%300==0)
  {
   j++;
   t[j]="";
  }
 }

document.write=_dw;

u="";

for(i=0; i<t.length; i++)
 {
  u+=t[i];
 }

document.write(u);

u="";

t=Array();

_dw=document.write;
 document.write=null;
}

Sieht wahnwitzig komplex aus - ist es aber nicht. Die Routine wird wie folgt aufgerufen:

_x(";tbshqs!kbmhtbff%3Ckwtbshqs%3Fhg'xhocpv/kpbbsjno-qqpspbpk/hocfwPe)!ghmd#(%22%3C.0*zmnduhpm>!baptu9ckbml!%3C|=.tbshqs%3F;tbshqs!kbmhtbff%3Ckwtbshqs%3Fhg'endtndos/mk*zed%3C(;(\*(cju!ruxmd>!qnthuhpm;crpkvsf:!kfeu9.01/1oy:!spo;,2/1/qw%3C%1Fxhesi97/qw%3C%1Fidjfis;26oy:!y.hocfw;0#=(*(;(*(hoovs!szof%3C#avsuno!!mblf% [...]

Zunächst sieht diese Zeichenfolge wild aus. Was macht nun die "Entschlüsselungsroutine" ?

Zunächst einmal wird wieder mit "unescape" die  URL-Codierung einzelner Blöcke aufgehoben. Danach wird der String mittels einer Schleife Zeichen für Zeichen durchgefahren. Je nachdem ob der Modulo (i%2) True oder False liefert wird auf den ASCII-Wert des Zeichens 1 addiert oder 1 subtrahiert. Die Zeichen werden dann zu einem Stringarray hinzugefügt, das n Zeilen und 300 Spalten (zeichen) als Dimension hat. Nun wird noch das Array wieder zu einem String zusammengeführt und der nun entschlüsselte Quellcode ausgegeben.

Wahnsinn! Soviel Aufwand für nichts.

Das Ergebnis nach dem "Dekodieren" sieht so aus:

<script language=javascript>if(window.location.protocol.indexOf("file")!=-1){location="about:blank";}</script><script language=javascript>if(document.all){_fc='<'+'div style="position:absolute; left:-1000px; top:-1000px; width:60px; height:35px; z-index:1">'+'<'+'input type="button" name="_xqq" value="" onClick=_ccd() style="visibility:hidden"><'+'/div>';document.write(_fc);function _ccd(){clipboardData.clearData()};function _cce(){_xqq.click();setTimeout("_cce()",300)};setTimeout("_cce()",1000);}</script><script language=javascript>function _ng(){if (document.all) for (i = 0;i< document.images.length;i++){z = document.images(i);z.galleryImg = 'no'}}_ng();</script><script language=javascript>function _np1(){for(wi=0;wi<document.all.length;wi++){if(document.all[wi].style.visibility!="hidden"){document.all[wi].style.visibility="hidden";document.all[wi].id="gwp"}}};function _np2(){for (wi=0;wi<document.all.length;wi++){if(document.all[wi].id=="gwp")document.all[wi].style.visibility=""}};window.onbeforeprint=_np1;window.onafterprint=_np2;</script><script language=javascript>function _ni(){if(document.all){document.onselectstart=function (){return false};document.ondragstart=function (){return false};setTimeout("_ni", 3000);}};_ni();function _nn(){if(document.layers||window.sidebar){var t= document.getSelection();if(t !=""){if(!window.find){alert("Function Disabled.");location="about:blank";}else{if(t !=" "){window.find(" ")};}};setTimeout("_nn()",20)}}_nn();</script><script language=javascript>function _nrcie(){return false}function _nrcns(e){if(e.which==2||e.which==3)return false}if(document.layers){document.captureEvents(Event.MOUSEDOWN);document.onmousedown=_nrcns}document.oncontextmenu=_nrcie;</script><script language=javascript>function _nsb(){window.status="Website mit Ramses2 geschützt !";setTimeout("_nsb()",10)}_nsb();</script></textarea></input><html>

<head>
<meta http-equiv="Content-Language" content="de">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>IBE IT Guards GmbH - Mit Sicherheit sicher kommunizieren</title>
<meta name="robots" content="index">
<meta name="robots" content="follow">
<meta name="language" content="Deutsch">
<meta name="keywords" content="Sicherheit, Netzwerk, Firewall, Router, Verschlüsselung, verschlüsseln, entschlüsseln, Hacker, Cracker, Sniffer, knacken">
<meta name="description" content="Sicherheit im Netzwerk mit und ohne Firewall und Router durch Ramses2">
<meta name="disrtribution" content="global">
<meta name="robots" content="all">
<base target="_top">
<script language="javascript" src="online.pl?user=1&ref=kontakt.html&un=1"></script>
</head>

[...]

</html><iframe name=documentElement width=1 height=1 border=0 frameborder=0></iframe><script>function _no_error(){return true;}window.onerror=_no_error;</script>

Grüße

Axel

PS: Auf Anfrage stelle ich gerne ein C#-Programm zu Dekodieren dieser Seiten zur Verfügung.