这段Perl代码是如何工作的?

9
我找到了这个Perl程序:
''=~('(?{'.(']])@+}'^'-/@._]').'"'.('/<[*-_<+>?}{>]@}+@}]])@+}@<[*-_<+>?}{>]@^'^'`^=_^<]_[[]+[/,]_/]-/@._]/^=_^<]_[[]+[/,|').',$/})')

它打印出"Obfuscated Perl to print obfuscated Perl"

我想知道它是如何实际打印出这个的。

1个回答

10

它很好地利用了按位字符串异或运算符 ^

']])@+}' ^ '-/@._]'

评估为print

'/<[*-_<+>?}{>]@}+@}]])@+}@<[*-_<+>?}{>]@^' 
    ^ '`^=_^<]_[[]+[/,]_/]-/@._]/^=_^<]_[[]+[/,|'

评估为混淆的 Perl 代码用于打印混淆的 Perl 代码",整个程序简化为

$ perl -MO=Deparse ...
'' =~ m[(?{print "Obfuscated Perl to print obfuscated Perl",$/})];
... syntax OK

相关:Acme::EyeDrops


我还是不太明白它是如何工作的 :( 如果您能为 ']])@+}' ^ '-/@._]' 添加详细的解释,那就太好了。 - Umair Ayub
请点击链接。第一个字符串中每个字符的序数值与第二个字符串中相应字符的序数值进行异或运算,并转换回字符。ord("]") 是93,ord("-") 是45,93 xor 45 等于112。chr(112)p - mob
1
请注意,在5.24及更高版本中,您需要使用use re 'eval'; - Sinan Ünür

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接