Я пытаюсь деобфусцировать следующий код 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, поэтому это переводит словарь {'A': 0, 'B': 1, 'C': 2, 'D': 3}
на Python.
$p = join( $;, keys %a );
соединяет ключи хэша с $;
разделителем индекса для эмуляции многомерного массива ,В документации сказано, что по умолчанию используется значение «\ 034», то же самое, что SUBSEP в awk, но когда я делаю:
my @ascii = unpack("C*", $p);
print @ascii[1];
, я получаю значение 28
?Кроме того, мне не ясно, как это эмулирует многомерный массив.* * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *1043* Python * * * *1043* * * * * * * * *
* * * * * * * *1043* * * * * *1045*, пока $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
извлекаем некоторую подстроку, но на этом этапе I 'Я полностью потерян.Последние несколько строк объединяют все и оценивают результат.