JAPH
Thomas
- perl
0 Christian Kruse
moin
kann mir einer dieses schöne japh erklären?
die vielen * verwirren mich ein bisschen :)
$_ = q *4a75737420616e6f74686572205065726c204861636b65720a*;
for ($*=******;$**=******;$**=******) {$**=*******s*..*qq}
print chr 0x$& and q
qq}*excess********}
Hallo Thomas,
kann mir einer dieses schöne japh erklären?
In der Tat, da kennt jemand Perl _sehr_ genau. Cool. Wer ist der
Autor?
$_ = q *4a75737420616e6f74686572205065726c204861636b65720a*;
Hier wird codiert 'Just Another Perl Hacker' gespeichert.
for ($*=******;$**=******;$**=******) {$**=*******s*..*qq}
$*=****** setzt $* auf 1. Bei der Ausfuehrung von $**=****** behaelt
$* den aktuellen Wert. Dann wird mit { der Anfang der Schleife
eingeleitet. Jetzt wirds komplizierter. Die Schleife wird eroeffnet
und es wird $* wieder multipliziert, allerdings unter anderem mit
dem Ergebnis einer Suche-und-Ersetzen-Aktion, die mit dem s
eingeleitet wird. Dabei werden immer zwei Zeichen (..) ersetzt durch
einen durch den Quoting-Operator qq eingeleiteten String. Der
Quoting-Begrenzer ist dabei das Zeichen '}'.
print chr 0x$& and q
qq}*excess********}
Hier wird der String dann fortgesetzt. Der String, der fuer die zwei
Zeichen zusammengesetzt wird, ist etwa so aufgebaut:
print chr 0x<zeichen1><zeichen2> and q
qq
So, und jetzt wird ein netter Trick angewandt: Perl ist relativ
unempfindlich, was das Doppelt-definieren von Modifiern fuer Regexe
angeht. Die Ausnahme bildet das e-Flag. Wird das e-Flag doppelt
genannt, so wird zuerst der Esetzungs-RegEx-Inhalt ausgefuehrt (in diesem Fall das q, was den oben erwaehnten Text ergibt) und fuehrt
dieses Ergebnis dann aus. Das heisst, es wird eine &&-Verknuepfung
mit jeweils zwei der Zeichen gemacht. Das ergibt die Dekodierung zu
dem 'Just another Perl Hacker'. Ich schreibe das ganze mal in einem
verstaendlicheren Code:
$_ = q *4a75737420616e6f74686572205065726c204861636b65720a*;
while(m/(..)/g) {
print "\nq" && chr(eval("0x$1"));
}
Wie gesagt, ziemlich cool gemacht :-)
Grüße,
CK
Hallo Christian,
Wie gesagt, ziemlich cool gemacht :-)
Jow, finde ich auch - coole mucke!
Und vielen Dank für deine Erläuterungen!
Gruss, Rolf
thx vielmals für die gute erklärung.
In der Tat, da kennt jemand Perl _sehr_ genau. Cool. Wer ist der
Autor?
Abigail. hier findest du noch mehr beispiele: http://www.cpan.org/misc/japh
die anderen versteh ich so halbwegs.
ich hab den code auch mal ein bisschen umgeschrieben:
$_ = '4a75737420616e6f74686572205065726c204861636b65720a';
for ($* = 1; $* *= 1; $* *= 1)
{
$* *= 1 * s|..|qq/print chr 0x$& and q qq/|excess * 1
}
aber warum sind 6 * ein 1? hat das was mit einem path zu tun?
Hallo Thomas,
In der Tat, da kennt jemand Perl _sehr_ genau. Cool. Wer ist der
Autor?Abigail.
Ah, haette ich mir denken koennen.
hier findest du noch mehr beispiele: http://www.cpan.org/misc/japh
Jepp, kannte ich schon :-)
ich hab den code auch mal ein bisschen umgeschrieben:
$_ = '4a75737420616e6f74686572205065726c204861636b65720a';
for ($* = 1; $* *= 1; $* *= 1)
{
$* *= 1 * s|..|qq/print chr 0x$& and q qq/|excess * 1
}aber warum sind 6 * ein 1? hat das was mit einem path zu tun?
Nein, das hat was mit etwas ganz anderem zu tun :-) Sorry, hatte
ich vergessen zu erwaehnen.
****** wird vom Tokenizer in einen solchen Baum zerteilt:
**
/ \
* *
| |
* *
Der **-Operator ist der Potenz-Operator. Der * zeigt einen Typeglob
an. Und das Ziel des Typeglobs ist *. ****** ist also das gleiche wie
*main::* ** *main::*
waehrend $* *= ****** das gleiche ist wie
$* *= *main::* ** *main::*
Und damit ist der erste Ausdruck synonym mit $* = 1 und der zweite
Ausdruck synonym mit $* *= 1. Damit duerfte es dir auch Moeglich
sein, den zweiten Ausdruck mit dem s/// zu verstehen und
auszuwerten.
Grüße,
CK
Der **-Operator ist der Potenz-Operator. Der * zeigt einen Typeglob
thx, aber ist noch schwierig zu begreiffen, wenn man nicht weiss was ein typeglob ist. o_O aber die richtung habe ich wenigstens verstanden.
ich seh das schon kommen, ich muss die perl docs doch noch lesen :(