Klick: "FÜR KÖNNER" mit PHP algo rückwärts rechnen

Ja das ist nicht ganz trivial. Ich habe hier einen Javascriptcode der einen Text aus einem zusammengeschrabbelten Inhalt generieren kann:

  
<script language="javascript" type="text/javascript">  
<!--  
function hideTxt(str){  
 var t=''; var s=unescape(str);  
 var x=Math.round(Math.sqrt(16));  
 for(var i=0;i<s.length;i++) t+=  
  String.fromCharCode(s.charCodeAt(i)^(i%2?x:0));  
 document.write(t.  
  replace(/\*/g,'<\/td><td>').  
  replace(/\^/g,'" title="').  
  replace(/~/g,'<\/td><\/tr><tr class="dbeven"><td>').  
  replace(/!/g,'<\/td><\/tr><tr class="dbodd"><td>').  
  replace(/\|/g,'<\/td><td><a href="\/cgi-bin\/shdb\.pl\?key=')  
 );  
}  
hideTxt('%3cpafla si`tl=#768# fovdar9%274%27$calhped`ijg9%270%27$calhstagijg9%275%27:%3cpr$chaws9"`bavan%26%3e8tl%3e%27%3c+tl%3e8tl%3elowt%3epkrp%3c+tl%3e8tl%3epyte%0e%3cpafla si`tl=#140!%27:%3cpr$spyhe9%27pe|t)ahicn%3e gejtar#%3e%0e%3cpd:%3ce lraf9%27;t90# pipla=#AHL$pvo|y$lmsp%27:AHL8/e%3e8/pd:%0a8t');  
-->  
</script>

Kann man das auch mit PHP?

  1. Kann man das auch mit PHP?

    Dieselbe Funktionalität zu erreichen ist unmöglich (Clientseitig).

    Denselben Algorithmus nachzuprogrammiern ist hingegen extrem einfach - lediglich die Funktionsnamen weichen ab, ansonsten ist PHP wie auch JavaScript syntaktisch gesehen C-ähnlich - das protieren ist also Kinderfasching.

  2. Hallo Klick,

    var x=Math.round(Math.sqrt(16));

    ist das jetzt das Ergebnis vom Taschenrechnereinsatz im Mathe-Unterricht?

    Gruß, Jürgen

    1. Hallo Jürgen,

      var x=Math.round(Math.sqrt(16));
      ist das jetzt das Ergebnis vom Taschenrechnereinsatz im Mathe-Unterricht?

      sowas können nur Könner vereinfachen ;-)

      Freundliche Grüße

      Vinzenz

  3. Wow jeder sagt das er es kann aber keiner schreibt den Code ;-)

    1. Wow jeder sagt das er es kann aber keiner schreibt den Code ;-)

      Ich weiß auch woran das liegt: Zitat 1824 :)

      1. Wow jeder sagt das er es kann aber keiner schreibt den Code ;-)

        Ich weiß auch woran das liegt: Zitat 1824 :)

        Zudem, sei froh dass du nicht auf deine Frage

        Kann man das auch mit PHP?

        ein simples "ja" als Antwort erhalten hast :p

    2. Hallo,

      Wow jeder sagt das er es kann aber keiner schreibt den Code ;-)

      ok, die Zeile auf die sich Jürgen und ich bezogen:

      var x=Math.round(Math.sqrt(16));
      ist das jetzt das Ergebnis vom Taschenrechnereinsatz im Mathe-Unterricht?
      sowas können nur Könner vereinfachen ;-)

      schreibe ich Dir gern in PHP um:

      $x = 4;

      Ich hab' das komplizierteste für Dich erledigt, den trivialen Rest schaffst Du mit suits Hinweis doch von alleine. *bg*

      Was hast Du versucht, wo bist Du hängengeblieben?

      Fragende Grüße

      Vinzenz

      1. $x = 4;

        Miese Arbeit, nachdem x ohnehin nur 1x vorkommt, brauchts eigentlich gar keine Variable :p

    3. Hi,

      Wow jeder sagt das er es kann aber keiner schreibt den Code ;-)

      natürlich nicht, das ist ja nicht mal 'ne Fingerübung - und bisher hast Du auch nicht gesagt, was Du dafür zahlen möchtest, dass andere Dir die "Arbeit" abnehmen.

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
  4. Hallo,

    ich denke der erste Ansatz ist die Mathematische Funktion zu nehmen. Ich vermute das die Zahl 16 variabel ist daher sollte du sie extrahieren und in folgenden Inhalt einfügen

    round(sqrt(hierzahlrein),0);

    Somit hast du die variable X

    1. Hallo COM COM,

      vielen Dank. Leider wirft mir mein Pregmatch nichts raus:

      preg_match_all('|var x=Math.round(Math.sqrt((.*)));|Uism',$data, $regs, PREG_PATTERN_ORDER);

      1. Das hängt mit deinen Klammern zusammen:

        var x=Math.round(.*);

        sollte funktionieren und dann mit replace arbeiten.

        1. Also

          $zahl = str_replace("(Math.sqrt(","",$regs[1][0]);  
          $zahl = str_replace(")","",$zahl);
          
          1. Danke die hilfe

  5. Hallo Klick,

    wo liegt denn jetzt dein Problem? Willst du das Javascript in PHP nachbauen oder, wie es der Titel auch vermuten lässt (algo rückwärts rechnen), ein PHP-Script schreiben, das den Text so verschlüsselt, dass er vom gezeigten Javascript wieder entschlüsselt werden kann?

    Gruß, Jürgen

    1. Hallo Jürgen,

      fast richtig. Es geht darum den Inhalt nicht per Javascript zu entschlüsseln sondern mit php.

      Den ersten Ansatz (var  x) hat COM COM gerade mit den Quelltext gelöst.

      preg_match_all('|var x=Math.round(.*);|Uism',$data, $regs, PREG_PATTERN_ORDER);  
      $zahl = str_replace("(Math.sqrt(","",$regs[1][0]);  
      $zahl = str_replace(")","",$zahl);  
      echo 'Die Ursprungszahl heißt '.$zahl.' <br>';  
      echo 'Das Ergebnis  '.round(sqrt($zahl),0).' <br>';
      

      Ich denke für die (var S) unescape könnte man vermutlich mit urldecode() lösen.

      Aber was ist mit der for schleife ? Sie soll so lange laufen bis i größer s ist richtig? Aber S verstehe ich dann nicht, woher kommt die Zahl?

      Danke Klick

      Hallo Klick,

      wo liegt denn jetzt dein Problem? Willst du das Javascript in PHP nachbauen oder, wie es der Titel auch vermuten lässt (algo rückwärts rechnen), ein PHP-Script schreiben, das den Text so verschlüsselt, dass er vom gezeigten Javascript wieder entschlüsselt werden kann?

      Gruß, Jürgen

      1. Hallo Klick,

        fast richtig. Es geht darum den Inhalt nicht per Javascript zu entschlüsseln sondern mit php.

        also einfach nur 1:1 in PHP übersetzen.

        Den ersten Ansatz (var  x) hat COM COM gerade mit den Quelltext gelöst.

        preg_match_all('|var x=Math.round(.*);|Uism',$data, $regs, PREG_PATTERN_ORDER);

        $zahl = str_replace("(Math.sqrt(","",$regs[1][0]);
        $zahl = str_replace(")","",$zahl);
        echo 'Die Ursprungszahl heißt '.$zahl.' <br>';
        echo 'Das Ergebnis  '.round(sqrt($zahl),0).' <br>';

          
        vielleicht liegt es an meinen mangelhaften PHP-Kenntnissen das ich die Verbindung zwischen deinem Javascruipt und diesem PHP-Code nicht sehe.  
          
        Da ich dir konkret nicht mehr weiterhelfen kann, nur ein Tipp:  
          
        schlage in der Javascriptdoku (z.B. hier) die wenigen verwendeten Methoden nach und suche dann in der PHP-Doku die entsprechenden. Dazu solltest du aber mindestens PHP-Grundkenntnisse mitbringen.  
          
        Aber vielleicht verrätst du uns mal, was du wirklich willst, also warum du das Javascript in ein PHP-Script übersetzen willst. Nicht das wir dir erklären, wie du nach Rom kommst wenn du nur Pizza kaufen willst.  
          
          
          
        Gruß, Jürgen  
        
        
      2. Hallo,

        fast richtig. Es geht darum den Inhalt nicht per Javascript zu entschlüsseln sondern mit php.

        geht es darum, variablen Javascriptcode als Ausgangsbasis zu haben, inklusive der Funktion oder möchtest Du nur den Inhalt der Zeichenkette

        %3cpafla sitl=#768# fovdar9%274%27$calhpedijg9%270%27$calhstagijg9%275%27:%3cpr$chaws9"bavan%26%3e8tl%3e%27%3c+tl%3e8tl%3elowt%3epkrp%3c+tl%3e8tl%3epyte%0e%3cpafla sitl=#140!%27:%3cpr$spyhe9%27pe|t)ahicn%3e gejtar#%3e%0e%3cpd:%3ce lraf9%27;t90# pipla=#AHL$pvo|y$lmsp%27:AHL8/e%3e8/pd:%0a8t

        mit dem aus der Funktion bekannten Code - in PHP gewandelt - entschlüsseln?

        Freundliche Grüße

        Vinzenz

        1. mit dem aus der Funktion bekannten Code - in PHP gewandelt - entschlüsseln?

          Vollkommen richtig

          1. Hallo,

            mit dem aus der Funktion bekannten Code - in PHP gewandelt - entschlüsseln?
            Vollkommen richtig

            dann ist es überflüssig, den Javascriptcode per PHP in PHP umzusetzen: -)
            Wie suit bereits angemerkt hat, streiche einfach die von Jürgen und mir angesprochene Zeile und setze schon mal in

            String.fromCharCode(s.charCodeAt(i)^(i%2?x:0));

            für x eine 4 ein: Du hast somit (mit einem von mir eingefügten Klammernpaar und ein paar für mich wichtigen Leerzeichen):

            for(var i=0; i < s.length; i++) {  
                t += String.fromCharCode(s.charCodeAt(i)^(i % 2 ? 4 : 0));  
            }  
            
            

            Da sich die Länge der Zeichenkette nicht ändert, reicht es aus, diese einmal vor der Schleife zu bestimmen.

              
            // Ermittle die Anzahl der Zeichen im verschlüsselten Text  
            var anzahl = s.length;  
              
            // Für jede Zahl von 0 bis einschließlich der ermittelten Anzahl - 1  
            // mache folgendes  
            for(var i=0; i < s.length; i++) {  
                // Ermittle den Rückgabewert der Funktion charCodeAt() angewandt auf  
                // das Zeichen an dieser Position der Zeichenkette.  
                // Wende darauf eine Bitoperation an (die positionsabhängig ist).  
                // Wende auf das Ergebnis dieser Operation die Methode fromCharCode an  
                // und hänge das resultierende Zeichen an eine Zeichenkette in der  
                // Variablen t an.  
                t += String.fromCharCode(s.charCodeAt(i)^(i % 2 ? 4 : 0));  
            }  
            
            

            Wie bereits angemerkt wurde, musst Du

            a) nachschlagen, welche Javascript-Funktionalität genutzt wurde,
                  wenn sie Dir unbekannt ist
               b) das passende PHP-Gegenstück dazu nehmen.

            Es ist nicht sinnvoll, den Javascript-Code der Funktion per RegExp in PHP umzuwandeln.

            Freundliche Grüße

            Vinzenz