这种混乱的Perl是如何工作的? #/bin/perl 严格使用; 使用警告; my($japh,$q,$qq,%b)=“只是另一个Perl黑客\n”; $\uux=加入“”( 07625127776, 0122456410, 03441733416, 01420121552, 04373570104, 07143446334);s#9#f##s#f#9#s;; s} 9}b}$q=$\uu0*9= 潜艇{ $japh=“”; 打印$japh; }; 地图{/^((?i)(?#q#); 打印$japh;#()[^ 对于(my$(b)=1;$(b)({}); }量子阱( a b c d e f g h i j k l m n o p q r s t u v w x y z );$qq=[$q,%b];$\=包装q*h\** ,qq$$.$$qq[0];9->();
我认为很多都是额外的/纯粹的混淆。我知道我们将“仅仅是另一个Perl黑客”分配给$japh,然后我们打印它,但在我们这样做之前,我们将它分配给“”,我不知道它是如何工作的。有人能解释一下这里发生了什么吗?谢谢!步骤№ 1要理解混淆的Perl:通过这种混乱的Perl是如何工作的? #/bin/perl 严格使用; 使用警告; my($japh,$q,$qq,%b)=“只是另一个Perl黑客\n”; $\uux=加入“”( 07625127776, 0122456410, 03441733416, 01420121552, 04373570104, 07143446334);s#9#f##s#f#9#s;; s} 9}b}$q=$\uu0*9= 潜艇{ $japh=“”; 打印$japh; }; 地图{/^((?i)(?#q#); 打印$japh;#()[^ 对于(my$(b)=1;$(b)({}); }量子阱( a b c d e f g h i j k l m n o p q r s t u v w x y z );$qq=[$q,%b];$\=包装q*h\** ,qq$$.$$qq[0];9->();,perl,Perl,我认为很多都是额外的/纯粹的混淆。我知道我们将“仅仅是另一个Perl黑客”分配给$japh,然后我们打印它,但在我们这样做之前,我们将它分配给“”,我不知道它是如何工作的。有人能解释一下这里发生了什么吗?谢谢!步骤№ 1要理解混淆的Perl:通过-MO=Deparse运行它 及 在这里,它们相当于[^bfgmoqry]和[\[\]()^.}\s],但由于正则表达式将只与单个字符匹配,[…]*将匹配零个字符 因此,正则表达式相当于 [\](^.^)\[ } ] 在
-MO=Deparse
运行它
及
在这里,它们相当于[^bfgmoqry]
和[\[\]()^.}\s]
,但由于正则表达式将只与单个字符匹配,[…]*
将匹配零个字符
因此,正则表达式相当于
[\](^.^)\[
}
]
在这种特殊情况下(与“a”.“z”
匹配)
*9=sub{…}
将一个coderef分配给一个glob。因为9
不是有效的子例程名称,但仍然可以与->
操作符一起使用,9->()
调用该coderef。这与sub-foo{…}
一样,foo()
和“foo-->
是同一回事
字符a
被编码为十进制97
为ASCII,因此ord(“a”)-96
是1
,对于z
,应该是26
$?
是最后一个子错误,应该为零。$+
是最后一个捕获组的值(因此,$\ucode>)。~~%b
对空哈希进行双反运算。空哈希的比例化为0
,因此双位反运算再次生成零
$/=$+;$q=~s[$qq][$/]g
只是有点模糊;因为$+
是$\ucode>,我们可以直接编写$q=~s/$qq/$\ug
$qq=[$q,%b];…$$qq[0]
是蹩脚的,一个$\=pack('h*,$q)
就足够了
在9
sub中,将打印空字符串,然后是$\
,设置为空字符串,直到倒数第二行。删除此级别的间接寻址、任何现在未使用的变量以及简单替换,我们得到:
m/^([^bfgmoqry])$/
s/${qq}0/$\ug
替换只能在零处匹配,我们知道输出将是pack
的一些十六进制数。匹配的可能位置为:
use warnings;
use strict;
my $q = '1045737470216506f6478656270205562730602861636b65627100';
for ("a" .. "z") {
m/^([^bfgmoqry])$/ or next;
my $qq = ord($_) - 96;
$q =~ s/${qq}0/$_/g;
}
print pack('h*', $q);
其中b,f,g
由于正则表达式而被禁止。生成的字符串为
1045737470216506f6478656270205562730602861636b65627100
*^ *^ *^ *^*^ *^*^ *^^
a g e g b c f a
它解码到JAPH。整洁,因此正确地突出显示了m/
运算符。它在哪里被混淆?
[\](^.^)\[
}
]
m/^([^bfgmoqry])$/
use warnings;
use strict;
my $q = '1045737470216506f6478656270205562730602861636b65627100';
for ("a" .. "z") {
m/^([^bfgmoqry])$/ or next;
my $qq = ord($_) - 96;
$q =~ s/${qq}0/$_/g;
}
print pack('h*', $q);
1045737470216506f6478656270205562730602861636b65627100
*^ *^ *^ *^*^ *^*^ *^^
a g e g b c f a
a45737470216e6f64786562702055627c602861636b65627a0