Ответ 1
Предостережение: не слепо запускать запутанный perl, особенно если есть eval
, backticks, system
, open
и т.д. вызывать где-то в нем , и это может быть не слишком очевидно *. De-obfuscating с Deparse
и тщательной заменой eval
заявлениями печати является обязательным, пока вы не поймете, что происходит. Следует также учитывать запуск в песочнице/с непривилегированным пользователем/в виртуальной машине.
*s&&$_ⅇ
оценивает $_
для intance.
Первое наблюдение: 034
- восьмеричное. Он равен 28 (dec) или 0x1c (hex), поэтому нет ничего подозрительного.
Вещество $;
является чисто обфускацией, не может найти причины использовать это в частности. $p
будет просто строкой A.T.C.G
(с заменой .
на $;
, что бы это ни было).
Поэтому в regex [$p]
соответствует любой из {'A', 'T', 'C', 'G', $;}
. Поскольку $;
никогда не появляется в $d
, это бесполезно.
В свою очередь, [$p]{4}
соответствует любой последовательности из четырех букв в приведенном выше наборе, как если бы это использовалось (игнорируя бесполезный $;
):
while ( $d =~ /([ATCG]{4})/g ) { ... }
Если вам пришлось написать это самостоятельно, удалив пробел, вы просто возьмете каждую последующую подстроку $d
длиной четыре (при условии, что в $d
нет других символов.)
Теперь эта часть весело:
foreach $d ( 0 .. 3 ) {
$c += $a{ substr $1, $d, 1 } * 4**$d;
}
-
$1
содержит текущий четырехбуквенный код.substr $1, $d, 1
возвращает каждую последовательную букву из этого кодового пункта. -
%a
отображаетA
в 00b (двоичный),T
в 01b,C
в 10b иG
в 11b.A 00 T 01 C 10 G 11
-
умножение на
4**$d
будет эквивалентно побитовому сдвигу влево 0, 2, 4 и 6.
Итак, эта забавная конструкция позволяет вам построить любое значение 8 бит в системе base-four с ATCG
как цифры!
то есть. он выполняет следующие преобразования:
A A A A
AAAA -> 00000000
T A A T
TAAT -> 01000001 -> capital A in ascii
T A A C
CAAT -> 01000010 -> capital B in ascii
CAATTCCTGGCTGTATTTCTTTCTGCCT -> BioGeek
Эта часть:
next if $j++ % 96 >= 16;
делает указанное преобразование выполненным только для первых 16 "кодовых точек", пропускает следующие 80, затем преобразует в течение следующих 16, пропускает следующие 80 и т.д. Он по существу просто пропускает части эллипса (система удаления нежелательной ДНК).
Вот уродливый текст для конвертера ДНК, который вы могли бы использовать для создания чего-либо, чтобы заменить спираль (не обрабатывает вещь 80):
use strict;
use warnings;
my $in = shift;
my %conv = ( 0 => 'A', 1 => 'T', 2 => 'C', 3 => 'G');
for (my $i=0; $i<length($in); $i++) {
my $chr = substr($in, $i, 1);
my $chv = ord($chr);
my $encoded ="";
$encoded .= $conv{($chv >> 0) & 0x3};
$encoded .= $conv{($chv >> 2) & 0x3};
$encoded .= $conv{($chv >> 4) & 0x3};
$encoded .= $conv{($chv >> 6) & 0x3};
print $encoded;
}
print "\n";
$ perl q.pl 'print "BioGeek\n";'
AAGTCAGTTCCTCGCTATGTAACACACACAATTCCTGGCTGTATTTCTTTCTGCCTAGTTCGCTCACAGCGA
Вставьте в $d
, что вместо спирали (и удалите часть пропуска в декодере).