gifts2017

Golden Key 8.1 Prototype

Опубликовал Олег Пономаренко (O-Planet) в раздел Программирование - Защита и шифрование

В этот раз не будет внешней компоненты, не будет программной оболочки. В этот раз все – средствами 1С, все просто и достаточно эффективно …

Немного теории и практики…

Хочу напомнить принцип, положенный в основу защиты Golden Key 7.7, основанный на предположении, что защита эффективна тогда, когда трудозатраты по ее взлому превышают стоимость разработки защищенной программы…

В этом смысле, Golden Key 8.1 Prototype с успехом может использоваться для защиты демо-версий недорогих коммерческих разработок. Но самое главное, что разработчик самостоятельно, без особого труда может управлять уровнем защиты своей программы, импровизируя и используя авторские уловки.

В версии 7.7 был предложен перекодировщик, заменяющий часть программного кода обращением к внешней компоненте. В текущей версии мы поместим часть программного кода в html-файл и перекодируем его любым из доступных средств, заменив помещенный в html программный код обращением к объекту «HTMLДокумент».

Маленькая ремарка…

На Инфостарте вы найдете несколько статей, предваряющих эту тему. Толчком послужил недавний разговор в топике одной из таких статей. Я заинтересовался одной разработкой, посвященной web-документам, предполагая, что автор предложит способ работы с объектами 1С внутри web. Но этого там не было. Я задал вопрос, но гуру ответили, что такое не возможно. Не будучи гуру, и не принимая однозначных ответов, я вспомнил, как когда-то запускал скрипты одного web-документа в составе другого. Решил проверить в 1С… После пары часов вспоминания синтаксиса javascript, оно взлетело…

Пример 1: Hello, world.

1. Создаем текстовый файл:



2. Создаем внешний отчет и помещаем на форму поле html документа, ставим признак «Видимость» в ЛОЖЬ. Добавляем в отчет макет с двоичными данными, куда записываем наш файл.

В методе «ПриОткрытии» отчета пишем:

Макет=ПолучитьМакет("Макет");
ИмяФ=КаталогВременныхФайлов()+"gk.html";
Макет.Записать(ИмяФ);
ЭлементыФормы.ПолеHMLДокумента1.Перейти(ИмяФ);


3. Добавляем на форму кнопку. И в обработчик нажатия пишем:

Процедура Кнопка1Нажатие(Элемент)
Сообщить(ЭлементыФормы.ХТМЛ.document.parentWindow.hello());
КонецПроцедуры


Сохраняем, проверяем, радуемся.

Пример 2: работаем со справочником 1С в web-файле.

1. Посмотрим на следующий 1С код:

Мас=Новый Массив;
Рез=Справочники.Номенклатура.Выбрать();
Пока Рез.Следующий() Цикл
Если НЕ Рез.ЭтоГруппа тогда
Мас.Добавить(Рез.Ссылка);
Конецесли;
КонецЦикла;
Для Каждого Зн Из Мас Цикл
Сообщить(Зн);
КонецЦикла;


2. Переделаем его, поместив блок работы со справочником в процедуру:

Процедура Работа(Мас,Спр)
Рез=Спр.Выбрать();
Пока Рез.Следующий() Цикл
Если НЕ Рез.ЭтоГруппа тогда
Мас.Добавить(Рез.Ссылка);
Конецесли;
КонецЦикла;
КонецПроцедуры

Процедура Кнопка1Нажатие(Элемент)
Мас=Новый Массив;
Рез=Справочники.Номенклатура;
Работа(Мас,Спр);
Для Каждого Зн Из Мас Цикл
Сообщить(Зн);
КонецЦикла;
КонецПроцедуры


3. Спрячем функцию «Работа» в html-документ, добавив

function Job(Mas,Spr)
{ var Res;
Res=Spr.Выбрать();
while(Res.Следующий())
if(! Res.ЭтоГруппа)
Mas.Add(Res.ссылка);
}


4. Сохраняем, помещаем текстовый файл в шаблон, как и прежде, а код 1С переделываем:

Процедура Кнопка1Нажатие(Элемент)
Мас=Новый Массив;
Спр=Справочники.Номенклатура;
ЭлементыФормы.ХТМЛ.document.parentWindow.Job(Мас,Спр);
Для Каждого Зн Из Мас Цикл
Сообщить(Зн);
КонецЦикла;
КонецПроцедуры


Сохраняем, проверяем, радуемся.

Собственно, третий пример, как, наверное, многие уже поняли, должен относиться к запросам, ведь спрятать текст запроса в html-файл представляется интереснее всего. Приведу этот пример без комментариев:

Html:

function Zapros(z)
{
var t;
t= "ВЫБРАТЬ\n"+
" Номенклатура.Ссылка\n"+
"ИЗ\n"+
" Справочник.Номенклатура КАК Номенклатура\n"+
"ГДЕ\n"+
" (НЕ Номенклатура.ЭтоГруппа)\n"+
" И (НЕ Номенклатура.ПометкаУдаления)";
z.Текст=t;
var Res=z.Выполнить().Выбрать();
return Res;
}

1С:

Процедура Кнопка1Нажатие(Элемент)
З=Новый Запрос;
Рез=ЭлементыФормы.ХТМЛ.document.parentWindow.Zapros(З);
Пока Рез.Следующий() Цикл
Сообщить(Рез.Ссылка);
КонецЦикла;
КонецПроцедуры


Осталось перекодировать наш html-файл, добавив в него какой-либо подсчет числа запусков, либо ограничение на дату, либо ограничение на количество обрабатываемых данных. И наша защищенная от недобросовестных клиентов демо-версия программы готова!

 

Программная часть

Идею прятанья запросов в web-документ я постарался воплотить в обработке, которую прилагаю. Она помогает не заморачиваться с javascript и избежать части ручной работы. В качеств перекодировщика предлагается HTML Guardian 7, Trial, входящий в состав обработки. При первом запуске будет предложено его установить. То, что он триал и добавляет рекламу на страничку - не страшно: мы ведь не хотим показывать наш html-документ, наоборот, мы хотим его прятать :)

 

 

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

Важно отметить пару моментов:

1. Текст запроса не должен содержать кавычек

2. Если в функции требуются дополнительные параметры, то их нужно перечислить через запятую в колонке «Доп. Параметры функции»

Собственно, на этом - все. Сохраняем наш проект, генерируем html-файл с уже готовым скриптом. Осталось только внести корректировку в программу, которая заключается в

1. Добавлении макета с нашим html-документом

2. Инициализацией его при открытии

3. Замене текстов запросов на обращения к скриптам html

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

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

 

Если ваш запрос предполагает параметры, то их необходимо поместить в список и передать на вход скриптовой функции (см. спецификацию).

Самое приятное - перекодировка! Посмотрите, во что превратился самый простой запрос из прилагаемого шаблона:

Думаете, это легко будет восстановить? Попробуйте!

Изюминкой Golden Key Prototype является то, что не предлагается методов ограничения использования авторских обработок. Но дается возможность каждому автору реализовать свой уникальный метод. Конечно, здесь пригодилось бы знание javascript. Думаю, желающие вполне освоят создание простейших скриптов за один вечер.

Буду рад услышать конструктивные предложения всех заинтересованных коллег.

Хочу обратить внимание на слово "Prototype" в названии. Все это придумывалось и делалось за одну ночь, потому как срочно потребовалось одному клиенту с шаловливыми ручонками не дать  возможности использовать обработку, не заплатив ;)

Поэтому, не судите строго.

 



История обновлений

Версия 1.01

1. Добавлено тестирование на корректность текстов запросов
2. Убрал колонку "С параметрами". Она не нужна, поскольку достаточно проанализировать текст запроса на наличие символа "&"
3. Добавлена колонка с дополнительными переменными

Тестирование на корректность текстов запросов помогает выявить возможные ошибки при построении html-файла. Для запуска тестирования просто нажмите кнопку с ключиком на панели кнопок, либо выберите соответствующий пункт в меню «Действия»

Дополнительные переменные могут потребоваться, в случае, если, например, текст запроса состоит из нескольких частей:

ВЫПОЛНИТЬ
Выразить(Таблица.Наименование КАК Строка("+Дл+")) КАК Наименование

В этом случае, нужно указать параметр Dl в колонке дополнительных параметров, а текст запроса переписать:

ВЫПОЛНИТЬ
Выразить(Таблица.Наименование КАК Строка("+Dl.toString()+")) КАК Наименование

 

 

 

 

 

 

 

 

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Golden Key 8.1 Prototype v1.01
.zip 9,18Mb
12.02.13
296
.zip 9,18Mb 296 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Анатолий (Yasen) 30.03.10 09:30
Отлично!
Но если у клиента отключен JS?
2. Олег Пономаренко (O-Planet) 30.03.10 09:31
(1) Хочет посмотреть демку - включит :)
3. Dmitry Afanasyev (afanasko) 30.03.10 12:32
5. Валерий Агеев (awa) 31.03.10 00:49
Думаете, это легко будет восстановить? Попробуйте!

Попробовал. Получилось.
Может надо как-то по особенному настраивать HTML Guardian?
O-Planet, не мог бы ты выложить какую-нибудь готовую защищенную обработку? Или хотя бы зашифрованный тобой html-файл?
6. Валерий Дубовой (Valerich) 31.03.10 04:43
Очень интересно, надо взять на заметку
7. Олег Пономаренко (O-Planet) 31.03.10 05:52
(5) А это как если не секрет? :) Я что-то в сети мало нашел инфы про дешифрование гуардиана.
8. Олег Пономаренко (O-Planet) 31.03.10 05:58
Если кому-то кажется что HTML Guardian - не серьёзно, то всегда можно выбрать любой из имеющихся в сети шифровальщиков: http://www.securitylab.ru/software/1232/

(А интересно, получится наложить один на другой? :) )
9. Олег Пономаренко (O-Planet) 31.03.10 05:59
Кстати, обновил обработку. Появилась возможность контроля корректной совместимости текстов запроса с html и более продвинутые возможности по подготовке файлов.
10. Олег Пономаренко (O-Planet) 31.03.10 08:30
Блин. Досадное недоразумение... В спецификации были перепутаны местами аргументы в методе "Добавить" у списка. Голову сломал, прежде чем нашел. Исправил...
11. Валерий Агеев (awa) 31.03.10 09:41
(7) Ты опять наступаешь на те же грабли, что и в голден кее для семерки. Любое шифрование подразумевает под собой момент дешифровки. Чтобы браузер смог отобразить HTML-страничку, она должна быть расшифрована.

Впрочем, я в этих всяких веб-технологиях ничего не понимаю.
У меня стоит Google Chrome (нравится мне он очень!), открыл в нем сформированную с помощью HTML Guardian страничку, полюбовался на сплошные рекламы, и открыл через меню "Управление текущей страницей" - "Разработчикам" - "Консоль JavaScripts". И, о чудо!, вижу там расшифрованный исходный текст HTML странички. Свою функцию увидел я там в таком виде:
// \u043F\u0440\u0438\u043C\u0435\u0440
function awa(z)
{
  var t="\u0412\u042B\u0411\u0420\u0410\u0422\u042C\n"+
" \u0421\u0441\u044B\u043B\u043A\u0430 \u041A\u0410\u041A \u0421\u0441\u044B\u043B\u043A\u0430\n"+
"\u0418\u0417\n"+
" \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442.\u0417\u0430\u044F\u0432\u043A\u0430\u041D\u0430\u041F\u043E­\u043A\u0443\u043F\u043A\u0443 \u041A\u0410\u041A \u0417\u0430\u044F\u0432\u043A\u0430\u041D\u0430\u041F\u043E­\u043A\u0443\u043F\u043A\u0443";
  z.\u0422\u0435\u043A\u0441\u0442=t;
  var Res=z.\u0412\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C();
  return Res;
}
...Показать Скрыть

Ну тут понятно, русские буквы заменены на их коды в кодировке Unicode. Написав маленькую обработку по преобразованию такого текста я получил
// пример
function awa(z)
{
  var t="ВЫБРАТЬ\n"+
" Ссылка КАК Ссылка\n"+
"ИЗ\n"+
" Документ.ЗаявкаНаПокупку КАК ЗаявкаНаПокупку";
  z.Текст=t;
  var Res=z.Выполнить();
  return Res;
}
...Показать Скрыть

В общем слов нет. Как и защиты.
12. Олег Пономаренко (O-Planet) 31.03.10 10:24
(11) Ты вот скажи, от юзеров оно защитит? 100%! Даже гуардиан. Но я ведь написал, что он - не окончательный вариант. Имеются более интересные перекодировщики. Сейчас подготовлю одну коммерческую разработку, как ты и просил, и попробуй... ;)
13. Олег Пономаренко (O-Planet) 31.03.10 12:44
(11) Вот по этой ссылке http://www.belkamag.ru/index.php?priceorg:download качай "Прайс-органайзер 8.1". Типа программка, как и обещал...
14. Валерий Агеев (awa) 31.03.10 12:46
(12) Для защиты от простых юзеров пойдет и пароль на модуль. По крайней мере пока, твоя защита не кажется сильнее пароля на модуль. Однако, подождём обещанную защищенную коммерческую разработку.
15. Валерий Агеев (awa) 31.03.10 14:26
(13) Вскрылось на ура!
Макет1 у тебя - это HTML, закрытый каким-то PowerHTML.
Вот, для примера, одна из функций:
// ПолучитьСвойствоХарактеристики
function f_5619496224619844(z,Par)
{
  if(!GG_UU000)
    return Null;
  var t="ВЫБРАТЬ\n"+
"СвойстваОбъектов.Ссылка\n"+
"ИЗ\n"+
"ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов\n"+
"ГДЕ\n"+
"СвойстваОбъектов.Наименование = &Наименование\n"+
"И СвойстваОбъектов.НазначениеСвойства = &НазначениеСвойства\n"+
"И (НЕ СвойстваОбъектов.ПометкаУдаления)";
  z.Text=t;
  var tek;
  for(var k=0; k<Par.Count(); k++)
  { 
    tek=Par.Get(k);
    z.SetParameter(tek.Presentation,tek.Value);
  }
  var Res=z.Execute();
  z.Text="";
  return Res;
}
...Показать Скрыть

Если разрешишь, выложу все))

Макет2 - внешняя обработка с запароленным модулем, в котором одна функция:
Функция ВыполнитьКоманду(МояСтрока) Экспорт
	Результат = Неопределено;
	Выполнить(МояСтрока);
	Возврат Результат;
КонецФункции
...Показать Скрыть


Ну и сам внешний отчет с запароленным модулем....

Этого достаточно? Так как УТ у меня нет, то твой отчет я ни разу не запускал, и в чем состоит ограничение (а так же, что он делает)- понятия не имею. Или надо разобраться до конца?
СергейКа; mba1979; venger; +3 Ответить 3
16. vip (vip) 31.03.10 14:53
(15) Так его, болезного.
(0) Опять на Golden Key нашелся Ferrous Lock? :D
17. Александр Венгер (venger) 31.03.10 17:59
18. Олег Пономаренко (O-Planet) 01.04.10 01:30
(15) Ты крут и монстЁр :D Что ж, так и придется самому писать перекодировщик js, поскольку не умеют буржуи ничего. И еще 30 у.е. за такое просят. Впрочем, смею предположить, что не все смогут так легко найти то, что хотят. И потому это остается в силе: "Golden Key 8.1 Prototype с успехом может использоваться для защиты демо-версий недорогих коммерческих разработок." Но, как выяснилось, не на Инфостарте, потому как тут сидит awa...

(16) Да я и рад, в общем-то. Мне лучше здесь увидеть все, чем от клиентов получать сюрпризы. И у меня есть идейки, как все это обойти. Только нужно время. Вот ты скажи, почему в "коммерческих" шифраторах html нельзя было не тупо шифровать текст, а хотя бы динамически его формировать в процессе выполнения скрипта? Как пример - сделать виртуальную скрипт-машину, исходный код заменить набором смайликов, и по ним выполнять сценарий? NTKrnl так и работает, в общем-то...

(17) Ты ваще не в теме...
19. Александр Венгер (venger) 01.04.10 13:50
(18) Семки на галерке заканчиваются;-)
20. Drock (d.snissarenko) 05.04.10 13:41
:idea: Даешь starforce в каждую обработку.
21. Олег Пономаренко (O-Planet) 05.04.10 14:01
Так и будет... Реально, зацепил одну идею... Не хватает катастрофически времени.
22. Bacchus (Bacchus) 07.04.10 11:00
Пример 1

Процедура Кнопка1Нажатие(Элемент)
Сообщить(ЭлементыФормы.ХТМЛ.document.parentWindow.hello());
КонецПроцедуры

не работает - ЭлементыФормы.ХТМЛ.document.parentWindow.hello() возвращает COMОбъект

Пример 2 не работает - та же ерунда.

ну и сама обработка тоже не работает.
JS-разрешил , проверил на хтмл файлах из примерах.

Я не спец по IE8, поэтому считаю данное решение сильно ограниченным. Больше гемора решать проблемы нерабочей обработки из-за IE у клиента, чем продать ещё пару.

Сам использую похожий способ, но без IE8, а через JS Shell. Текст скрипта в макете зашифрован самим скрипом с паролем, и если пароль не верный, то функции не работают вообще. Для триала отдельный пароль и отдельный макет со скриптом с огрниченным функционалом.
23. Александр Синцов (Sintson) 18.08.10 16:01
Хотелось бы напомнить, что 1С задумывалась как открытая система.
Думаю что демку всегда можно сделать просто вырезав ключевой функционал или просто сделать хорошую презентацию, если уж мы начинаем претендовать на оригинальные идеи.
То, что один человек сделал - другой завсегда сломать сможет (Народная мудрость).
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа