Zum Inhalt springen

„Just another Perl hacker“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Beispiele: Grammatik, Form
Zeile 15: Zeile 15:
<syntaxhighlight lang="perl">print "Just another Perl hacker";</syntaxhighlight>
<syntaxhighlight lang="perl">print "Just another Perl hacker";</syntaxhighlight>


Verschleierung (''Obfuscation'') kann beispielsweise erreicht werden durch Einbinden dieser – an sich verständlichen – Anweisung in sehr undurchsichtigen aber an sich funktionslosen Code:
Verschleierung (''Obfuscation'') kann beispielsweise erreicht werden durch Einbinden dieser – an sich verständlichen – Anweisung in undurchsichtigen und funktionslosen Code:


<syntaxhighlight lang="perl">$_='987;s/^(\d+)/$1-1/e;$1?eval:print"Just another Perl hacker"';eval;</syntaxhighlight>
<syntaxhighlight lang="perl">$_='987;s/^(\d+)/$1-1/e;$1?eval:print"Just another Perl hacker"';eval;</syntaxhighlight>


Ein JAPH kann auch wie purer Datenmüll aussehen, obwohl dieser tatsächlich sowohl die auszugebenden Zeichen als auch den Code für deren Ausgabe enthält. In diesem Fall wurde der auszugebende Code durcheinandergewürfelt und der Perl-Einzeiler sortiert den Text zur Ausgabe wieder zurück:
Ein JAPH kann auch wie purer Datenmüll aussehen, obwohl er tatsächlich sowohl die auszugebenden Zeichen als auch den Code für deren Ausgabe enthält. In diesem Fall wurde der auszugebende Code durcheinandergewürfelt und der Perl-Einzeiler sortiert den Text zur Ausgabe wieder zurück:


<syntaxhighlight lang="perl">$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;</syntaxhighlight>
<syntaxhighlight lang="perl">$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;</syntaxhighlight>


Manche JAPHs sind weniger schwer verständlich, scheinen aber einem gänzlich anderen Zweck zu dienen als der Ausgabe von „Just another Perl hacker“. Beim folgenden Beispiel von [[Randal L. Schwartz]] wurde der auszugebende Text mit einem festen Textstring umcodiert. Der Einzeiler macht lediglich die Umcodierung rückgängig:
Manche JAPHs sind weniger schwer verständlich, scheinen aber einem gänzlich anderen Zweck zu dienen als der Ausgabe von „Just another Perl hacker“. Beim folgenden Beispiel von Randal L. Schwartz wurde der auszugebende Text mit einem festen Textstring umcodiert. Der Einzeiler macht lediglich die Umcodierung rückgängig:


<syntaxhighlight lang="perl">$_ = "wftedskaebjgdpjgidbsmnjgc";
<syntaxhighlight lang="perl">$_ = "wftedskaebjgdpjgidbsmnjgc";
tr/a-z/oh, turtleneck Phrase Jar!/; print;</syntaxhighlight>
tr/a-z/oh, turtleneck Phrase Jar!/; print;</syntaxhighlight>


Das folgende JAPH-Programm von Eric Roode besteht ''ausschließlich'' aus Sonderzeichen; [[alphanumerische Zeichen]] und [[Leerraum]] fehlen gänzlich. (Hinweis: dieses JAPH ist nur unter [[Unix]] lauffähig.)
Das folgende, nur unter [[Unix]] lauffähige JAPH-Programm von Eric Roode besteht ''ausschließlich'' aus Sonderzeichen; [[alphanumerische Zeichen]] und [[Leerraum]] fehlen gänzlich.


<syntaxhighlight lang="perl">`$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=(
<syntaxhighlight lang="perl">`$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=(
Zeile 35: Zeile 35:
;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`</syntaxhighlight>
;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`</syntaxhighlight>


Nachstehendes Programm von Mark Jason Dominus gewann den 2. Preis im fünften [[Obfuscated Perl Contest]]. Es erzeugt aus dem in den Quellcode eingebetteten, rückwärts geschriebenen Text (rechts in der ersten Zeile) in absichtlich komplizierter Weise die Ausgabe „Just another Perl / Unix hacker“.<ref>[http://perl.plover.com/obfuscated/ Ausführliche Erklärung zum vorletzten Beispiel] (englisch)</ref>
Nachstehendes Programm von Mark Jason Dominus gewann den 2. Preis im fünften [[Obfuscated Perl Contest]]. Es erzeugt aus dem in den Quellcode eingebetteten rückwärts geschriebenen Text (rechts in der ersten Zeile) in absichtlich komplizierter Weise die Ausgabe „Just another Perl / Unix hacker“.<ref>[http://perl.plover.com/obfuscated/ Ausführliche Erklärung zum vorletzten Beispiel] (englisch)</ref>


<syntaxhighlight lang="perl">@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{
<syntaxhighlight lang="perl">@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{
Zeile 42: Zeile 42:
close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print</syntaxhighlight>
close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print</syntaxhighlight>


Das folgende Programm ist ein „[[polyglotte Programmierung|bilingualer]]“ JAPH: der Code kann sowohl vom Perl-Interpreter, als auch vom Interpreter der [[esoterische Programmiersprache|esoterischen Programmiersprache]] [[Brainfuck]] ausgeführt werden. Die Ausgabe ist in beiden Fällen „Just another Perl Hacker“. Zur Funktionsweise: der große Block mit den Plus- und Minuszeichen ist im Wesentlichen der Brainfuck-Code (mit reduziertem Instruktionssatz), die erste Zeile ist Perl-Code und implementiert einen Brainfuck-Interpreter für ebendiesen reduzierten Satz an Instruktionen.<ref>[http://www.retas.de/thomas/computer/programs/useless/japh/japh_2/index.html Kurze Erläuterung zum letzten Beispiel] (englisch)</ref>
Das folgende Programm ist ein „[[polyglotte Programmierung|bilingualer]]“ JAPH: Der Code kann sowohl vom Perl-Interpreter als auch vom Interpreter der [[esoterische Programmiersprache|esoterischen Programmiersprache]] [[Brainfuck]] ausgeführt werden. Die Ausgabe ist in beiden Fällen „Just another Perl Hacker“. Der große Block mit den Plus- und Minuszeichen ist im Wesentlichen der Brainfuck-Code (mit reduziertem Instruktionssatz), die erste Zeile ist Perl-Code und implementiert einen Brainfuck-Interpreter für ebendiesen reduzierten Satz an Instruktionen.<ref>[http://www.retas.de/thomas/computer/programs/useless/japh/japh_2/index.html Kurze Erläuterung zum letzten Beispiel] (englisch)</ref>


<syntaxhighlight lang="perl">/[+-]/&&eval"\$/$_$_"||/\x2e/&&print chr$/for qw!
<syntaxhighlight lang="perl">/[+-]/&&eval"\$/$_$_"||/\x2e/&&print chr$/for qw!

Version vom 26. Februar 2018, 16:32 Uhr

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über hinaus keinerlei praktischen Nutzen, obgleich die Analyse der Funktionsweise eines JAPHs für Perl-Programmierer außerordentlich lehrreich sein kann.

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über hinaus 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 Programms, oder gar der Tatsache, dass es sich bei dem vorliegenden Text überhaupt um ein Computerprogramm handelt.

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.

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 undurchsichtigen und funktionslosen 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 er tatsächlich sowohl die auszugebenden Zeichen als auch den Code für deren Ausgabe enthält. In diesem Fall wurde der auszugebende Code durcheinandergewürfelt und der Perl-Einzeiler sortiert den Text zur Ausgabe wieder zurück:

$_="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“. Beim folgenden Beispiel von Randal L. Schwartz wurde der auszugebende Text mit einem festen Textstring umcodiert. Der Einzeiler macht lediglich die Umcodierung rückgängig:

$_ = "wftedskaebjgdpjgidbsmnjgc";
 tr/a-z/oh, turtleneck Phrase Jar!/; print;

Das folgende, nur unter Unix lauffähige JAPH-Programm von Eric Roode besteht ausschließlich aus Sonderzeichen; alphanumerische Zeichen und Leerraum fehlen gänzlich.

`$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=(
$!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;$.++;$.++;
$_++;$_++;($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);$,++
;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`

Nachstehendes Programm von Mark Jason Dominus gewann den 2. Preis im fünften Obfuscated Perl Contest. Es erzeugt aus dem in den Quellcode eingebetteten rückwärts geschriebenen Text (rechts in der ersten Zeile) in absichtlich komplizierter Weise die Ausgabe „Just another Perl / Unix hacker“.[1]

@P=split//,".URRUU\c8R";@d=split//,"\nrekcah xinU / lreP rehtona tsuJ";sub p{
@p{"r$p","u$p"}=(P,P);pipe"r$p","u$p";++$p;($q*=2)+=$f=!fork;map{$P=$P[$f^ord
($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$_}keys%p}p;p;p;p;p;map{$p{$_}=~/^[P.]/&&
close$_}%p;wait until$?;map{/^r/&&<$_>}%p;$_=$d[$q];sleep rand(2)if/\S/;print

Das folgende Programm ist ein „bilingualer“ JAPH: Der Code kann sowohl vom Perl-Interpreter als auch vom Interpreter der esoterischen Programmiersprache Brainfuck ausgeführt werden. Die Ausgabe ist in beiden Fällen „Just another Perl Hacker“. Der große Block mit den Plus- und Minuszeichen ist im Wesentlichen der Brainfuck-Code (mit reduziertem Instruktionssatz), die erste Zeile ist Perl-Code und implementiert einen Brainfuck-Interpreter für ebendiesen reduzierten Satz an Instruktionen.[2]

/[+-]/&&eval"\$/$_$_"||/\x2e/&&print chr$/for qw!
=================================================
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + .
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + . - - . + . -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - . + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + .
+ + + + + + + + + + + + + . + . + + + + + . - - -
- - - - - - - - - . - - - . + + + + + + + + + + +
+ + . - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - . + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + . + + + + + + + + + + + + + + +
+ + + + + + . + + + + + + + + + + + + + . - - - -
- - . - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - . + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + . + + + +
+ + + + + + + + + + + + + + + + + + + + + . + + .
+ + + + + + + + . - - - - - - . + + + + + + + + +
+ + + + . - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - + + + + + + + + - - - - - - - -
=================================================
A bilingual JAPH. Valid code in Perl & brainf***!

Siehe auch

Einzelnachweise

  1. Ausführliche Erklärung zum vorletzten Beispiel (englisch)
  2. Kurze Erläuterung zum letzten Beispiel (englisch)