2012-11-23: Зашита LISP программ.
Если глубоко не вдаваться в проблематику затронутой темы, в вопросе защиты можно выделить два направления – защита от просмотра исходного кода и изменения самой программы и защита от копирования. Защиту от просмотра и изменения исходного кода можно реализовать несколькими способами. 1. Так называемое «кельвинирование». В интернете полно программ , которые шифруют и дешифруют ЛИСП файлы. Однако при дешифрировании сохраняются не только имена переменных и имена функций, но и даже комментарии к коду! Такой вариант, естественно, отпадает. 2. Компилирование (например, средствами AutoCAD) в FAS файл. Мои поиски по форумам привели меня к убеждению, что декомпилятора, который восстановил бы исходный текст LISP программы, не существует. Теми программами, что мне довелось видеть, выжать что-то осмысленное из FAS так и не получилось. На специализированных форумах старожилы пишут что сие невозможно. Что ж, я остановился на таком выборе и могу его рекомендовать начинающим ЛИСП-программистам. 3. Компилирование в VLX. Подробно на этом пункте останавливаться не буду, скажу лишь, что все, что сказано выше в отношении FAS, справедливо, по моему убеждению, и в отношении VLX, однако я все же предпочитаю FAS. Теперь остановимся более подробно на защите от копирования. «Привязать» программу к компьютеру, к его аппаратной составляющей, можно несколькими способами. Считается, что самый оптимальный – это привязка к серийному номеру жесткого диска, однако прочитать его средствами ЛИСП напрямую нельзя. Можно использовать библиотеку, написанную на другом языке программирования, но могут возникнуть сложности с совместимостью версий CAD платформы, версий net framework и так далее. Я использую два способа «привязки к железу»: 1. Для компьютеров с операционной системой Windows на базе NT можно использовать так называемый SID - идентификатор безопасности. Теоретически он должен быть уникальным для каждого компьютера и его можно прочитать из реестра средствами LISP, вне зависимости от политик безопасности домена. А на предприятии очень часто такие политики накладывают ограничения. Ниже приведен код функции на языке LISP, которая возвращает считанный из реестра SID: (defun get_sid ( / tmp result i) (setq tmp(vl-registry-descendents "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList")) (setq i 0)> (setq result "") (repeat (length tmp) (if (wcmatch (nth i tmp) "S-1-5-21*") (setq result (nth i tmp)) ); end if (setq i (1+ i)) ); end repeat result ); end defun 2. Версия BIOS. Такая информация есть в реестре, и ее так же можно прочитать средствами LISP Ниже приведен код функции на языке LISP, которая возвращает считанную из реестра версию BIOS: (defun get_sbv ( / i result tmp) (setq tmp(vl-registry-read "HKEY_LOCAL_MACHINE\\Hardware\\Description\\System\\" "SystemBiosVersion")) (setq i 0 result "") (repeat (length tmp) (if (= (type (nth i tmp)) 'STR) (setq result(strcat result (nth i tmp))) ); end if (setq i (1+ i)) ); end repeat result ); end defun Однако в обоих способах есть своя ложка дегтя. В организации, где я сейчас работаю, на компьютерах, включенных в домен, каким-то странным способом время от времени меняется SID, поскольку я не знаком с админской кухней, объяснить этого я не могу, а наши админы сказали "не может быть такого". Так же для облегчения развертывания рабочих станций админами может использоваться один образ операционной системы с одним SID-ом, который могут и "забыть" поменять потом. Привязка к версии BIOS тоже имеет свои нюансы. Как правило, в организации приобретают единовременно несколько компьютеров одинаковой конфигурации, на которых, вероятнее всего, будут совпадать версии BIOS. Какой из этих двух (а может быть и оба одновременно) способов использовать, решать вам. В следующей статье я расскажу как шифровать и где хранить "ключ", полученный из конфигурации компьютера.
Александр Лапкин Просмотров: 6550 Вернуться назад
|