„Just another Perl hacker“ – Versionsunterschied
[ungesichtete Version] | [gesichtete Version] |
KKeine Bearbeitungszusammenfassung |
Aka (Diskussion | Beiträge) K →Beispiele: https |
||
(57 dazwischenliegende Versionen von 35 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
'''Just another Perl hacker''' (abgekürzt '''JAPH''') steht für ein in der [[Programmiersprache]] [[Perl (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. |
|||
Ein [[Perl]]-[[Computerprogramm|Programm]], das "Just another Perl hacker" ausgibt, wobei der [[Programmcode]] meistens so verunstaltet wurde, dass man diese Funktion dem Quellcode nicht sofort ansieht. Dazu werden oft, ganz im Sinne des [[International Obfuscated C Code Contest]]s, ansonsten selten verwendete Funktionen, Variablen oder Verhaltensweisen (wie das Aufrufen einer Funktion ohne Parameter oder das Verwenden von Sonderzeichen in Variabelnamen) genutzt. |
|||
== Methodik der Verschleierung == |
|||
Die Verschleierung der Funktion kann beispielsweise durch scheinbaren Datenmüll geschehen: |
|||
Zum Zweck der Verschleierung ({{enS|obfuscation}}) wird der [[Quelltext|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 == |
|||
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//; |
|||
Die „Programmierdisziplin“ JAPH wurde vermutlich Anfang der 1990er Jahre durch [[Randal L. Schwartz]] begründet, der bei [[Posting]]s in die [[Newsgroup]] „comp.lang.perl“ (Vorgänger der heutigen Newsgroup „comp.lang.perl.misc“) immer ein JAPH in seine ''[[Signatur (E-Mails und Postings)|Signature]]'' integrierte. Auch heute noch werden JAPHs entweder im Rahmen von [[Programmierwettbewerb]]en (z. B. dem [[Obfuscated Perl Contest]]) entwickelt, oder ''just for fun'' – als kreative Fingerübung der Perl-Programmierer. |
|||
== Beispiele == |
|||
aber auch durch Einbinden von "Just another Perl hacker" in sehr undurchsichtigen Code: |
|||
Ein Perl-Programm für die Ausgabe von „Just another Perl hacker“ sähe normalerweise so aus: |
|||
<syntaxhighlight lang="perl">print "Just another Perl hacker";</syntaxhighlight> |
|||
Verschleierung (''Obfuscation'') kann beispielsweise erreicht werden durch Einbinden dieser – an sich verständlichen – Anweisung in undurchsichtigen und funktionslosen Code: |
|||
oder auch einfach nur dadurch, dass das Programm aussieht, als würde es etwas ganz anderes und simples tun, unabhängig von der Ausgabe des Satzes "Just another Perl hacker". |
|||
<syntaxhighlight lang="perl">$_='987;s/^(\d+)/$1-1/e;$1?eval:print"Just another Perl hacker"';eval;</syntaxhighlight> |
|||
$_ = "wftedskaebjgdpjgidbsmnjgc"; |
|||
tr/a-z/oh, turtleneck Phrase Jar!/; print; |
|||
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: |
|||
oder aber auch dadurch, dass ausschließlich Perl-[[Schlüsselwort (Informatik)|Schlüsselwörter]] verwendet werden: |
|||
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 |
|||
<syntaxhighlight lang="perl">$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;</syntaxhighlight> |
|||
Die "Just another Perl hacker"-Programme wurden anfangs vor allem dadurch bekannt, dass [[Randal L. Schwartz]] bei [[Posting]]s in die [[Newsgroup]] comp.lang.perl (dem Vorgänger der heutigen Newsgroup comp.lang.perl.misc) immer welche in seiner [[Signature]] hatte. |
|||
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: |
|||
== Weblinks == |
|||
<syntaxhighlight lang="perl">$_ = "wftedskaebjgdpjgidbsmnjgc"; |
|||
* [http://www-128.ibm.com/developerworks/linux/library/l-japh.html Cultured Perl: The Elegance of JAPH] |
|||
tr/a-z/oh, turtleneck Phrase Jar!/; print;</syntaxhighlight> |
|||
* [http://www.perl.com/CPAN/misc/japh Eine Sammlung von JAPHs auf perl.com] |
|||
---- |
|||
Das folgende, nur unter [[Unix]] lauffähige JAPH-Programm von Eric Roode besteht ''ausschließlich'' aus Sonderzeichen; [[alphanumerische Zeichen]] und [[Leerraum]] fehlen gänzlich. |
|||
Der englischsprachige Artikel, auf dem dieser Artikel basiert, enthält beziehungsweise enthielt Material aus dem [[FOLDOC]]-Eintrag zu '''japh'''. |
|||
<syntaxhighlight lang="perl">`$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=( |
|||
$!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;$.++;$.++; |
|||
$_++;$_++;($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);$,++ |
|||
;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;$\$"$^$~$*.>&$=`</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>[https://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{ |
|||
@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</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“. 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>[https://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! |
|||
================================================= |
|||
+ + + + + + + + + + + + + + + + + + + + + + + + + |
|||
+ + + + + + + + + + + + + + + + + + + + + + + + + |
|||
+ + + + + + + + + + + + + + + + + + + + + + + + . |
|||
+ + + + + + + + + + + + + + + + + + + + + + + + + |
|||
+ + + + + + + + + + + + + + + + + + . - - . + . - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - . + + + + + + + + + + + + + + + + |
|||
+ + + + + + + + + + + + + + + + + + + + + + + + + |
|||
+ + + + + + + + + + + + + + + + + + + + + + + + . |
|||
+ + + + + + + + + + + + + . + . + + + + + . - - - |
|||
- - - - - - - - - . - - - . + + + + + + + + + + + |
|||
+ + . - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - . + + + + + + + + + + + + + + |
|||
+ + + + + + + + + + + + + + + + + + + + + + + + + |
|||
+ + + + + + + + + . + + + + + + + + + + + + + + + |
|||
+ + + + + + . + + + + + + + + + + + + + . - - - - |
|||
- - . - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - . + + + + + + + + + + + + + + + + + + + + |
|||
+ + + + + + + + + + + + + + + + + + + + . + + + + |
|||
+ + + + + + + + + + + + + + + + + + + + + . + + . |
|||
+ + + + + + + + . - - - - - - . + + + + + + + + + |
|||
+ + + + . - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - - - - - - - - - - - - - - - - - |
|||
- - - - - - - - - + + + + + + + + - - - - - - - - |
|||
================================================= |
|||
A bilingual JAPH. Valid code in Perl & brainf***!</syntaxhighlight> |
|||
== Siehe auch == |
|||
* [[Obfuscated Perl Contest]] |
|||
* [[Obfuskation (Software)|Obfuscator]] – Hilfsmittel zur Verschleierung von Programmen |
|||
== Weblinks == |
|||
* Teodor Zlatanov: {{Webarchiv|url=http://www-128.ibm.com/developerworks/linux/library/l-japh.html |wayback=20070208125018 |text=''Cultured Perl: The Elegance of JAPH''}}. In: ''ibm.com'', 1. Juli 2001 (englisch). |
|||
* [https://www.cpan.org/misc/japh Eine Sammlung von 224 JAPHs] (englisch). |
|||
== Einzelnachweise == |
|||
[[Kategorie:Programmiersprache Perl]] |
|||
<references /> |
|||
[[Kategorie:Hacker]] |
|||
[[Kategorie:Perl (Programmiersprache)]] |
|||
[[pl:Just another Perl hacker]] |
|||
[[en:Just another Perl hacker]] |
Aktuelle Version vom 12. April 2023, 14:37 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
[Bearbeiten | Quelltext bearbeiten]Zum Zweck der Verschleierung (englisch 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
[Bearbeiten | Quelltext bearbeiten]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. 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
[Bearbeiten | Quelltext bearbeiten]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
[Bearbeiten | Quelltext bearbeiten]- Obfuscated Perl Contest
- Obfuscator – Hilfsmittel zur Verschleierung von Programmen
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Teodor Zlatanov: Cultured Perl: The Elegance of JAPH ( vom 8. Februar 2007 im Internet Archive). In: ibm.com, 1. Juli 2001 (englisch).
- Eine Sammlung von 224 JAPHs (englisch).
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ Ausführliche Erklärung zum vorletzten Beispiel (englisch)
- ↑ Kurze Erläuterung zum letzten Beispiel (englisch)