次の Perl コード ( source )の難読化を解除しようとしています:
#!/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 );
多次元配列エミュレーションのために、ハッシュのキーを添え字セパレータと結合し$;
ます。ドキュメントには、デフォルトはawkのSUBSEPと同じ「\ 034」であると書かれていますが、そうすると:
my @ascii = unpack("C*", $p);
print @ascii[1];
私は値を取得します28
か?また、これが多次元配列をどのようにエミュレートするかは明確ではありません。Python$p
のようなものになりましたか?[['A'], ['T'], ['C'], ['G']]
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;
}
$d
からの範囲でいくつかの部分文字列0
を3
抽出しますが、この時点で私は完全に迷っています。最後の数行はすべてを連結し、結果を評価します。