PDA

Просмотр полной версии : Раскодировка Perl-скриптов


Digimortal
13.10.2007, 01:02
меня уже два человека на этом форуме просили, чтоб я в подобростях рассказал, как можно раскодировать закодированный PERL-скрипт.. ок, опишу в мельчайших подробностях этот процесс (на примере DirectMailer)..

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

открыв файл dm.cgi, можно наблюдать примерно следущую картину:
#!/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 :my $vrm9Hox30068MVCy0;
2. в нее заносится весь текст скрипта, расположенный ниже __DATA__:$vrm9Hox30068MVCy0.=$_ while(<DATA>)
3. содержимое переменной $vrm9Hox30068MVCy0, предаставляющее собой текст в кодировке uuencode (http://en.wikipedia.org/wiki/Uuencode), раскодируется с помощью функции unpack с шаблоном 'u*', а затем выполняется с помощью eval. Таким образом, функции eval передается уже раскодированный текст скрипта, а значит, заменив eval на print и запустив скрипт в интерепретаторе, мы получим вывод раскодированного текста скрипта:eval(unpack('u*',$vrm9Hox30068MVCy0 ));меняем наprint(unpack('u*',$vrm9Hox30068MVCy0));
затем запускаем перенаправляя вывод в файл dm2.txt:perl dm.cgi > dm2.txt

открываем dm2.txt и видим в нем следущее:
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, в пятой это не обязательно).. т.о. unpack('u*',&vSHmKML81)
распаковывает возвращаемое функцией vSHmKML81 значение (а возвращает эта функция значение переменной $vSHmKML81)..
опять же, меняем eval на print, а вот вызываемую далее функцию _vm3jA0q6S02 закомментим, т.к. она содержится в покодированном куске скрипта:
}print(unpack('u*',&vSHmKML81)); ## &_vm3jA0q6S02;
запускаем:perl dm2.txt > dm3.txt

dm3.txt практически идентичен dm2.txt:
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 :
} print(unpack('u*',&vm3jA0q6S02)); ## &_vYhyJlg5Ch3;
запускаем, перенаправив вывод в dm4.txt..

аналогично в dm4.txt меняем }sub _vYhyJlg5Ch3 {eval(unpack('u*',&vYhyJlg5Ch3));}на
} print(unpack('u*',&vYhyJlg5Ch3));

в dm5.txt мы уже будем наблюдать исходный код скрипта, причем даже не обфусцированный..

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

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

p.p.p.s ссылки на directmailer можно найти в этой темке : http://forum.antichat.ru/thread49975.html

KSURi
13.10.2007, 01:26
Кажется я уже выкладывал dm расшифрованный...

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