我试图反混淆以下Perl代码(source):如何正确解析Perl脚本?
#!/usr/bin/perl
(my$d=q[AA GTCAGTTCCT
CGCTATGTA ACACACACCA
TTTGTGAGT ATGTAACATA
CTCGCTGGC TATGTCAGAC
AGATTGATC GATCGATAGA
ATGATAGATC GAACGAGTGA
TAGATAGAGT GATAGATAGA
GAGAGA GATAGAACGA
TC GATAGAGAGA
TAGATAGACA G
ATCGAGAGAC AGATA
GAACGACAGA TAGATAGAT
TGAGTGATAG ACTGAGAGAT
AGATAGATTG ATAGATAGAT
AGATAGATAG ACTGATAGAT
AGAGTGATAG ATAGAATGAG
AGATAGACAG ACAGACAGAT
AGATAGACAG AGAGACAGAT
TGATAGATAG ATAGATAGAT
TGATAGATAG AATGATAGAT
AGATTGAGTG ACAGATCGAT
AGAACCTTTCT CAGTAACAGT
CTTTCTCGC TGGCTTGCTT
TCTAA CAACCTTACT
G ACTGCCTTTC
TGAGATAGAT CGA
TAGATAGATA GACAGAC
AGATAGATAG ATAGAATGAC
AGACAGAGAG ACAGAATGAT
CGAGAGACAG ATAGATAGAT
AGAATGATAG ACAGATAGAC
AGATAGATAG ACAGACAGAT
AGACAGACTG ATAGATAGAT
AGATAGATAG AATGACAGAT
CGATTGAATG ACAGATAGAT
CGACAGATAG ATAGACAGAT
AGAGTGATAG ATTGATCGAC
TGATTGATAG ACTGATTGAT
AGACAGATAG AGTGACAGAT
CGACAGA TAGATAGATA
GATA GATAGATAG
ATAGACAGA G
AGATAGATAG ACA
GTCGCAAGTTC GCTCACA
])=~s/\s+//g;%a=map{chr $_=>$i++}65,84,67,
71;$p=join$;,keys%a;while($d=~/([$p]{4})/g
){next if$j++%96>=16;$c=0;for$d(0..3){$c+=
$a{substr($1,$d,1)}*(4**$d)}$perl.=chr $c}
eval $perl;
运行时,它打印出Just another genome hacker.
运行代码低谷Deparse
和perltidy
(perl -MO=Deparse jagh.pl | perltidy
)的代码如下所示后:
(my $d =
"AA...GCTCACA\n" # snipped double helix part
) =~ s/\s+//g;
(%a) = map({ chr $_, $i++; } 65, 84, 67, 71);
$p = join($;, keys %a);
while ($d =~ /([$p]{4})/g) {
next if $j++ % 96 >= 16;
$c = 0;
foreach $d (0 .. 3) {
$c += $a{ substr $1, $d, 1 } * 4**$d;
}
$perl .= chr $c;
}
这是我能够自己破译的。
(my $d =
"AA...GCTCACA\n" # snipped double helix part
) =~ s/\s+//g;
删除$d
(双螺旋)中的所有空白。
(%a) = map({ chr $_, $i++; } 65, 84, 67, 71);
使得散列与作为键A
,T
,C
和G
和作为值0
,1
,2
和3
。 我通常使用Python编码,因此这转换为Python中的字典{'A': 0, 'B': 1, 'C': 2, 'D': 3}
。
$p = join($;, keys %a);
加入与$;
的subscript separator for multidimensional array emulation哈希的键。该文件说,默认是“\ 034”,在AWK一样SUBSEP,但是当我做:
my @ascii = unpack("C*", $p);
print @ascii[1];
我得到的价值28
?此外,我不清楚这是如何模拟多维阵列。现在是$p
在Python中是什么样的[['A'], ['T'], ['C'], ['G']]
?
while ($d =~ /([$p]{4})/g) {
只要$d
比赛,在块而执行该代码。但由于我不完全了解什么结构$p
是,我也很难理解这里发生了什么。
next if $j++ % 96 >= 16;
继续,如果该模$j
96大于或等于16 $j
增量while循环的每次通过(?)。
$c = 0;
foreach $d (0 .. 3) {
$c += $a{ substr $1, $d, 1 } * 4**$d;
}
对于从0
范围$d
到3
提取一些子,但在这一点上,我完全失去了。最后几行连接所有内容并评估结果。
真棒问题。 – Rayfleck 2012-02-18 14:55:16
你应该小心处理'eval'混淆字符串的代码。我在这里看到了一个迂回的问题,它以一个字符串的eval结尾的“rm -rf /”'结尾。 – TLP 2012-02-18 15:00:20
提醒我[Acme :: EyeDrops](http://p3rl.org/Acme::EyeDrops)。 – 2012-02-19 15:13:57