2010-02-23 5 views
7

Wie funktioniert dieser Code überhaupt?Wie funktioniert dieser verschleierte Perl-Code?

#!/usr/bin/perl 

$i=4;$|[email protected]=map{("!"x$i++)."K$_^\x{0e}"} 
"BQI!\\","BQI\\","BQI","BQ","B","";push 
@f,[email protected][1..5];@f=map{join"",undef, 
map{chr(ord()-1)}split""}@f;{;[email protected] 
f;print$f;[email protected],$f;select undef,undef, 
undef,.25;redo;last;exit;print or die;} 
+2

Was ist das Problem, mit Ausnahme extremer Hässlichkeit? – anthares

+0

Executable Line Noise :-D – Krab

+0

Die magischen Perl Feen machen alles möglich. – Ether

Antwort

8

Hier gibt es keine Magie, nur Verschleierung. Nehmen wir eine hochrangige Sicht. Das erste, was zu bemerken ist, dass später wird jedes Zeichen in Strings interpretiert, als ob es das vorherige Zeichen waren:

,
[1] map{chr(ord()-1)} ... 

So eine Zeichenfolge wie „6qD“ führt zu „5rC“ (die Zeichen vor dem " 6 ',' q 'bzw.' D '). Der wichtigste Punkt von Interesse ist das Array von Strings in der Nähe von Anfang an:

[2] ">>>E!)",">>>E)",">>>E",">>>",">>",">","" 

Diese eine Folge von „Masken“ definiert, die wir später ersetzen wird, in dieser Zeichenfolge:

[3] "9$_*\x{0e}" 

Sie werden am Punkt $_ eingefügt werden. Die Zeichenfolge \x{0e} repräsentiert ein Hexadezimalzeichen; Beachten Sie, dass \x{0d}, das Zeichen direkt davor, ein Wagenrücklauf ist. Das wird in [3] ersetzt, wenn wir [1] tun.

Bevor die [3] Zeichenkette zusammengefügt wird, wird eine Zahl von ! an jedes Element in [2] angefügt. Jedes nachfolgende Element erhält eine weitere ! als das Element davor. Beachten Sie, dass das Zeichen, dessen Wert kurz vor ! liegt, ein Leerzeichen ist.

Der Rest des Skripts iteriert über jedes der zusammengesetzten Array-Elemente, die wie folgt aussehen mehr jetzt:

[4] "!!!!!9>>>E!)\x{0e}", ---> "  8===D (" 
    "!!!!!!9>>>E)\x{0e}", ---> "  8===D(" 
    "!!!!!!!9>>>E\x{0e}", ---> "  8===D" 
    "!!!!!!!!9>>>\x{0e}", ---> "  8===" 
    "!!!!!!!!!9>>\x{0e}", ---> "   8==" 
    "!!!!!!!!!!9>\x{0e}", ---> "   8=" 
    "!!!!!!!!!!!9\x{0e}", ---> "   8" 

Dann wird der Betrieb reverse die gleichen Elemente in umgekehrter anhängt, um eine Schleife zu schaffen.

An diesem Punkt sollten Sie in der Lage sein, das Muster emerge zu sehen, das die Animation erzeugt. Jetzt geht es nur darum, sich durch jeden Schritt in der Animation und wieder zurück zu bewegen, was durch den Rest des Skripts erreicht wird. Die Zeitschrittverzögerung jedes Schritts wird durch die Select-Anweisung gesteuert:

[5] select undef, undef, undef, 0.25 

, die uns angibt, zwischen jeder Iteration 250 Millisekunden zu warten. Sie können dies ändern, wenn Sie es beschleunigen oder verlangsamen wollen.

+0

Ich ersetzte die ursprüngliche Quelle durch ungefähr gleichwertigen Code, der für die Arbeit sicher ist. Sie einfach wissen zu lassen, falls Sie Ihre Antwort ändern möchten. –

16

Lässt diese zuerst durch perltidy

$i = 5; 
$| = @f = map { ("!" x $i++) . "9$_*\x{0e}" } ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", ""; 
push @f, reverse @f[ 1..5 ]; 
@f = map { 
    join "", 
     map { chr(ord() - 1) } 
     split // 
} @f; 
{ 
    $f = shift @f; 
    print $f; 
    push @f, $f; 
    select undef, undef, undef, .25; 
    redo; 
    last; 
    exit; 
    print or die; 
} 

Die erste Zeile ist offensichtlich gestellt.

Die zweite Zeile erstellt eine Liste ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "", und Leerzeichen sie alle gleich lang sein und hängt ein Sternchen und ein "Shift Out" (das Zeichen nach einem Wagenrücklauf).

Die dritte Zeile hängt die Elemente 5 bis 1 (in dieser Reihenfolge) an diese Liste an, so dass es ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "", ">", ">>", ">>>", ">>>E" ist.

Die Karte verringert alle Zeichen um eins und erstellt Elemente wie 8===D().

Die zweite Schleife druckt die Elemente in der Liste alle 0,25 Sekunden in einer Schleife aus. Der Wagenrücklauf verursacht, dass sie einander überschreiben, so dass eine Animation gesehen wird.Die letzten paar Zeilen werden nie erreicht und somit falsch.

+0

Ich ersetzte die ursprüngliche Quelle durch ungefähr gleichwertigen Code, der für die Arbeit sicher ist. Sie einfach wissen zu lassen, falls Sie Ihre Antwort ändern möchten. –

14

Daten aus der Datei werden in ein Programm namens Perl Interpreter geladen. Der Interpreter analysiert den Code und konvertiert ihn in eine Reihe von "Opcodes" - eine Bytecode-Sprache, die auf halbem Wege zwischen Perl-Code und der Maschinensprache liegt, auf der der Code läuft. Wenn im Konvertierungsprozess keine Fehler aufgetreten sind ("Compilieren" genannt), wird der Code von einem anderen Teil des Perl-Interpreters ausgeführt. Während der Ausführung kann das Programm verschiedene Zustände der Maschine ändern, wie z. B. Zuweisen, Freigeben, Lesen und Schreiben in den Speicher oder Verwenden der Eingabe/Ausgabe und anderer Merkmale des Systems.

(CW - Mehr hardcore Hacker als ich willkommen sind Fehler oder Missverständnisse zu korrigieren und weitere Informationen hinzufügen)

+3

LOL. Es ist lange her, seit ich eine schmerzlich wörtliche Abigail-esque Antwort gesehen habe. –

+2

+1 Die größte Antwort auf Stack Overflow eva! – Sampson