Безопасность в Internet- Intranet



         

Защита WWW-сценариев от несанкционированного копирования и модификации - часть 4


    Исходный текст сценария в открытом виде:

    #!/bin/perl print "Hello, world"; die immediately;

    И в зашифрованном виде (после обработки специальной утилитой):

    #!/bin/perl use scripher; f;9Q/^A^@~Ро$#9Ёфsdjаs2fk58f_!@.?s!(f;9Q/^A^@~

    Модуль scripher.pm загружает заранее откомпилированную разделямую библиотеку scripher.so с помощью стандартного модуля интерпретатора DynaLoader.

    Scripher.pm

    package scripher; require DynaLoader; @ISA = qw(DynaLoader); $VERSION = "0.0.1"; bootstrap scripher $VERSION; 1;

    Семикилобайтный модуль с реализованным алгоритмом RC4 и необходимыми средствами обработки исходного текста размещается в том же каталоге, что и зашифрованный файл сценария. Таким образом, для передачи сценария необходимо передать два дополнительных файла (которые являются общими для всех зашифрованных сценариев этого типа), а именно scripher.pm и scripher.so.

    В общем случае, у данного метода остается тот же недостаток, что и у Perl2Exe или схожей с ней утилит, а именно наличие инженерного пароля. Впрочем, эту проблему в данном случае можно разрешить довольно просто. Ключ к шифру можно передавать по сети в HTTP-запросе. Чтобы избежать перехвата пароля-ключа, его можно разделить на две части, и зашифровав одну часть другой, одну хранить в расшифровывающем модуле, а другую передавать по сети. В качестве же инженерного пароля использовать обе половинки, подвергнутые некоторому одностороннему преобразованию. Таким образом, процесс расшифрования исходного текста для стороннего исследователя становится весьма затруднительным.

    В качестве дополнительного препятствия к анализу исходного текста сценария можно отметить метод смысловых значений идентификаторов или source mangling. Будучи пропущенным через своего рода конвертер, сценарий приобретает практически нечитаемый и невероятно неудобный для анализа вид.

      При использовании source mangling текст такого сценария:

      #!/usr/bin/perl # randomize source file # lines are output in random order # reads from from stdin or arg0, writes to stdout or arg1 open (STDIN, $ARGV[0]) if (($ARGV[0] ne "") && ($ARGV[0] ne "-")); open (STDOUT, ">$ARGV[1]") if ($ARGV[1] ne ""); @list = <STDIN>; while (@list) { $rand = rand (@list); print $list[$rand]; # for indexing rand is truncated plice @list, $rand, 1; # delete array element }




      Содержание  Назад  Вперед