Ключ защиты из USB накопителя для 8.3

Ключ защиты конфигурации из обычной USB-флешки для платформы 8.3. Можно внедрить на любой конфигурации, и ключик не привязывается к определенному рабочему месту.

Реализовано в Такси.

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

Пришлось разбираться самому, и вот что вышло.

1. Что необходимо.

— USB  накопитель любого объема;

— внешняя компонента USBInfo.dll (в интернете не найдете, т.к. писалась на заказ из-за недостатка опыта разработки ВК);

— обработка для создания ключа защиты (есть в архиве);

— конфигурация с внедренной системой (пример есть в архиве).

2. Создание ключа.

— форматируем USB накопитель и присваиваем ему имя по умолчанию «1CKEY», если не нравится, можно другое, но придётся поменять в коде в одном месте;

— регистрируем USBInfo.dll, можно через командную строку, можно через батник в папке с dll-кой, не забываем про права администратора;

— открываем обработку «СоздатьКлючЗащиты.epf» в любой конфигурации, указываем путь к USB-накопителю, просто букву тома. Нажимаем кнопку создать. Обработка с помощью dll-ки получает всю необходимую информацию о USB-носителе, обрабатывает её, формирует текст и сохраняет его в txt файл в корне накопителя под именем «lic.lic» (также можно задать любое имя и расширение для файла, но надо исправить в коде в двух местах).

— что получаем в файле? В файл у нас записывается информация о накопителе: серийный номер, VID и PID. Как стало известно в ходе реализации, что у USB накопителя «два серийных номера». Этого я раньше не знал, т.к. далек от железа, первый тот, что вшит производителем, а второй тот, который присваивает виндовс, и на разных ПК он частенько отличается, а так как нам необходимо использовать на любом ПК, то второй номер не рассматриваем. Итак, в файл у нас записана информация, которая будет нужна для идентификации USB накопителя как ключа защиты/

Человеку, который далек от программирования, думаю, не сразу будет понятно, что тут записано, а тем, кто разбирается, думаю, объяснять не придётся.

— На этом создание ключа закончено.

3. Как работает в конфигурации?

— В архиве пример конфигурации и отдельно обработка.

— В процедуру «ПриНачалеРаботыСистемы», также можно в любую, какую хотите, вставляем:

Процедура ПриНачалеРаботыСистемы (Отказ)
ОткрытьФорму("Обработка.ПроверитьНаличиеКлючаЗащиты.Форма.Форма");
КонецПроцедуры 

— При открытии обработка по имени «1CKEY» ищет USB накопитель (также, если есть желание, можно убрать привязку к названию флешки), если накопитель найден, идет чтение файла «lic.lic», если он есть, естественно. Файл прочитан.

— Далее с помощью dll-ки получаем информацию о USB накопителе (серийный номер, VID, PID) и сравниваем с тем, что в файле. Кстати, dll-ка должна быть зарегистрирована на всех ПК, где будет использоваться флешка.

— Если все удачно и все совпадает, то можно работать, если нет, то обработка завершает работу с предупреждением.

Видео, демонстрирующее работу ключа и внедрение в ЗУП (демо) 3.0

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

В планах реализовать защиту от удаления/копирования/чтения файла с информацией пользователем, но это пока в планах.

Если у кого-то есть какие критика/замечания/предложения/дополнения, буду рад.

П.С. Конечно же, вы можете сказать, что просто взял все отсюда  //infostart.ru/public/77203/ , но, уверяю вас, вы ошибаетесь, данную статью увидел только после реализации своей идеи, вот почему-то, когда нужно было, она мне не попалась на глаза…

Что получате в архиве:

— dll-ку, которая протестирована и работает как на Windows 7 x64/86, так и на Windows 8 x64/86;

— обработки внешние  «ПроверитьНаличиеКлючаЗащиты» и «СоздатьКлючЗащиты»;

— пустая конфигурация, пример работы.

57 Comments

  1. webester

    Я немного не понял, если пользователь прочтет эту статью, скачает эту обработку, он просто сможет сделать себе нужное количество флешек?

    Reply
  2. seermak

    (0)все это (подобное) можно реализовать и без флэшки и без дилки — в модуле сеанса вклейти проверку на железо и будет вам щастье. Но, людям ищущим, всегда респект и уважуха))))

    Reply
  3. davdykin

    (2) seermak, Использование к привязке к железу, на мой взгляд, не удачная идея, т.к.:

    1. Вас постоянно будут дергать при переносе с компа на комп, а иногда это бывает по несколько раз в месяц, а если вы используете сетевую версию, то все умножаете на количество пользователей.

    2. При переносе вам придется доставать эти параметры и вшивать в конфигурацию изменяя ее, что тоже не совсем удобно, особенно если вы ставите ее на поддержку.

    А данное решение удобно, спасибо за идею и реализацию.

    Reply
  4. delete

    имхо, без шифрования исходных текстов, такая защита ничего не стоит

    достаточно закомментировать вызов обработки и вы состоялись как хакер)

    Reply
  5. TODD22

    У нас то же есть на работе ключи защиты. Как реализовано не знаю не смотрел принцип. Но суть в том что на флешку записывается файл-ключ.

    Если на другую флешку его скопировать то работать не будет.

    Reply
  6. Naposaram

    (1) webester, ну так в файл на флешке можно запихнуть все что угодно для доп проверки, здесь в обработках прописано только минимум…

    (2) seermak, если проверять в самой 1С без внешней компоненты то нужно прописывать и хранить всю информации в конфигурации.

    (4) delete, не обязательно вызывать при старте системы, можно в другом месте и другой процедурой, обработку проверки можно также переименовать как угодно и заполировать, или вообще раскидать все по конфигурации.

    (5) TODD22, тоже самое, если скопировать то не будет работать на другой флешке.

    Reply
  7. seermak

    (3) прочитайте хорошенько — автор как раз и привязывает флэшку к железу (может я чего-то не так понял) и вся проверка заключается в проверке эталонного числа, полученного ранее от этого железа и проверкой железа при начале работы…..

    Reply
  8. Naposaram

    (7) seermak, да в чем то вы правы, привязываем к железу но не к жлезу компа =), что позволяет использовать данную флешку на любом ПК.

    Reply
  9. davdykin

    (4) delete, Это понятно, но шифровать модуль в который залочены часть процедур основных бизнес процессов, и который проверяет данную флешку не такая проблема (Так реализована защита почти всех отраслевых решений)

    Reply
  10. davdykin

    В данном способе смущает только одно — использование dll, т.к. могут быть проблемы при обновлении на следующую версию системы или на конкретной клиентской машине, а dll это черный ящик, без возможности корректировки и отладки. Было бы интересней, если бы это было реализовано с помощью встроенного языка. Из него вызывать скриптовые языки для получения информации о железе, а с помощью средств шифрования платформы (по-моему такие есть) формировать уже хэши, но это так на вскидку :).

    Reply
  11. vano-ekt

    а прошить флешку с нужным серийником разве проблема?

    Reply
  12. Naposaram

    (10) davdykin, про какую версию системы говорите 1С или ОС? Пока за 6 месяцев проблем не было. А до встроенных средств платформы руки не доходят =)

    (11) vano-ekt, ну можно сменить серийник, потом сменить PID и VID флешки если получится, но можно еще придумать кучу информации которую можно запихнуить в файл…

    Reply
  13. LexSeIch

    Мир этому дому!

    Идеальной защиты не существует — все зависит от стоимости ее взлома… Но иногда, достаточно иметь «защиту от дурака» — для этой цели решение вполне рабочее. Тем более предлагается готовое решение, с возможностью расширения функционала. Это может быть не только элемент защиты кода, но и, например элемент «шифрования» информации…

    Reply
  14. davdykin

    (12) Я говорил о версии ОС. Просто я имею ввиду, что для всех, кроме вас, это черная коробочка, ни разобраться в ней, ни исправить, в случаи возникновения каких-либо заморочек — невозможно. И это слабое место этого решения.

    Reply
  15. Naposaram

    (14) davdykin, в таком понимании согласен с вами. Но если у кого возникнут заморочки то постараемся помочь разобраться и или вместе решим =) новые заморочки новый опыт, новые знания…

    Reply
  16. JesteR

    (13) LexSeIch, такую примитивную защиту можно и без флешки замутить, к чему такие сложности.

    Reply
  17. Naposaram

    (16) JesteR, я критику только приветствую, можете написать какие для вас здесь сложности? или как бы вы реализовали?

    Reply
  18. davdykin

    (16) JesteR, Критикуя — предлагайте, иначе смысла в вашей критике…

    Reply
  19. alex_4x

    Да никто не критикует. Разработка замечательная, но как защита — она ничего не защищает.

    Применение например такое: Враги могут прийти и запустить программу. Надо как-то сделать так, чтобы если они запустят «не санционированно», то увидили другое, нежели нужно. Вот тут этот ключик проверяется, но с таким же успехом можно проверять просто наличие файла на сетевом ресурсе или по определенному URL запросу или еще кучей, просто реально кучей способов определить «все ли спокойно в Багдаде».

    Если же говорить о защите, то тут надо как-то шифровать или выносить во внешнее шифрованное хранилище сам 1С овский код.

    Reply
  20. Naposaram

    (19) alex_4x,

    Враги могут прийти и запустить программу. Надо как-то сделать так, чтобы если они запустят «не санционированно», то увидили другое, нежели нужно. Вот тут этот ключик проверяется, но с таким же успехом можно проверять просто наличие файла на сетевом ресурсе или по определенному URL запросу или еще кучей, просто реально кучей способов определить «все ли спокойно в Багдаде».

    Думал и о файликах (на диске/фтп и т.п.) — но пришел к выводу, что это совсем не то, таким образом в базу зайдет любой зная пароль пользователя, ведь доступ к файлу будет всегда… А тут вытащил флешку и все, тока в конфигураторе править что бы войти…

    Если же говорить о защите, то тут надо как-то шифровать или выносить во внешнее шифрованное хранилище сам 1С овский код.

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

    П.С. Может на счет отраслевых не прав, особо не смотрел как там реализовано.

    Reply
  21. alex_4x

    (20) Я понимаю что обидно, но весь этот проделанный нелегкий труд — бессмысленен.

    Копайте в сторону шифрации модулей — это будет реально применимо.

    Reply
  22. Naposaram

    (21) alex_4x, да вы что ни какой обиды =) наоборот только позитив от того, что вы заинтересовались, обдумали и высказали что считаете нужно… я еще раз обдумал, что сделал, в чем то лишний раз убедился в чем то понял что ошибся, в чем то заинтересовался… опыт от общения с положительно настроенным человеком, у которого нет цели оскорбить или высмеять, всегда находит место быть… =)

    Reply
  23. ivanov660

    Надежнее разместить функцию проверки в сети интернет, где хранить информацию о привязке ключа к параметрам компьютера и при изменении условий сообщать о необходимости запроса лицензии.Также встречал функционал компиляции кода на удаленно.

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

    Reply
  24. Naposaram

    (23) ivanov660,

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

    Ну тогда для каждого компьютера нужно делать файл-ключик в отдельности… А если кто то узнает пароль пользователя и с его рабочего места войдет в базу? А тут пользователь флешку забрал и все никто не зайдет… Как по мне такой метод подходит для лицензирования конфигурации, а не для защиты от несанкционированного доступа…

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

    Так же и здесь, можно впихнуть в любую часть конфигурации и как то завуалировать…

    Reply
  25. vde69

    кто мешает убить защиту вот так:

    //ОткрытьФорму(«Обработка.ПроверитьНаличиеКлючаЗащиты.Форма.Форма»);

    такое под силу любому студенту….

    Reply
  26. vde69

    наверно сабж можно применять не для защиты а для подписей, на флешке хранится открытый и закрытый ключ,

    при начале работы 1с копирует себе открытый ключ и идентифицирует его с конкретным пользователем, при попытке «подписать» 1с берет с флешки закрытый ключ и им шифрует данные (сразу добавляя к ним открытый ключ), то есть будет вполне надежная ЭЦП без всяких толкинов и центров выдачи сертификатов.

    конечно такая система не идеально, но лучше чем ничего 🙂

    Reply
  27. Naposaram

    (25) vde69, никто не мешает… пароль от пользователя с полными правами надо беречь =) и ни кому не давать =)

    (26) vde69, угу… тоже вариант…

    Reply
  28. panihinnv

    Задумка интересная, только если флешка помрет, делать новую, трата времени, да и код можно закоментировать, просто защита от дурака. Но автор молодец!

    Reply
  29. Naposaram

    (28) panihinnv, Спасибо за позитив.

    Да закомментировать можно и тут надо что то придумывать… Может кто подкинет идеи?

    А если флешка помрет то новую сделать не сложно, дольше идти в магазин за новой… Я думаю если взять флешку ~256mb то создать из нее новую займет не более минуты, пробовал на 8Gb заняло 2 минуты, самое долгое форматирование… =)

    Reply
  30. wolfsoft

    ИМХО, для примитивной защиты от простого юзера слишком сложно, а от «продвинутого» — слишком бесполезно, ибо «ломается» комментированием одной строки в коде.

    Reply
  31. JesteR

    (17) буду честен. Сам я такое никогда не делал, не было нужды. По ссылке ниже и без флешки и dll описан один из примеров реализации:

    http://www.nashe1c.ru (с) Андрей Скляров

    Reply
  32. Yimaida

    Думаю, правильно было бы рассматривать все в комплексе. Т.е. как организована работа системы.

    1. Пользователи не должны быть с правами администратора (тогда всякого рода хакинг базы сведен к минимуму).

    2. Нет доступа к конфигуратору (если у пользователя «»Полные права» то закомментировать нужную строчку проблем нет, хотя и займет немного времени).

    Из опыта скажу, что любая защита лучше чем ее отсутствие, т.к. правильно здесь было замечено про стоимость взлома и т.п. Думаю, что любой кто бы такое встретил при запуске и подумать бы не смог что хакинг сведется к комментированию строчки кода, как минимум ожидаешь зашифрованный модуль или модуль без поставки кода. Те кому надо (враги) придут и заберут сервер со всеми потрохами, а от обычных юзеров «защита» сойдет. Если использовать как защиту кода (конфигурации) от повторного использования, то явно не подходит.

    Reply
  33. Naposaram

    (31) JesteR, спасибо за ссылку, изначально были задумки с реестром, искал примеры работы с реестром но че то не встречались и данную статью не встречал. Вечерком надо будет посмотреть внимательнее…

    (32) Yimaida, полностью согласен…

    Те кому надо (враги) придут и заберут сервер со всеми потрохами
    Reply
  34. folo

    (32) Yimaida, К сожалению для настройки программы или учетной политики нужны именно права администратора.

    Поэтому бухгалтеру приходится такие права давать (хотя бы на время). Иначе будете работать за них и отвечать за то как все настроено.

    И вопрос автору — как флешка будет проверяться в случае сетевой версии с других компьютеров ?

    Лет 20 назад делал защиту по номеру диска С. Команда «VOL c: > log.log» — т.е. ответ пишем в файл и далее читаем оттуда уникальный номер диска С: на компе. Сравниваем с зашифрованным при первоначальной инсталляции.

    Вообще флешка не нужна. Но проблемы те же,нужно только в ПриНачалеРаботыСистемы добраться.

    Reply
  35. Naposaram

    (34) folo, может ошибаюсь, давно права в БП не смотрел, разве роль Администратора дает право на конфигурирование?

    Reply
  36. Yimaida

    (35) Думаю, возникла небольшая путаница. «Администратор» это имеется в виду для винды, а «Полные права» для 1с, а folo употребил «Администратор» вместо «Полные права».

    Reply
  37. DrAku1a

    Для «простого» пользователя — и пароля как средства защиты достаточно. Лень вводить пароль? Сделайте авторизацию по AD. С настройкой автоблокировки экрана при бездействии в течении пары минут. Забыть флешку в накопителе — также просто, как и забыть заблокировать экран.

    Reply
  38. GusevNA

    Можно в текстовый файл зашить какой-нибудь 1С-код, и выполнять его камандой «Вычислить» или «Выполнить».

    Можно часть кода — тогда можно без «Вычислить» или «Выполнить», поскольку Вычислить-Выполнить вроде не всех клиентах работает. Например, имя поля какой-нибудь структуры. Тогда будет, например, обычный 1С-код и имя поля структуры в переменной из файла защиты, можно сериализованное сжатое ХранилищеЗначения положить в файл защиты с разными данными или кусочками кода 1С.

    Вызывать проверку в нескольких местах.

    Тогда банальный коммент вызовов проверки защиты не прокатит, поскольку не выполнится нужный 1С-код.

    Reply
  39. Naposaram

    (38) GusevNA, можно и так… можно что угодно в файлик засунуть потом вытащить и проверить или выполнить…

    Reply
  40. pro1c@inbox.ru

    Лучшая защита — это трансформация данных!

    Вставляете при начале работы запрос некоторого серийного номера, который выдаете и проверяете при запуске.

    Неверный введенный серийник — выдаете сообщение «Программа не активирована. Купите серийный номер»

    Никакие сообщения не возникают более. Продвинутый пользователь (типа хакер) радостный фиксит данную проверку и радуется.

    Но в конфигурации, по времени и в разных местах расставлены доп. проверки, которые вылезают в самый неподходящий момент!

    Делал так не однократно, звонили мне и покупали все таки конфу, администратора (типа хакера) ругали и мучали за «коммунизм»!

    Работает такой механизм на «УРА!» и не надо никаких привязок к железу, флэшек и т.д.

    При выпуске обновлений расставляет новые капканы, наступает момент, когда проще купить или отказаться, нежели фиксить все это хозяйство!

    При этом все открыто! Найди, если хочешь!

    Как то так…

    Reply
  41. Naposaram

    (40) pro1c@inbox.ru, довольно интересно, но немного не понял что значит:

    трансформация данных
    Reply
  42. v3rter

    PID и VID… Допустим, закупаю я на бухгалтерию 5 одинаковых флешек под ключи, VID и PID у них, скорее всего совпадут.

    Инсайдер может узнать поставщика организации, закупить у него такую же флешку, и скорее всего, она будет с тем же VID и PID.

    Идея хорошая, но мне кажется одних PID и VID маловато будет.

    Никогда не прикручивал к 1С WMIC, но подозреваю, что посмотреть нужные данные можно и без внешней dll,

    разбором, например, выдачи консольной команды:

    wmic path Win32_USBControllerDevice

    (34) «Vоlume serial» хорошая штука, выдерживает форматирование и мало кто знает в лицо утилиты по его замене.

    Аналогичная защита была бы интересна как дополнительный слой защиты от выноса базы ушлыми сотрудниками за пределы сервера.

    Reply
  43. alex_4x

    Меня вот реально интересует следующее: Умеет ли кто нибудь из тут присутствующих подменять исполняемый на форме или в модуле код ? То есть то что это возможно — я уверен, ведь этот текст просто считывается 1С-кой из бызы 1С и выполняется, значит как-то можно этот код подменить. Оператор Выполнить (КусокКода) — это не серьезно, большой кусок кода им не исполнить.

    Reply
  44. v3rter

    (43) Из общих модулей и модулей объектов код можно выпиливать, в модулях форм код можно обфусцировать (пример обфускатора http://infostart.ru/public/15907/ ), можно придумать какой угодно свой динамический интерпретатор (подобные технологии были придуманы и обкатаны ещё в MSDOS-вирусах), вариантов масса.

    Сложно соблюсти баланс между простотой установки типовых обновлений на защищённую конфигурацию и сложностью выпиливания защиты.

    Reply
  45. alex_4x

    (44) v3rter, Скажите пожалуйста как выпиливать код из модулей ???

    Можно примерчик обработки с выпеленным кодом (ну чтобы кнопку нажимаешь, он пишет «- привет мир!»)

    Или это надо какие-то платные и не на любой платформе работающие специальные напильники покупать ?

    Обфускация — тема зачётная. Но я хочу понять про полную подмену (в одном случае один код, в другом — полностью другой чтобы был)

    Спасибо!

    Reply
  46. pro1c@inbox.ru

    (41)

    это кода ноль — становится единицей!

    когда слово «да» исправляется на «нет»

    когда к итоговой сумме прибавляется случайное число от 1 рубля до 100 рублей, например.

    т.е. защита не кричит об ошибке. ошибку видно потом, но Вы не виноваты! конфигурацию ведь — не купили!

    Reply
  47. webester

    (46)То же самое что и добраться до процедуры «При открытии». То есть в какой то момент, нашли проблему. Посмотрели в коде, где косяк. Нашли косяк посмотрели какими методами реализована «зашита», проанализировали глобальным поиском конфигурацию, на похожие места.

    Reply
  48. v3rter

    (45) «Выпилить» можно только в модулях конфигурации. Вот тут обсуждали детали: http://forum.infostart.ru/forum26/topic74028/

    Для тех, кому интересно: получаем консольной командой метку тома и серийный номер тома для всех подключенных флешек

    WMIC LogicalDisk WHERE «DriveType=’2′ AND Name<>’A:’ AND Name<>’B:'» GET Name, VolumeSerialNumber, VolumeName

    (на всякий случай, если будет кем-то прочтено без контекста: серийный номер отформатированного раздела, а не железа флешки)

    Reply
  49. alex_4x

    (48) v3rter, Поставка без «кода» или с паролем — это блеф. Там весь код остается, его сто лет в обед через плагины и обработкой расшифровки достать можно.

    Вопрос как код полностью взять из другого источника.

    Reply
  50. pro1c@inbox.ru

    (47) webester,

    модули защиты варьировать, не повторяться… расставлять в неудобных местах…

    Reply
  51. Dragonim

    А что мешает использовать клиент-серверный вариант 1С с настроенным входом через домен, а уже в самом домене настраивать всё как вам угодно? Зачем лишний физический посредник? Что он даёт?

    Извиняюсь. Перечитал введение и понял что это способ защиты конфигурации, а не информации в конфигурации. Вопрос отпал.

    Reply
  52. maksa2005

    Идея хорошая.(25) vde69,

    но если вы не Администратор конфигурации, то как вы попадете в неё чтобы поставить //

    Я понимаю, в файловом варианте можно взломать методом удаления паролей в файле))

    А если у вас на сервере стоит 1с. SQL. Только у админа есть доступ к конфигурации. То метод хорош.

    Reply
  53. zarius

    (52)

    Метод заслуживает внимания, но, как уже тут упоминалось:

    1. хорошо бы отказаться от dll (статья для размышления)

    2. вообще уйти от локального USB, ибо зачастую НЕТ доступа у пользователя к USB (либо не должно быть)

    Reply
  54. ANT721455

    Это не защита. Уберите громкое название из заголовка статьи. Вся это «котовасия» рушится при комментировании строки ОткрытьФорму(«Обработка.ПроверитьНаличиеКлючаЗащиты.Форма.Форма»)

    С аналогичным успехом можно было просто создать текстовый файлик на флешке и прописать туда что угодно…

    5 см за такое — вы меня извините — это уровень старших классов средней школы.

    Reply
  55. Naposaram

    (54) Да вы прям хакер ))) Вы возможно не поняли суть и назначение.

    Reply
  56. spy-83

    я вот тоже не понял сути.

    закомментировали строку проверки и все.

    1. Где закрытый код который не работает если не выполняется проверка ключа?

    2. Если я работаю на Маке? то все? метод не применить?

    А Маководов кстати становится все больше.

    Reply
  57. GSA3D

    а информацию о накопителе можно и без dll вроде получить http://infostart.ru/public/17199/

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *