我正在尝试反混淆以下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 );
使用$;
将哈希键连接起来,用于模拟多维数组的下标分隔符。文档中说默认值为"\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]{4})
匹配,就执行while块中的代码。但由于我不完全理解$p
的结构,所以我也很难理解这里发生了什么。next if $j++ % 96 >= 16;
如果
$j
取模 96 的结果大于等于16,则继续执行。在 while 循环中,$j
每次递增。$c = 0;
foreach $d ( 0 .. 3 ) {
$c += $a{ substr $1, $d, 1 } * 4**$d;
}
对于范围从0
到3
的$d
,提取一些子字符串,但是此时我完全迷失了。最后几行将所有内容连接起来并评估结果。
eval
执行的混淆字符串代码时,你应该始终小心谨慎。我在stackoverflow上看到过一个狡猾的问题,其中最后使用eval
执行的字符串实际上是"rm -rf /"
。请注意保护自己免受此类攻击。 - TLP