deobfuscating Perl kodu
Aşağıdaki Perl kodu (source) deobfuscate için çalışıyorum:
#!/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 –>=16;$c=0;for$d(0..3){$c =
$a{substr($1,$d,1)}*(4**$d)}$perl.=chr $c}
eval $perl;
Çalıştırmak, Just another genome hacker.
yazdırır
Kod yalak Deparse
perltidy
(perl -MO=Deparse jagh.pl | perltidy
) çalıştırdıktan sonra kodu bu gibi görünüyor:
( 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;
}
Kendim çözmeyi başardım.
( my $d =
"AA...GCTCACA\n" # snipped double helix part
) =~ s/\s //g;
tüm $d
(çift sarmal) boşluk kaldırır.
(%a) = map( { chr $_, $i ; } 65, 84, 67, 71 );
tuşları ile bir karma yapar, *, *27A
T
ve G
gibi, *, *310
1
ve 3
deÄŸerleri.
Ben bu Python için {'A': 0, 'B': 1, 'C': 2, 'D': 3}
bir sözlük çevirir yani normalde Python kodu.
$p = join( $;, keys %a );
$;
subscript separator for multidimensional array emulation ile karma anahtarları katıldı. Belgelere varsayılan olduğunu söylüyor "\034 ben ne zaman", SUBSEP aynı awk, ama:
my @ascii = unpack("C*", $p);
print @ascii[1];
37 ** değer miyim? Ayrıca, bu çok boyutlu bir dizi taklit nasıl benim için açık değil. $p
Python [['A'], ['T'], ['C'], ['G']]
gibi bir ÅŸey mi?
while ( $d =~ /([$p]{4})/g ) {
$d
eşleştiği sürece ([$p]{4})
, while bloğu içinde kod yürütmesine. ama tamamen $p
ne anlamıyorum beri, ben de zor zamanlar burada neler olduğunun anlaşılması.
next if $j % 96 >= 16;
EÄŸer $j
Bu modül 96 16 büyük veya eşit ise devam ediyor. While döngüsünün her geçişte $j
aralıklarla (?).
$c = 0;
foreach $d ( 0 .. 3 ) {
$c = $a{ substr $1, $d, 1 } * 4**$d;
}
3
0
deÄŸiÅŸen $d
için bazı dize ayıklamak, ama bu noktada kafam karıştı. Son birkaç satır her şeyi bağlamak ve sonucu değerlendirir.
CEVAP
Dikkat: eğer olursa orada körü körüne karıştırılmış perl, özellikle eval
, backticks, system
, open
, vb. bir çalışma yok bir yere çağırve bunu çok açık olmayabilir*. De-kafamı allak bullak Deparse
ile ve dikkatle print ifadeleri eval
s yerine a kadar neler olduğunu anlamak gerekir. Normal bir kullanıcı bir VM/kum/çalışan çok dikkat edilmelidir.
s&&$_ⅇ
intance için $_
deÄŸerlendirir.
İlk gözlem: 034
sekizli. 28 eşit (dec) veya 0x1c (hex), yani şüpheli bir durum var.
$;
şey tamamen şaşırtmaca olduğunu, özellikle bunu kullanmak için bir neden bulamıyorum. $p
sadece bir dize A.T.C.G
.
her neyse $;
, yerine () olacaktır.
Normal ifade [$p]
{'A', 'T', 'C', 'G', $;}
herhangi biriyle eÅŸleÅŸir. $;
$d
, zira iÅŸe yaramaz.
Sırayla [$p]{4}
eÄŸer bu iÅŸe yaramaz $;
görmezden) kullanılmış olsaydı, yukarıdaki kümesinde dört harf dizisi ile eşleşir:
while ( $d =~ /([ATCG]{4})/g ) { ... }
Eğer bu kendini, boşluk edildikten sonra, yazmak için olsaydı, sadece uzunluğu dört $d
($d
baÅŸka karakter yok varsayarak) birbirini izleyen her dize kapmak istiyorum.
Şimdi bu bölüm eğlenceli
foreach $d ( 0 .. 3 ) {
$c = $a{ substr $1, $d, 1 } * 4**$d;
}
$1
mevcut dört harfli bir codepoint tutar.substr $1, $d, 1
codepoint itibaren birbirini izleyen her bir mektup verir.%a
haritalar 77* *01b,C
10b veG
11b etmek için 00b (ikili),T
.A 00 T 01 C 10 G 11
4**$d
ile çarparak 0, 2, 4 ve 6 bit düzeyinde sola kayma eşit olacaktır.
Bu çok komik inşa basamak olarak ATCG
taban dört sistem içinde herhangi bir 8bit değer inşa eder!
yani aşağıdaki dönüşüm yapıyor
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
Bu kısmı:
next if $j % 96 >= 16;
yukarıdaki dönüşüm sadece ilk 16 için çalışma"", atlar sonraki 80, bir sonraki için dönüştürür 16, sonraki 80, vb atlar. codepoints yapar Aslında sadece elips parçaları (hurda DNA temizleme sistemi) atlar.
Burada bir şey helix yerine üretmek için kullanabileceğiniz DNA dönüştürücü çirkin bir metin (80 atlama şeyi ele vermez):
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
sopa yerine sarmal (ve kod çözücü atlama bölümü kaldırın).
Nasıl stderr stdout ve çıkış kodu bir ...
Ne ":-!!&"C kodu?...
İzin heroku kodu dağıtırken (açık anah...
Nasıl HTML kodu Sublime Text 2 kullana...
Ä°thalat mevcut kaynak kodu Github...