2013-01-21 5 views
19
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 

Wie jede andere JAPH, druckt dies "nur ein weiterer Perl-Hacker". Aber ich hätte gerne eine halb detaillierte Analyse, welches Verhalten diese spezielle JAPH ausnutzt, um zu arbeiten - ich bin nicht gut in Perl, aber einige JAPHs, die ich durchlesen kann ... auf keinen Fall.Wie funktioniert dieser berühmte JAPH?

+11

Beginnen Sie immer mit: http://perldoc.perl.org/B/Deparse.html – toolic

+6

http://www.perlmonks.org/?node_id = 290623 – toolic

+1

@toolic Ah, shofa hat das Dojo überprüft - die Perlmönche haben es wieder gelöst – PinkElephantsOnParade

Antwort

15

Es ist wirklich nicht so schwer, wenn man einmal die Grundlagen verstanden hat. Hier sind einige Hinweise zum Einstieg:

not exp log srand 
     # srand = 1, exp o log = id, not 1 = 0 

     # $_ = undef 
xor s// /x      
     # $_ = ' ' 
xor s//length uc ord and print chr ord for qw q join use sub tied q/ 
     # $_ = ' length uc ord and print chr ord for qw q join use sub tied q' 

xor eval 

Beachten Sie, dass chr ord eine Zeichenfolge zurückgibt das erste Zeichen und join use sub tied am Ende hat die ersten Zeichen j, u, s, t. :)

Just for fun, schrieb ich eine Erweiterung dieses berühmten japhs Jahren:

not srand xor s qq qx xor s x x length uc 
ord and print uc chr ord for qw q join qx 
xor eval xor lc eval qq x abs cos ord and 
print chr ord for qw q use substr tied qx 
xor print qq q q xor int eval lc qq m cos 
and print chr ord for qw y abs ne or tied 
hex exp ref y m xor scalar srand print qq 
q q xor sin abs eval q x log srand ord or 
printf uc chr ord foreach qw q package qx 
xor sqrt eval lc qq y sqrt cos and printf 
chr ord for qw x each return local x y or 
print qq s s and uc exp eval q s undef or 
oct xor time xor ref print chr int ord lc 
for qw y hex alarm chdir kill exec return 
y s xor log exp eval q x print chr length 
join qw y length for map substr chr shift 
y x or sqrt abs ord lc and eval print q q 
q and s q q lcfirst chr eval log shift qx 

die reale Druck ™ String "Just another Perl hacker,\n".

Und dies ist eine kleinere Version einen Deutsch Weihnachtsgruß enthält:

not exp log srand xor s qq qx xor 
s x x length uc ord and print chr 
ord for qw q find redo ord helpme 
eval scalar qx xor eval xor print 
q q q xor int eval lc q m cos and 
print chr ord for qw y flock each 
s tell y m gt sin ref study split 
+0

Ahhh - der Hinweis offenbarte es. Ich sehe jetzt, heh. – PinkElephantsOnParade

11

Der erste Auftritt dieser JAPH auf http://www.perlmonks.org/?node_id=290607

zu sein scheint als die PerlMonks Staaten Thread, jetzt gibt es ein automatisches Werkzeug die diese Art von Verschleierung hat: http://namazu.org/~takesako/ppencode/

Sie können es source code, lesen, aber das Reverse Engineering ist so viel lustiger :)

Zum Beispiel, hier ist der Code ein Leerzeichen zu drucken:

[email protected]:~$ perl -e 'length q chmod lc and print chr ord q q eq' 
[email protected]:~$ 

Ist dies der einzige Weg, um einen ‚‘ Charakter zu drucken? Eigentlich nicht, erfrischend produziert:

[email protected]:~$ perl -e 'oct oct hex ord q else and print chr ord q q q' 
[email protected]:~$ 

Cool, Varianten an beiden Enden auf der gleichen and print chr ord q q .... Also alles, was davor steht, muss zu echtem Wert ausgewertet werden und dient nur dazu, unsere Augen zu verstauben.

Dann kann print chr ord einfach print in diesem Zusammenhang vereinfacht werden, da chr(ord($str)) nur das erste Zeichen von $str nimmt. Also um es läuft darauf hinaus:

[email protected]:~$ perl -e 'print q q eq' 
[email protected]:~$ 

q q eq ist eine ungewöhnliche Darstellung des q Zitat ist es leichter als q (e) anerkannt. Die gleiche Logik funktioniert für die ursprüngliche, noch mehr verschleierte JAPH: print chr ord for qw y ... y wird alles zwischen y Zeichen auswählen und durch Leerzeichen als ein Array getrennt.


Es gibt ein verwandtes Thema, das sich auf Perl-Code bezieht, der wie eine ASCII-Kunst geformt ist. Dazu gibt es auch ein CPAN-Modul: Acme::EyeDrops