21
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 ......这个,没办法。

4

2 回答 2

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, t。:)

只是为了好玩,几年前我写了这个著名的japhs的扩展:

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

打印真正的™</sup> 字符串"Just another Perl hacker,\n"

这是一个包含德语圣诞问候的较小版本:

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
于 2013-01-21T14:30:45.687 回答
12

这个 JAPH 的第一次出现似乎是在http://www.perlmonks.org/?node_id=290607

正如 PerlMonks 线程所述,现在有一个自动工具可以进行这种混淆: http: //namazu.org/~takesako/ppencode/

你可以阅读它的源代码,但是逆向工程更有趣:)

例如,这是打印空格的代码:

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

于 2013-01-21T14:56:39.823 回答