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
与任何其他JAPH一样,这打印出“只是另一个perl黑客”。但是我想对这个JAPH正在利用的行为进行半详细的剖析 - 我对Perl并不擅长,但我可以通读一些JAPH ......不,不行。
答案 0 :(得分:17)
一旦你理解了基础知识,真的不是那么难。以下是一些可以帮助您入门的提示:
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
请注意,字符串的chr ord
会返回第一个字符,而最后的join use sub tied
会有第一个字符j
,u
,s
,{{ 1}}。 :)
为了好玩,几年前我写了这个着名的日本的延伸:
t
打印真实的™字符串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
。
这是一个较小的版本,包含德国圣诞节问候语:
"Just another Perl hacker,\n"
答案 1 :(得分:11)
此JAPH的第一次出现似乎在http://www.perlmonks.org/?node_id=290607
正如PerlMonks线程所述,现在有一个自动工具可以进行这种混淆:http://namazu.org/~takesako/ppencode/
您可以阅读它source code,但逆向工程更加有趣:)
例如,这是打印空格的代码:
stas@bp0907:~$ perl -e 'length q chmod lc and print chr ord q q eq'
stas@bp0907:~$
这是打印''字符的唯一方法吗?实际上,不,令人耳目一新的产生:
stas@bp0907:~$ perl -e 'oct oct hex ord q else and print chr ord q q q'
stas@bp0907:~$
很酷,两种变体都以同一and print chr ord q q ...
结尾。因此,在此之前的一切必须评估为真正的价值,并且只会让我们的眼睛灰白。
然后,print chr ord
可以在该上下文中简化为print
,因为chr(ord($str))
仅选择$str
中的第一个字符。所以归结为:
stas@bp0907:~$ perl -e 'print q q eq'
stas@bp0907:~$
q q eq
是q
引用的不寻常表示,更容易识别为q ( e)
。相同的逻辑适用于原始的,甚至更混淆的JAPH:print chr ord
for qw y ... y
将选择y
个字符之间的所有内容,并以空格分隔为数组。
有一个相关主题,它涉及形状为ASCII艺术的Perl代码。还有一个CPAN模块:Acme::EyeDrops