|
|
Ответов: 0
|
25-02-12 07:01
|
|
|
|
Ответов: 0
|
16-01-12 20:13
|
|
|
|
Ответов: 1
|
09-01-12 11:23
|
|
   Web - программирование
|
|
|
   Программирование под ОС
|
|
|
   Web - технологии
|
|
|
   Базы Данных
|
|
|
|
Web - программирование / PERL /
| |
| | |
Возможно вас заинтересует
|
|
Как защитить мою программу, чтобы никто не смог её прочитать?
Disclaimer: все приведённые примеры предназначены для
демонстрации принципов, а вовсе не являются готовыми к
использованию решениями.
Самый простой способ защиты программы это использование
компилятора perlcc (Unix/Linux) или perl2exe (Windows), который
создаёт из программы обычный выполняемый файл. Этот метод однако
имеет много недостатков. Помимо ненадёжности компиляторов и
потери кроссплатформенности, компиляции как таковой как минимум
во втором случае не производится. Созданный выполняемый файл
содержит полный интерпретатор Perl и саму программу в
зашифрованном виде (так объясняется громадный размер файла). Уже
существуют утилиты, позволяющие расшифровывать программу из
такого файла.
Рассмотрим методы защиты, при которых программа выполняется
интерпретатором Perl как обычно. Защитить программу с абсолютной
надёжностью таким образом невозможно. Программа должна быть
понятна для интерпретатора, значит в ней сможет разобраться и
человек. Единственное, что можно сделать, это усложнить
понимание программы. В идеале расшифровка программы требует
больше усилий, чем написание аналогичной новой программы. Однако
чтобы достичь этого, требуются в первую очередь большие усилия
от самого программиста. Помимо того во многих случаях снижается
скорость выполнения программы. Поэтому вам следует сначала
задать себе вопрос - а действительно ли это нужно, стоит ли того
эта программа?
Самый элементарный способ (и чаще всего используемый) -
зашифровать программу, поместить её в переменную, а вконце
поставить расшифровщик:
$var='7072696e74202248656c6c6f2c20576f726c6421223b';eval pack('H*',$var);
Можно использовать более надёжный способ шифрования, чем
запись шестнадцатиричным кодом. Тем не менее это слабая защита -
всегда нужен расшифровщик в программе и воспользоваться им может
любой. Достаточно заменить в верхнем примере eval на
print, чтобы получить исходный код программы. Это
изменение программы обратимо.
Однако есть обратимые изменения программы, после которых
восстановить программу сложнее. Основная идея при этом -
шифрование программы не целиком, а кусками:
%var=("abrakadabra" => "func");foreach (keys %var){*{$_} = *{$var{$_}}};
sub func
{
print "Hello, World!";
}
abrakadabra();
В этом примере в программе содержится список имён, из
которого последующий код создаёт псевдонимы для функций. Вместо
имени функции при вызове в программе используется ничего не
значащий псевдоним, что резко понижает читабельность программы.
В реальной программе список, разумеется, не будет храниться в
столь очевидном виде, а будет как-нибудь зашифрован. Но даже
тогда всё ещё можно заменить обратно все псевдонимы на настоящие
имена функций, но это уже не так тривиально, как в предыдущем
примере.
Самый большой интерес представляют необратимые изменения.
Частично таковым является удаление всех переводов строк,
комментариев, лишних скобок и пробелов из файла - в общем всего
ненужного, что было там лишь для повышения читабельности. Это
необратимо лишь частично, поскольку некоторые редакторы могут
автоматически расставить переводы строк и табуляторы. Тут уже
видна первая проблема: если автоматически опознать лишний пробел
ещё сравнительно просто, то со скобками это гораздо сложнее.
Пример:
$a = (2)+1;
print (2)+1;
Если первая строка и без скобок работает нормально, то во
второй их надо обязательно оставить, чтобы не изменить
результат.
Следущим шагом является переименование всех идентификаторов
(имён переменных и функций). Для наибольшего эффекта новые имена
должны быть похожи, чтобы запутать того, кто решит разбираться в
программе. При этом можно вспомнить, что Perl позволяет создать
функцию, скаляр, массив и хеш с одним и тем же именем, чем не
помешало бы воспользоваться. В идеальном варианте одинаковое имя
получают переменные, которые используются поблизости:
@r4t24swc=("Hello, World!");
%r4t24swc=("Hello, World!" => 1);
$r4t24swc=$r4t24swc[0];
r4t24swc($r4t24swc) if ($r4t24swc{$r4t24swc});
sub r4t24swc {print shift}
Далее следует замена операций на менее читабельные, которых
как раз в Перле несчётное количество. К примеру можно
преобразовать такую программу:
@list = ("Hello World!");
foreach $entry (@list)
{
if (length($entry)==12)
{
print $entry;
}
}
в эту:
@list = ("Hello World!");
for ($i=0;$i<=$#list; do {
$entry=$list[$i];
{
do {
print $entry;
} if (length($entry)==12);
}
$i++;
}) {}
Здесь были выполнены три операции:
- Цикл foreach был превращён в цикл for
- Тело цикла было перенесено в его выражение инкремента
- Условный оператор if был преобразован в модификатор
оператора. Аналогично можно поступить с unless, while и until.
Что можно сделать ещё? Можно вставлять в программу
бессмысленные куски, которые ничего не делают:
$do_nothing = 12;
$abrakadabra = $do_nothing;
# Здесь много текста
$do_nothing -= $abrakadabra;
# Опять много текста
while ($do_nothing)
{
print "Abrakadabra\n";
$do_nothing=do_something($do_nothing);
}
В идеале эти бессмысленные операции должны быть
разнообразными и похожими на окружающую их программу, чтобы их
было сложнее распознать.
Очевидно, что реализация программы для автоматического
преобразования вещь нетривиальная. Требуется как минимум
синтаксический разбор программы. Тут можно взглянуть на модуль
B (есть в стандартной инсталяции Perl). Альтернативно
могут помочь программы flex и yacc/bison.
Последние статьи: Web - программирование / PERL /
| |
| | |
Большое количество World Wide Web приложений основано на использовании внешних программ, управляемых Web сервером... подробнее
|
Кол. просмотров: общее - 5538 сегодня - 1
|
|
|
Кол. просмотров: общее - 4637 сегодня - 0
|
|
Одним из популярнейших вопросов во всевозможных форумах является вопрос «Как загрузить файл на сервер?». А ведь на самом деле это не так сложно, как кажется на первый взгляд. И чтобы не было совсем легко – пусть скрипт, который приведен ниже еще и посылает этот файл по почте, в виде вложения... подробнее
|
Кол. просмотров: общее - 5068 сегодня - 0
|
|
В статье рассматривается один из основных подходов к генерации динамического контента в среде веб-приложений, а именно использование веб-сценариев и CGI, и применительно к ним, методы защиты исходных текстов от несанкционированного копирования и модификации... подробнее
|
Кол. просмотров: общее - 4667 сегодня - 0
|
|
Disclaimer: все приведённые примеры предназначены для демонстрации принципов, а вовсе не являются готовыми к использованию решениями... подробнее
|
Кол. просмотров: общее - 4766 сегодня - 0
|
|
|
|