Как правильно деобфускировать скрипт Perl?

Я пытаюсь деобфускировать следующий код 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;

При запуске выводится Еще один геномный хакер.

После запуска кода 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 keys 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 ? Кроме того, мне непонятно, как это имитирует многомерный массив. $ 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;
}

Для $ d в диапазоне от 0 до 3 извлеките некоторую подстроку, но на этом этапе я полностью потерялся. Последние несколько строк объединяют все и оценивают результат.

55
задан Braiam 16 January 2016 в 08:48
поделиться