Just another Perl hacker
aus Wikipedia, der freien Enzyklopädie
Just another Perl hacker (abgekürzt JAPH) steht für ein in der Programmiersprache Perl geschriebenes kurzes Computerprogramm, das lediglich den Text „Just another Perl hacker“ ausgibt, seine Funktionsweise im Quelltext dabei aber möglichst wirkungsvoll verschleiert. Ein solches Programm dient experimentellen Zwecken sowie der Unterhaltung der Programmierer und hat darüberhinaus keinerlei praktischen Nutzen, obgleich die Analyse der Funktionsweise eines JAPHs für Perl-Programmierer außerordentlich lehrreich sein kann.
Inhaltsverzeichnis |
[Bearbeiten] Methodik der Verschleierung
Zum Zweck der Verschleierung (engl. Obfuscation) wird der Programmcode zumeist – unter Ausnutzung auch der abwegigsten syntaktischen Möglichkeiten der Programmiersprache Perl – derart kryptisch formuliert, dass man ihm seine Funktion (die Ausgabe von „Just another Perl hacker“) selbst auf den zweiten Blick kaum ansieht. Nicht selten wird dem Quelltext darüberhinaus durch kreatives Layout ein originelles und für Programmcode völlig untypisches Erscheinungsbild verliehen. Beides dient der Verschleierung der eigentlichen Funktion und/oder der Funktionsweise des Programmes, oder gar der Tatsache, dass es sich bei dem vorliegenden Text überhaupt um ein Computerprogramm handelt.
[Bearbeiten] Historie
Die „Programmierdisziplin“ JAPH wurde vermutlich Anfang der 1990er Jahre durch Randal L. Schwartz begründet, der bei Postings in die Newsgroup „comp.lang.perl“ (Vorgänger der heutigen Newsgroup „comp.lang.perl.misc“) immer ein JAPH in seine Signature integrierte. (Signatures können auch andere kurze Programme enthalten, wie diese Sammlung zeigt.) Auch heute noch werden JAPHs entweder im Rahmen von Programmierwettbewerben (z.B. dem Obfuscated Perl Contest) entwickelt, oder just for fun – als kreative Fingerübung der Perl-Programmierer.
[Bearbeiten] Beispiele
Ein Perl-Programm für die Ausgabe von „Just another Perl hacker“ sähe normalerweise so aus:
print "Just another Perl hacker";
Verschleierung (Obfuscation) kann beispielsweise erreicht werden durch Einbinden dieser – an sich verständlichen – Anweisung in sehr undurchsichtigen Code:
$_='987;s/^(d+)/$1-1/e;$1?eval:print"Just another Perl hacker"';eval;
Ein JAPH kann auch wie purer Datenmüll aussehen, obwohl dieser tatsächlich sowohl die auszugebenen Zeichen als auch den Code für deren Ausgabe enthält:
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Manche JAPHs sind weniger schwer verständlich, scheinen aber einem gänzlich anderen Zweck zu dienen als der Ausgabe von „Just another Perl hacker“:
$_ = "wftedskaebjgdpjgidbsmnjgc"; tr/a-z/oh, turtleneck Phrase Jar!/; print;
Das folgende Beispiel kommt ohne Variable und ohne jegliche Interpunktion aus, es werden ausschließlich Perl-Schlüsselwörter verwendet. Vermutlich werden nur erfahrene Perl-Programmierer (und der Perl-Interpreter) erkennen, dass es sich bei diesem perfekt rechteckig formatierten Text um ein funktionsfähiges Perl-Programm handelt:
not exp log srand xor s qq qx xor s x x length uc ord and print chr ord for qw q join use sub tied qx xor eval xor print qq q q xor int eval lc q m cos and print chr ord for qw y abs ne open tied hex exp ref y m xor scalar srand print qq q q xor int eval lc qq y sqrt cos and print chr ord for qw x printf each return local x y or print qq s s and eval q s undef or oct xor time xor ref print chr int ord lc foreach qw y hex alarm chdir kill exec return y s gt sin sort split
Das Gegenteil trifft auf dieses JAPH-Programm zu: Es besteht ausschließlich aus Sonderzeichen; alphanumerische Zeichen und Leerraum fehlen gänzlich. (Hinweis: dieses JAPH ist nur unter Unix lauffähig.)
`$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=( $!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;$.++;$.++; $_++;$_++;($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);$,++ ;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`
Schließlich ein weiteres Beispiel für Obfuscation: rätselhafter Code in wahrlich originellem Layout. Man beachte – neben der Wiedergabe des „STAR WARS“-Logos – auch den y-Operator in seinem Kontext (y/ODA
) sowie die Verwendung des Variablennamens @yoda
, beides hier zur besseren Erkennung grün eingefärbt („Yoda“ ist eine Figur aus dem Film „Star Wars“):
undef$/;$_=<DATA>;y/ODA\n / /ds;@yoda=map{length}split;print chr oct join('',splice(@yoda,0,3))-111 while@yoda; __DATA__ 00O00O000O00O0000 000O DD000000O0 0DO0000000O0000O00 O00000 00O00000O0O 0000 0O0 O00 O00 00D 0DO 00O0 0O0 00D 000 DO0D00000D 0O00 DOD 000000O00000 000 O00O DD0000D000O0 000 0O00O0000D00DO 0OD D00O000D00O0 00000DO00O0 000 000O 00D0 O0D O00000O0DO0 0O000 OD0D O00O0 0000 DDDO000000 O00O000000 0O000 O00DDO 00000 0O0D00 00O0O00000O 0O00O000000 0O0O00OD00000DDD 00O 0D0 DDD D0O 00O0D 00000O00000000 O00 DO0 D00D00O000 00D00 D0O00 O0000 000O000O00DO 000 00O0 0OD00 O00 000 0O000D000O00O0 000 0D0O000000O00O00 0 0 0O0D 0000 0O0 0O0000000O000O
[Bearbeiten] Siehe auch
- 2001: Odyssee im Weltraum / Hommagen / Computerprogramme – ein JAPH als „tribute to one of the greatest films of all time“
- Obfuscated Perl Contest
- Obfuscator – Hilfsmittel zur Verschleierung von Programmen
[Bearbeiten] Weblinks
- Cultured Perl: The Elegance of JAPH (englisch)
- Eine Sammlung von 224 JAPHs (englisch)
Die Beispiele 2, 3, 4 und 7 stammen aus dieser Sammlung. Mit Ausnahme des Beispiels 7, dessen Herkunft – wie die der Beispiele 5 und 6 – ungeklärt ist, werden dort auch die Autoren genannt. - Abigail's brillante interaktive Webseite über JAPHs (englisch)
- Ausführlich erklärter JAPH – Mark Jason Dominus' Beitrag zum 5. Obfuscated Perl Contest aus dem Jahr 2000 (englisch)