Раскодировка Perl-скриптов

Discussion in 'PHP' started by Digimortal, 13 Oct 2007.

  1. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    меня уже два человека на этом форуме просили, чтоб я в подобростях рассказал, как можно раскодировать закодированный PERL-скрипт.. ок, опишу в мельчайших подробностях этот процесс (на примере DirectMailer)..

    на самом деле, обычно раскодировка скриптов не представляет особой сложности.. достаточно иметь под рукой справочник по языку (если вы им не владеете), чтоб добраться до исходного кода.. итак, начнем.. : )

    открыв файл dm.cgi, можно наблюдать примерно следущую картину:
    Code:
    #!/usr/bin/perl
    my $vrm9Hox30068MVCy0;$vrm9Hox30068MVCy0.=$_ while(<DATA>);eval(unpack('u*',$vrm9Hox30068MVCy0));
    __DATA__
    M<W5B('932&U+34PX,2![;7D@)'932&U+34PX,3T\/"=V4TAM2TU,.#$G.PI-
    M/%<U0B@G.4TL5DDA+"<D5C138%(H)TU-/C)@1#U&5%,Z1"10/#,Y,RPC*%TO
    
    	... и т.д. ...
    что делает данный код?
    1. объявляется переменная $vrm9Hox30068MVCy0 :
    Code:
    my $vrm9Hox30068MVCy0;
    2. в нее заносится весь текст скрипта, расположенный ниже __DATA__:
    Code:
    $vrm9Hox30068MVCy0.=$_ while(<DATA>)
    3. содержимое переменной $vrm9Hox30068MVCy0, предаставляющее собой текст в кодировке uuencode (http://en.wikipedia.org/wiki/Uuencode), раскодируется с помощью функции unpack с шаблоном 'u*', а затем выполняется с помощью eval. Таким образом, функции eval передается уже раскодированный текст скрипта, а значит, заменив eval на print и запустив скрипт в интерепретаторе, мы получим вывод раскодированного текста скрипта:
    Code:
    eval(unpack('u*',$vrm9Hox30068MVCy0));
    меняем на
    Code:
    print(unpack('u*',$vrm9Hox30068MVCy0));
    затем запускаем перенаправляя вывод в файл dm2.txt:
    Code:
    perl dm.cgi > dm2.txt
    открываем dm2.txt и видим в нем следущее:
    Code:
    sub vSHmKML81 {my $vSHmKML81=<<'vSHmKML81';
    M<W5B('9M,VI!,'$V4S`R('MM>2`D=FTS:D$P<393,#(]/#PG=FTS:D$P<393
    M,#(G.PI-/%<U0B@G.3DZ)T4J.R8\53!60%,H)TU-/C)@1#U%14@^-$E,.5,U
    
    		...
    
    M,&!@"G9M,VI!,'$V4S`R"GUS=6(@7W9M,VI!,'$V4S`R('ME=F%L*'5N<&%C
    E:R@G=2HG+"9V;3-J03!Q-E,P,BDI.R9?=EEH>4IL9S5#:#,[?0``
    vSHmKML81
    }eval(unpack('u*',&vSHmKML81));&_vm3jA0q6S02;
    итак, еще одна оберточка.. здесь нас уже пытаются слегка запутать, используя функцию, переменную и метку с одинаковыми именами, типа, элемент обфускации +).. просто нужно знать, что в PERL символ & предшествует вызываемой функции (до 5й версии PERL, в пятой это не обязательно).. т.о.
    Code:
    unpack('u*',&vSHmKML81)
    распаковывает возвращаемое функцией vSHmKML81 значение (а возвращает эта функция значение переменной $vSHmKML81)..
    опять же, меняем eval на print, а вот вызываемую далее функцию _vm3jA0q6S02 закомментим, т.к. она содержится в покодированном куске скрипта:
    Code:
    }print(unpack('u*',&vSHmKML81)); ## &_vm3jA0q6S02;
    запускаем:
    Code:
    perl dm2.txt > dm3.txt
    dm3.txt практически идентичен dm2.txt:
    Code:
    sub vm3jA0q6S02 {my $vm3jA0q6S02=<<'vm3jA0q6S02';
    M<W5B('99:'E*;&<U0V@S('MM>2`D=EEH>4IL9S5#:#,]/#PG=EEH>4IL9S5#
    
    		...
    
    M9S5#:#,*?7-U8B!?=EEH>4IL9S5#:#,@>V5V86PH=6YP86-K*"=U*B<L)G99
    -:'E*;&<U0V@S*2D[?0``
    vm3jA0q6S02
    }sub _vm3jA0q6S02 {eval(unpack('u*',&vm3jA0q6S02));&_vYhyJlg5Ch3;}
    только в конце, eval находится внутри объявления функции _vm3jA0q6S02, вызов которой мы закомментили в dm2.txt.. убираем объявление этой функции и комментим _vYhyJlg5Ch3, не забыв заменить eval на print :
    Code:
    } print(unpack('u*',&vm3jA0q6S02)); ## &_vYhyJlg5Ch3;
    запускаем, перенаправив вывод в dm4.txt..

    аналогично в dm4.txt меняем
    Code:
    }sub _vYhyJlg5Ch3 {eval(unpack('u*',&vYhyJlg5Ch3));}
    на
    Code:
    } print(unpack('u*',&vYhyJlg5Ch3));
    в dm5.txt мы уже будем наблюдать исходный код скрипта, причем даже не обфусцированный..

    p.s. а вот на просьбы занулить этот скрипт и вопросы по поводу места, где там осуществляется проверка - отвечать не буду, ищите сами.. ; )

    p.p.s. если у кого возникнут какие-нить проблемы с раскодировкой скриптов (перл, пхп [тока не зенд], итд) - можете задавать в этой теме вопросы, по мере возможостей постараюсь на них ответить..

    p.p.p.s ссылки на directmailer можно найти в этой темке : /thread49975.html
     
    #1 Digimortal, 13 Oct 2007
    Last edited: 13 Oct 2007
    1 person likes this.
  2. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    Кажется я уже выкладывал dm расшифрованный...

    При хотя-бы небольшом знании языка (всего 2 фукнции: eval, unpack) эта "зашита" снимается за минуту, код в чистом виде даже не обфусцирован =(
    Так что те, кто этого не сделал - просто поленились.
     
    1 person likes this.