В разгар катастройки 1990-95 годов стены НИИ, КБ, разныхГИПРО... , отраслевых и академических институтов покинуло достаточное количество работников – люди подались искать удачу.
По прошествию времени большая их часть оставила бизнес и вернулась к своим инженерным специальностям, организовав маленькие и меленькие фирмы, живущие в тени монстров государственного масштаба.
Однако не смотря на размер, компьютерные программы для работы нужны и тем и другим и третьим... А программы инженерной направленности, особенно для проектных контор, на сайтах ломанного софта не найдешь, да и за большие деньги не купишь: создавались и доводились до ума они годами, нужны сугубо ограниченному кругу потребителей и плодить себе конкурентов никто в здравом уме не станет...
Программ таких в конторах, подобных той, где я и.ч. служить, наберется не одна сотня: часть из них – в одно-два действия и напоминает студенческую лабу средней паршивости, зато другая часть по своей сложности, объему, размерности может сравниться с инженерным CAD-пакетам корпоративного типа. Повторюсь: и практически все такие разработки рыночных аналогов не имеют, ибо являются узкоспециализированными и остро заточенными инструментами ограниченной (по числу пользователей) востребованности. Что , конечно же , не снижает их ценности…
Ну дык вот, некоторое время тому встала проблема: а как бы прочно и надежно защитить такие программы.
Проведя анализ имевшихся тогда ( -5лет тому) средств защиты программных продуктов, мы не нашли ничего, что отвечало бы нашим требованиям. Ни привязка программ к ПК, ни аппаратные ключи по понятным причинам не подходили.
Стали думать: а что у нас есть, чего и всегда рядом, всегда доступно, под рукой и никто не унесет ? И ответ очевиден – Дерево нашей сети.
Вариант РАЗ
По первоначальному недомыслию задачу решили реализовать в лоб - использовать для защиты программ идентификацию в сети плюс :записи в поле DESCRIPTION каждого пользователя.
Каждый программный проект получил своё уникальное кодовое название (например, MOST1) и программа обращалась к Дереву, по логину пользователя находила в Дереве соответствующий объект типа USER и считывала поле DESCRIPTION этого объекта. Если в этом прочитанном поле программа находила запись типа MOST1=1 , то программа работала, а если программа такой записи не находила, или не находила сети, то и не работала.
Недостатки такого подхода – на поверхности и говорить тут не о чем…
Другое дело, что возня с Novell_SDK, изучение принципов работы с NDS из программ, анализ наших проблем и поиски иных решений не пропали и привели нас к реализации
Варианта ДВА.
Несколько осмелев, мы решили, что пора расширять схему Дерева. Что и было сделано: классу GROUP был добавлен атрибут типа «множественная строка» (т.е. можно хранить много переменных типа string) .
Далее, под нужды защиты программ был выделен специальный контейнер типа OU, который, естественно, получил имя PROGRAMMS . В этом контейнере постепенно, по мере включения программ в защиту, создавались объекты типа GROUP с именами, соответствующими именам программных проектов. Т.е. среди прочих была создана и группа с именем MOST1 .
Как вы уже поняли – наличие или отсутствие пользователя в членах соответствующей группы и было условием запуска соответствующей программы. Поясню: если программу MOST1 запустил на своей рабочей станции пользователь Василий Пупкин, то первым делом программа налаживается в Дерево, находить контейнер PROGRAMMS, в нем ищет группу MOST1 и считывает поле MEMBERS этой группы. Ежели среди прочих там имеет место запись VAS_PUPK.[полн_кнткст] , то эта запись означает, что гражданин Пупкин – лояльный и правомерный пользователь указанного программного шедевра, пожалуйте на ввод ИД Ну, а если такой записи нет – значит и суда нет… Г-н Пупкин в своем праве обратиться за разъяснением, почему он лишен возможности применить программу MOST1.
Так заканчивается первая часть работы защиты – идентификационная и учетная и начинается собственно защитная.
В дебрях сайтов свободных разработок был найдены простой калькулятор ( а их там – не меряно…) , который мы и внедрили основным компонентом защиты.
Калькулятор наш получает на вход два множества параметров: первое множество - 4 числа типа REAL, второе множество – переменную типа string .
Вы уже догадались, что в строковой переменной хранится «программа» для калькулятора, а множество действительных чисел – это данные для этой «программы».
Вот теперь можно расписать алгоритм подготовки защиты:
1 шаг
При написании программы каждый программный проект получает свое собственное уникальное имя. Что неплохо и для учета программ, кстати…
2 шаг
Проблемный программист на последнем этапе разработки программы добавляет в код проекта несколько строк, которые организуют доступ к Дереву, поиск объекта типа GROUP с именем, эквивалентным имени проекта/программы, считывание поля MEMBERS этой группы и выявление в прочитанном множестве имен членов группы FDN запустившего программу пользователя.
3 шаг
Проект в исходниках передается программисту системы защиты. Он создает требуемую группу и просматривает программу на наличие возможных мест вставки защитного кода.
Такими местами являются не сложные вычисления с 3мя-4мя членами в формуле.
Например, в программе есть операторы вычислений окружности и пересчета углов:
- Код: Выделить всё
…..
S = PI * R * R
GRAD = (180.0 * RAD ) / PI
......
4 шаг
Программист защиты формирует собственно защиту путем занесения в дополнительный атрибут объекта GROUP нескольких строк, формально адекватных выбранным формулам.
Продолжим пример:
Программист защиты:
- добавит в наш атрибут строку №1 «A* B * C» и строку №2 «(A*B)/C»
- заменяет в исходном коде первоначальные операторы на операторы вида
- Код: Выделить всё
............
CALL CAZ ( S , 1 , PI , R , R, 0. )
CALL CAZ ( GRAD , 2 , 180.0 , RAD , PI , 0. )
............
Совершенно очевидно, что процедура CAZ обращается к атрибуту группы, содержащим строки-коды для работы калькулятора, считывает их и вычисляет с помощью своего калькулятора. Параметры в примере последовательно: переменная под результат, номер строки-формулы в поле атрибута , 4ре переменных для подстановки в формулу калькулятора.
5 шаг
Программа перетранслируется и пересобирается.
6 шаг
Проверка действия защиты.
На реализацию всех 6ти шагов программисту защиты требуется 10 минут. Ну и следует сказать, что пользователям даны соотв. права - пользователям дано право RF на атрибуты, а программисту защиты - право записи в соответствующие поля.
Программист защиты оперирует продуктом SHEMAX . (Бексплатная программка для работы со схемой, создания своих "снпинов" и т.д. Можно найти в разделе ФАЙЛЫ)
Вот пока все.
Указанная защита работает на нашей площадке уже в течении трех с половиной лет, до сих пор был только один серьезный сбой: когда число пользователей программы превысило 50 одновременно запушенных на рабочих станциях экземпляров программы, 51-му пользователю было отказано в доступе - вроде как он не член группы, хотя в списке он присутствовал...
Недолгий поиск выявил, что фирма N в безмерной мудрости своей ограничила один из глубоко внутренних буферов в SDK размером в 4K, и не сподобилась поставить там никакой диагностики на переполнение буфера…
Так что – не только билл и окна его, но и ребята из Прово грешат мелкой халявой при написании кода. Буфер был увеличен, SDK перетранслировали и все стало хорошо.
Если кто из коллег заинтересовался этой разработкой и имеет желание реализовать ее на своей площадке, рекомендую начать с исходников программы SKOKO (см. пункт ФАЙЛЫ сайта). Представленная в них библиотека BGDNet дает программисту на MsVC6++ широкие возможности по доступу к объектам Дерева. Ну, и плюс ваша фантазия…
Желаю энтузиастам успеха и Спасибо, что дочитали.