我正在尝试对以下 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 );
使用 as 键A
、和和作为值T
、和进行散列。我通常用 Python 编码,所以这会转化为Python 中的字典。C
G
0
1
2
3
{'A': 0, 'B': 1, 'C': 2, 'D': 3}
$p = join( $;, keys %a );
将散列的键与多维数组仿真$;
的下标分隔符连接起来。文档说默认是“\034”,与 awk 中的 SUBSEP 相同,但是当我这样做时:
my @ascii = unpack("C*", $p);
print @ascii[1];
我得到了价值28
?另外,我不清楚这如何模拟多维数组。现在是$p
像[['A'], ['T'], ['C'], ['G']]
Python 中的东西吗?
while ( $d =~ /([$p]{4})/g ) {
只要$d
匹配([$p]{4})
,就执行 while 块中的代码。但由于我不完全理解结构$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;
}
For$d
在 from 范围内0
提取3
一些子字符串,但在这一点上我完全迷失了。最后几行连接所有内容并评估结果。