Скрипт защиты perl кода от хостеров

Discussion in 'Уязвимости' started by hidden, 15 Jun 2006.

  1. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    В правилах хостинга бывает написано чтоб пользователи не размищяли шэлы, не проверенные - не защищённые скрипты, proxy скрипты, а также файлы, которые могут повредить системе.

    Это значит если я залью шэл, а они его найдут и в лучшем случае они его удалят, а в худшем могут не только распрощаться со своим акаунтом, но неизвестно что ещё.

    Но если админы не понимают, как работает программа, а также она не похожа ни на один из известных шэлов, зничит им и предъявить нечего. Для этого люди разработали скрипты - языки программирования с открытым кодом, это очень облегчило работу админов.

    Но ведь интересно, что же на этом сервере. И тут я решил усложнить их работу вплоть до невозможности. К примеру как вы думаете что делает ниже приведённый скрипт.
    PHP:
    #!/usr/bin/perl
    use MIME::Base64;$data='
    eqt4m4FpjbKcmWqblItprJp/j6mTc6OrmKOjrZ1zcpuEZm6rm3+PpZV1ZGSajnmkiJlzYo2MnWaD
    a3ujiomfqY19bJubmXppdqKDa0GbbIKdlIabo5B+pLJ6qp1qd6KMa5mRgWg8
    '
    ;eval MIME::Base64::decode('
    CigkcGFzcyk9JEVOVnsiSFRUUF9DT09LSUUifT1+L3Bhc3NcPShbXjtdKikvaTskcGw9bGVuZ3Ro
    KCRwYXNzKTskZGF0YT1NSU1FOjpCYXNlNjQ6OmRlY29kZSgkZGF0YSk7CiRkbD1sZW5ndGgoJGRh
    dGEpO2lmKCgkcGw+MCkmJigkcGw8JGRsLzIpKXtteSR4ZHRhO2ZvciRuKDAuLiRkbC0xKXsKJHhk
    dGEuPXBhY2soIkMiLCh1bnBhY2soIkMiLHN1YnN0cigkZGF0YSwkbiwxKSktdW5wYWNrKCJDIixz
    dWJzdHIoJHBhc3MsJG4lJHBsLDEpKSklMjU1KX0KaWYoJHhkdGEhfi9bXDAuLlwuOi4uQFsuLmB7
    Li5ceGZmXSsvKXtldmFsIE1JTUU6OkJhc2U2NDo6ZGVjb2RlKCR4ZHRhKTtleGl0O30KfXByaW50
    ICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cblxuV3JvbmcgcGFzc3dvcmQiO2V4aXQ7
    '
    );
    ну типа ивалируются закомпресированнозабэйсинные данные, а на самом деле это вот такая програмка

    PHP:
    #! /usr/bin/perl
    print "Content-type: text/plain\n\n";
    system('dir');
    exit;
    результат, мы получаем содержимое текущего каталога. На первый взгляд можно сказать остаётся только расшифровать и раздать эти строки как и делает эта программа, допустим они это сделали

    PHP:
    #!/usr/bin/perl
    use MIME::Base64;use Compress::Zlib;$data='
    qc4n4KmDL2lH23sB5wGBQm5hhKZA3X+mYV6GBwdZfqOpAUFq6WSGoUA15UFCiFrUqy1kzz/WV2hD
    tMViPcT1X8fJqWKDbeS88MfCqeHwuTp87tCH50ladC3sdLzwtT9BiZTDneoyTgJYPg==
    '
    ; ($pass)=$ENV{"HTTP_COOKIE"}=~/pass\=([^;]*)/i;$pl=length($pass);$data=MIME::Base64::decode($data);
    $dl=length($data);if(($pl>0)&&($pl<$dl/2)){my$xdta;for$n(0..$dl-1){
    $xdta.=pack("C",(unpack("C",substr($data,$n,1))-unpack("C",substr($pass,$n%$pl,1)))%255)}
    if(
    $xdta!~/[\0..\.:..@[..`{..\xff]+/){eval MIME::Base64::decode($xdta);exit;}
    }print "Content-Type: text/plain\n\nWrong password";exit;
    Вот теперь становиться понятно что для полной расшифровки нам потребуется пароль, но дажэ если он это понял, он ведь ничего не может предявить, тат как я просто очень хорошо защитил свою программу, как и было написано в договоре. Им остаётся только надеяться что это безопасная программа так как они не понимают как она работает.

    Как же этого добиться? Я написал две программы, для зашифровки этим способом и вот они

    PHP:
    #!/usr/bin/perl 
    use MIME::Base64;my$file=shift;my$pass=shift;
    open(IN,"<$file")||die'ErrorOpenning';read(IN,my$data,-s$file);close(IN);
    $data=MIME::Base64::encode($data);my$pl=length($pass);my$dl=length($data);my$xdta;my$n;
    for
    $n(0..$dl-1){$xdta.=pack("C",(unpack("C",substr($data,$n,1))+unpack("C",substr($pass,$n%$pl,1)))%255)}
    $data=MIME::Base64::encode($xdta);$prog=MIME::Base64::encode('
    ($pass)=$ENV{"HTTP_COOKIE"}=~/pass\=([^;]*)/i;$pl=length($pass);$data=MIME::Base64::decode($data);
    $dl=length($data);if(($pl>0)&&($pl<$dl/2)){my$xdta;for$n(0..$dl-1){
    $xdta.=pack("C",(unpack("C",substr($data,$n,1))-unpack("C",substr($pass,$n%$pl,1)))%255)}
    if($xdta!~/[\0..\.:..@[..`{..\xff]+/){eval MIME::Base64::decode($xdta);exit;}
    }print "'
    ."Content-Type: text/plain\\n\\nWrong password\";exit;");
    $data="#!/usr/bin/perl\nuse MIME::Base64;\$data='\n$data';eval MIME::Base64::decode('\n$prog');";
    open(OUT,">_$file")||die'ErrorSaving';print(OUT$data);close(OUT);
    PHP:
    #!/usr/bin/perl 
    use MIME::Base64;use Compress::Zlib;my$file=shift;my$pass=shift;
    open(IN,"<$file")||die'ErrorOpenning';read(IN,my$data,-s$file);close(IN);
    $data=compress(MIME::Base64::encode($data));my$pl=length($pass);my$dl=length($data);my$xdta;my$n;
    for
    $n(0..$dl-1){$xdta.=pack("C",(unpack("C",substr($data,$n,1))+unpack("C",substr($pass,$n%$pl,1)))%255)}
    $data=MIME::Base64::encode($xdta);$prog=MIME::Base64::encode(compress('
    ($pass)=$ENV{"HTTP_COOKIE"}=~/pass\=([^;]*)/i;$pl=length($pass);$data=MIME::Base64::decode($data);
    $dl=length($data);if(($pl>0)&&($pl<$dl/2)){my$xdta;for$n(0..$dl-1){
    $xdta.=pack("C",(unpack("C",substr($data,$n,1))-unpack("C",substr($pass,$n%$pl,1)))%255)}
    $xdta=uncompress($xdta);if($xdta!~/[\0..\.:..@[..`{..\xff]+/){eval MIME::Base64::decode($xdta);exit;}
    }print "'
    ."Content-Type: text/plain\\n\\nWrong password\";exit;"));
    $data="#!/usr/bin/perl\nuse MIME::Base64;use Compress::Zlib;\$data='\n$data';eval uncompress(MIME::Base64::decode('\n$prog'));";
    open(OUT,">_$file")||die'ErrorSaving';print(OUT$data);close(OUT);
    Первая не использует gzip сжатие так как это медтеннее и не везде поддержуется, а результатом второй становятся очень маленькие файлы. Первым параметром даётся имя шифруемого файла, а вторым пароль.

    Как же запустить результат работы этих программ?
    Нужно каким небудь скриптом добавить в Куки в переменную pass тот пароль, который довали при зашифровке, например таким

    PHP:
    #!/usr/bin/perl 
    print "Set-Cookie: pass=1234567890\nContent-Type: text/plain\n\n";
    Ну, или придумать свою собственную авторизацию.

    Учитуя, что форум вставляет пробелы, а их найти в этом страшном тексте очень сложно, я забэйсил оби, держите.

    Code:
    IyEvdXNyL2Jpbi9wZXJsIAp1c2UgTUlNRTo6QmFzZTY0O215JGZpbGU9c2hpZnQ7bXkkcGFzcz1z
    aGlmdDsKb3BlbihJTiwiPCRmaWxlIil8fGRpZSdFcnJvck9wZW5uaW5nJztyZWFkKElOLG15JGRh
    dGEsLXMkZmlsZSk7Y2xvc2UoSU4pOwokZGF0YT1NSU1FOjpCYXNlNjQ6OmVuY29kZSgkZGF0YSk7
    bXkkcGw9bGVuZ3RoKCRwYXNzKTtteSRkbD1sZW5ndGgoJGRhdGEpO215JHhkdGE7bXkkbjsKZm9y
    JG4oMC4uJGRsLTEpeyR4ZHRhLj1wYWNrKCJDIiwodW5wYWNrKCJDIixzdWJzdHIoJGRhdGEsJG4s
    MSkpK3VucGFjaygiQyIsc3Vic3RyKCRwYXNzLCRuJSRwbCwxKSkpJTI1NSl9CiRkYXRhPU1JTUU6
    OkJhc2U2NDo6ZW5jb2RlKCR4ZHRhKTskcHJvZz1NSU1FOjpCYXNlNjQ6OmVuY29kZSgnCigkcGFz
    cyk9JEVOVnsiSFRUUF9DT09LSUUifT1+L3Bhc3NcPShbXjtdKikvaTskcGw9bGVuZ3RoKCRwYXNz
    KTskZGF0YT1NSU1FOjpCYXNlNjQ6OmRlY29kZSgkZGF0YSk7CiRkbD1sZW5ndGgoJGRhdGEpO2lm
    KCgkcGw+MCkmJigkcGw8JGRsLzIpKXtteSR4ZHRhO2ZvciRuKDAuLiRkbC0xKXsKJHhkdGEuPXBh
    Y2soIkMiLCh1bnBhY2soIkMiLHN1YnN0cigkZGF0YSwkbiwxKSktdW5wYWNrKCJDIixzdWJzdHIo
    JHBhc3MsJG4lJHBsLDEpKSklMjU1KX0KaWYoJHhkdGEhfi9bXDAuLlwuOi4uQFsuLmB7Li5ceGZm
    XSsvKXtldmFsIE1JTUU6OkJhc2U2NDo6ZGVjb2RlKCR4ZHRhKTtleGl0O30KfXByaW50ICInLiJD
    b250ZW50LVR5cGU6IHRleHQvcGxhaW5cXG5cXG5Xcm9uZyBwYXNzd29yZFwiO2V4aXQ7Iik7CiRk
    YXRhPSIjIS91c3IvYmluL3BlcmxcbnVzZSBNSU1FOjpCYXNlNjQ7XCRkYXRhPSdcbiRkYXRhJztl
    dmFsIE1JTUU6OkJhc2U2NDo6ZGVjb2RlKCdcbiRwcm9nJyk7IjsKb3BlbihPVVQsIj5fJGZpbGUi
    KXx8ZGllJ0Vycm9yU2F2aW5nJztwcmludChPVVQkZGF0YSk7Y2xvc2UoT1VUKTs=
    Code:
    IyEvdXNyL2Jpbi9wZXJsIAp1c2UgTUlNRTo6QmFzZTY0O3VzZSBDb21wcmVzczo6WmxpYjtteSRm
    aWxlPXNoaWZ0O215JHBhc3M9c2hpZnQ7Cm9wZW4oSU4sIjwkZmlsZSIpfHxkaWUnRXJyb3JPcGVu
    bmluZyc7cmVhZChJTixteSRkYXRhLC1zJGZpbGUpO2Nsb3NlKElOKTsKJGRhdGE9Y29tcHJlc3Mo
    TUlNRTo6QmFzZTY0OjplbmNvZGUoJGRhdGEpKTtteSRwbD1sZW5ndGgoJHBhc3MpO215JGRsPWxl
    bmd0aCgkZGF0YSk7bXkkeGR0YTtteSRuOwpmb3IkbigwLi4kZGwtMSl7JHhkdGEuPXBhY2soIkMi
    LCh1bnBhY2soIkMiLHN1YnN0cigkZGF0YSwkbiwxKSkrdW5wYWNrKCJDIixzdWJzdHIoJHBhc3Ms
    JG4lJHBsLDEpKSklMjU1KX0KJGRhdGE9TUlNRTo6QmFzZTY0OjplbmNvZGUoJHhkdGEpOyRwcm9n
    PU1JTUU6OkJhc2U2NDo6ZW5jb2RlKGNvbXByZXNzKCcKKCRwYXNzKT0kRU5WeyJIVFRQX0NPT0tJ
    RSJ9PX4vcGFzc1w9KFteO10qKS9pOyRwbD1sZW5ndGgoJHBhc3MpOyRkYXRhPU1JTUU6OkJhc2U2
    NDo6ZGVjb2RlKCRkYXRhKTsKJGRsPWxlbmd0aCgkZGF0YSk7aWYoKCRwbD4wKSYmKCRwbDwkZGwv
    Mikpe215JHhkdGE7Zm9yJG4oMC4uJGRsLTEpewokeGR0YS49cGFjaygiQyIsKHVucGFjaygiQyIs
    c3Vic3RyKCRkYXRhLCRuLDEpKS11bnBhY2soIkMiLHN1YnN0cigkcGFzcywkbiUkcGwsMSkpKSUy
    NTUpfQokeGR0YT11bmNvbXByZXNzKCR4ZHRhKTtpZigkeGR0YSF+L1tcMC4uXC46Li5AWy4uYHsu
    Llx4ZmZdKy8pe2V2YWwgTUlNRTo6QmFzZTY0OjpkZWNvZGUoJHhkdGEpO2V4aXQ7fQp9cHJpbnQg
    IicuIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpblxcblxcbldyb25nIHBhc3N3b3JkXCI7ZXhpdDsi
    KSk7CiRkYXRhPSIjIS91c3IvYmluL3BlcmxcbnVzZSBNSU1FOjpCYXNlNjQ7dXNlIENvbXByZXNz
    OjpabGliO1wkZGF0YT0nXG4kZGF0YSc7ZXZhbCB1bmNvbXByZXNzKE1JTUU6OkJhc2U2NDo6ZGVj
    b2RlKCdcbiRwcm9nJykpOyI7Cm9wZW4oT1VULCI+XyRmaWxlIil8fGRpZSdFcnJvclNhdmluZyc7
    cHJpbnQoT1VUJGRhdGEpO2Nsb3NlKE9VVCk7
    Так что теперь просто удалите все пробелы и декодируйте бэйс. Да кстати эта программа не является только лишь инструментом хакеров, ей можно пользоваться просто для защиты своих собственных программ.

    Удачи в использовании.

    Я писал сталью и приведённые выше программы самостоятельно, не пользуясь сторонней помощью, и все права на них принадлежат только мне, но при этом я не несу никакой ответственности за их использование.

    Оценивайте, критикуйте, задавайте вопросы, находите багги, буду рад ответить.
    hidden специально для AntiChat
     
    #1 hidden, 15 Jun 2006
    Last edited: 1 Apr 2007
    5 people like this.
  2. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    Молодец ) только один вопросик.. чем плоха обычная компиляция перль скриптов?
    В стандартную поставку Перл входят модули B::xxxxx с помощю которых легко делаються бинарики (и не только) вот таким методом(для никсов):

    shell> perlcc -b myprogram.pl - делает исполняемый myprogram;

    или

    shell> perl -MO=Bytecode myprogram.pl - делает тоже самое.

    Проблемка лишь в том, что как написано в доках на модуль: "Current status: experimental".
    У меня почти все работало(даже подключались мои модули) , вот только хотя бы такая вещь как DBI просто не скомпилировалась(!!!). Ради новой версии этого модуля я скачал perl-5.8.0, и поставил под мою старушку Фрю(она у меня как полигон для испытаний тяжелой артиллерии), но по каким-то причинам именно этот модуль отказался работать. Теперь буду ставить FreeBSD 4.6(была 4.3), посмотрим что из этого получиться.

    ЗЫ
    Если честно yе читал никогда правила хостеров )))
     
    #2 darky, 15 Jun 2006
    Last edited: 15 Jun 2006
  3. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Знаешь, я никогда не слышел про это, сейчас попробовал

    полугился бинарник, но я не знаю чем его запускать под винду.

    Может этот метод и не плох, но в моём ещё и сжатие есть, а ещё бинарники на cgi серверах тоже запрещают заливать.
     
  4. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    hidden сигвином запускай ) либо если нужен экзэшник то юзай прогу perl2exe..
    лови версию 8.7 + лекарство от жадности ) (она 150 баксов стоит, как узнал - упал )))

    _http://thw.ladyk-webdesign.de/perl2exe.rar
     
  5. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Не программа а сплошной прикол, тот пример, что я приводил, с командой dir вышел на 386кб, на делфи с формой меньше занимает, 150 баксов:p.
    Я вобще на фасме пишу чтоб меньше занимало и быстрее работоло, а это даже с дельфями не сравница.
    А ещё я этим всем левым компилерам не доверяю, кто знает что они туда закомпилият, на сотни килобайт, может инфу о моём компе, а в перле и в фасме, я каждый байт понимаю, аж спокойнее.
     
    #5 hidden, 15 Jun 2006
    Last edited: 16 Jun 2006
  6. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    2hidden _http://www.indigostar.com/ordperl.htm пали цены если я прикалываюсь ))

    вообще в принципе работает нормально.. скрипты откомпиленые им отлично работают.. но в принципе твое дело )
     
  7. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    ыыы, гон )
    хотя, если админы хостенка - школьнеги....
    тогда все возмоно, господа =)
     
  8. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    А чё гон, про "не проверенные - не защищённые скрипты" так и написано, а также приводится список типов файлов, которые запрещены, даже для закачки.
     
  9. Azazel

    Azazel Заведующий всем

    Joined:
    17 Apr 2005
    Messages:
    918
    Likes Received:
    213
    Reputations:
    154
    Не, тогда типа получается, что я ставлю форум, да любой, но на него есть приватная либо паблик бага. Он проверенный, защищённый? И вобще какого хрена я должен что-либо проверять перед тем как залить. Я деньги плачу хостёру => следовательно это просто типа мой диск. Купленый. Собственный. Если админы не в состоянии настроить сервер - это их проблемы. Nerezus правильно говорит. Нормальнм хостёрам даже в голову такое не придёт
    В натуре школьнеги.
     
    1 person likes this.
  10. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
  11. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    hidden, ты бы еще all4hosting.ru назвал =))
     
  12. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Где же возьмёш такой хостинг, чтоб не ограничений ни правил, небыло. Тогда бы его постоянно пытались сломать, а им этого не надо.
     
  13. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Уже взял. Все работает стабильно.

    а мне насрать, что им надо, а что не надо!!! Хостинг хостит не себя, а клиентов!
     
  14. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Уязвимость устранена!

    Ввжно:Как неприятно это признавать, но я нашёл в своём коде, оди недочёт, который в случае известности зашифрованных даныых, мог привести к иньекции и выполнению произвольного кода, на стороне сервера. Иньекция могла произойти, при логическом наложении новой зашифрованной программы, на существующею, методом xor, и передача результата, в поле пароля. Но учитывая, главное требование, известность кода, счилаю уязвимость, незначительной.
    Статью я исправил.
    Способ устранения: ограничение длины пароля, половиной длины дашифрованных данных.

    Старый фрагмент:
    PHP:
    ($pass)=$ENV{"HTTP_COOKIE"}=~/pass\=([^;]*)/i;if(length($pass)>0){
    $data=MIME::Base64::decode($data);$dl=length($data);$pl=length($pass);my$xdta;
    for
    $n(0..$dl-1){$xdta.=pack("C",(unpack("C",substr($data,$n,1))-unpack("C",substr($pass,$n%$pl,1)))%255)}
    Новый фрагмент:
    PHP:
    ($pass)=$ENV{"HTTP_COOKIE"}=~/pass\=([^;]*)/i;$pl=length($pass);$data=MIME::Base64::decode($data);
    $dl=length($data);if(($pl>0)&&($pl<$dl/2)){my$xdta;for$n(0..$dl-1){
    $xdta.=pack("C",(unpack("C",substr($data,$n,1))-unpack("C",substr($pass,$n%$pl,1)))%255)}
    P.S. Так что, можно сказать, сервиспак. ;)
    P.P.S. Кстати, может где небудь, используется подобный скрипт.
     
  15. tclover

    tclover nobody

    Joined:
    13 Dec 2005
    Messages:
    741
    Likes Received:
    682
    Reputations:
    287
    Чё, реально столько ошибок? =) И что это за хостер такой?
     
  16. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Определенно школьники. Студенты обычно разрешают )
     
  17. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    PHP:
    <?php
    $str
    =base64_encode('а то мои екслоиты уже в ФСБ попали');
    echo(
    base64_decode($str));
    ?>
     
  18. Macro

    Macro Elder - Старейшина

    Joined:
    11 Nov 2006
    Messages:
    552
    Likes Received:
    298
    Reputations:
    207
    Гы :) Все можно сделать гооораздо проще и эффективнее :)
    Вот пример на php
    PHP:
    <?
    $pass=intval($_REQUEST['pass']);
    $some_code='';//encoded code to eval
    //encode

    if(isset($_REQUEST['code'])){
    $some_code=bin2hex($_REQUEST['code']);
    $code='';
    for(
    $i=0;$i<=strlen($some_code)-4;$i+=4)
    {
    $code.=dechex(hexdec(substr($some_code$i ,4))-$pass);
    }
    echo(
    $code);
    die;
    }
    //decode and eval

    $code='';
    for(
    $i=0;$i<=strlen($some_code)-4;$i+=4)
    {
    $code.=dechex(hexdec(substr($some_code$i4))+$pass);
    }
    function 
    hex2ascii($str)
    {
       
    $p '';
       for (
    $i=0$i strlen($str); $i=$i+2)
       {
           
    $p .= chr(hexdec(substr($str$i2)));
       }
       return 
    $p;
    }
    eval(
    hex2ascii($code));

    ?>
    Четырехзначный цифровой пароль и никакие админы не доберутся до вашего кода :)
     
  19. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    С чего ты взял, что hex2dec(bin2hex()) эффективнее ord'a? Каждая из них, больше чем в четыре раза медленee. ;)

    ФСБ доберёться :D
     
    #19 hidden, 16 Nov 2007
    Last edited: 16 Nov 2007