Tôi đang cố gắng để deobfuscate đoạn mã sau Perl (source):Làm thế nào để đúng deobfusacte một kịch bản 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;
Khi chạy, nó in ra Just another genome hacker.
Sau khi chạy mã máng Deparse
và perltidy
(perl -MO=Deparse jagh.pl | perltidy
) mã trông như thế này :
(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;
}
Đây là những gì tôi có thể tự giải mã.
(my $d =
"AA...GCTCACA\n" # snipped double helix part
) =~ s/\s+//g;
xóa tất cả khoảng trắng trong $d
(xoắn kép).
(%a) = map({ chr $_, $i++; } 65, 84, 67, 71);
làm cho một băm với như phím A
, T
, C
và G
và như đánh giá cao 0
, 1
, 2
và 3
. Tôi thường viết bằng Python, do đó, dịch này sang từ điển {'A': 0, 'B': 1, 'C': 2, 'D': 3}
bằng Python.
$p = join($;, keys %a);
tham gia các khóa của hàm băm với $;
subscript separator for multidimensional array emulation. Các tài liệu nói rằng mặc định là "\ 034", giống như SUBSEP trong awk, nhưng khi tôi làm:
my @ascii = unpack("C*", $p);
print @ascii[1];
tôi nhận được giá trị 28
? Ngoài ra, nó không phải là rõ ràng với tôi như thế nào này mô phỏng một mảng đa chiều. Có phải $p
hiện có dạng như [['A'], ['T'], ['C'], ['G']]
bằng Python không?
while ($d =~ /([$p]{4})/g) {
Chừng nào $d
trận , thực thi mã trong khối thời gian. nhưng vì tôi không hoàn toàn hiểu cấu trúc $p
là, tôi cũng có một thời gian khó hiểu những gì xảy ra ở đây.
next if $j++ % 96 >= 16;
Tiếp tục nếu các $j
modulo 96 là lớn hơn hoặc bằng 16. $j
increments với mỗi đường đi qua của vòng lặp while (?).
$c = 0;
foreach $d (0 .. 3) {
$c += $a{ substr $1, $d, 1 } * 4**$d;
}
Đối $d
trong khoảng 0
-3
trích xuất một số chuỗi con, nhưng vào thời điểm này tôi hoàn toàn bị mất. Một vài dòng cuối cùng nối tất cả mọi thứ và đánh giá kết quả.
Câu hỏi thú vị. – Rayfleck
Bạn nên luôn luôn cẩn thận về mã mà 'eval' obfuscated chuỗi. Tôi đã nhìn thấy một câu hỏi quanh co ở đây trên stackoverflow mà kết thúc với một eval của một chuỗi mà hóa ra là "" rm-rf/"'. – TLP
Nhắc tôi về [Acme :: EyeDrops] (http://p3rl.org/Acme::EyeDrops). –