deobfuscating Perl kodu | Netgez.com
SORU
18 ÅžUBAT 2012, CUMARTESÄ°


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, *, *27AT ve G gibi, *, *3101 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
18 ÅžUBAT 2012, CUMARTESÄ°


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 evals 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 ve G 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).

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Press Start

    Press Start

    4 HAZÄ°RAN 2006
  • RobertDuskin

    RobertDuskin

    12 HAZÄ°RAN 2008
  • YEAH1TV

    YEAH1TV

    19 ÅžUBAT 2009