Портал для веб-мастера
Вход пользователей
Поиск статей
WoWeb.ru » Статьи » Программирование для Web » PERL/CGI

Как защитить мою программу, чтобы никто не смог её прочитать?
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.
Добавлена: 2002-07-28
Просмотров: 2217 · Рейтинг: 0.0

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории раздела
Flash
Apache
WWW
PhotoShop
Веб-дизайн
Раскрутка и реклама
Базы данных
3D графика
Хостинг
Истории веб-мастеров
Web-технологии
Сетевая безопасность
Программирование для Web
Операционные системы

Новые статьи
Лучшие статьи
Популярные статьи
Комментируемые статьи
Разделы сайта
Скрипты
Статьи
Шрифты
Флэш исходники
HTML шаблоны
Партнерки
Клипарты
Смайлы
Фоны
Гифы
Иконки
Опрос сайта
Есть ли у вас свой сайт?
Всего ответов: 140886
Наша кнопка
WoWeb.ru - портал для веб-мастера