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
Run Code Online (Sandbox Code Playgroud)
像任何其他JAPH一样,这打印出"只是另一个perl黑客".但是我想对这个特殊的JAPH正在利用什么行为进行半详细的剖析 - 我不擅长Perl,但是我可以通读一些JAPH ......这个,没办法.
mem*_*owe 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
Run Code Online (Sandbox Code Playgroud)
需要注意的是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
Run Code Online (Sandbox Code Playgroud)
打印real ™字符串"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
Run Code Online (Sandbox Code Playgroud)
cre*_*ive 11
这个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:~$
Run Code Online (Sandbox Code Playgroud)
这是打印''字符的唯一方法吗?实际上,不,令人耳目一新的产生:
stas@bp0907:~$ perl -e 'oct oct hex ord q else and print chr ord q q q'
stas@bp0907:~$
Run Code Online (Sandbox Code Playgroud)
很酷,两种变体都以同样的方式结束and print chr ord q q ....所以在此之前的一切都必须评估到真正的价值,只有尘埃落定.
然后,print chr ord可以简化为仅print在该上下文中,因为chr(ord($str))只选择第一个字符$str.所以归结为:
stas@bp0907:~$ perl -e 'print q q eq'
stas@bp0907:~$
Run Code Online (Sandbox Code Playgroud)
q q eq是一个不寻常的q报价表示,它更容易被认为是q ( e).相同的逻辑适用于原始的,甚至更混淆的JAPH:print chr ord
for qw y ... y将在y字符之间选取所有内容并以空格分隔为数组.
有一个相关的主题,涉及形状为ASCII艺术的Perl代码.还有一个CPAN模块:Acme :: EyeDrops