这个着名的JAPH如何运作?

时间:2013-01-21 14:19:24

标签: perl

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 ......不,不行。

2 个答案:

答案 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会有第一个字符jus,{{ 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 eqq引用的不寻常表示,更容易识别为q ( e)。相同的逻辑适用于原始的,甚至更混淆的JAPH:print chr ord for qw y ... y将选择y个字符之间的所有内容,并以空格分隔为数组。


有一个相关主题,它涉及形状为ASCII艺术的Perl代码。还有一个CPAN模块:Acme::EyeDrops