От Hello world - к защите конфигураций за 1 минуту

19.05.12

Разработка - Математика и алгоритмы

Вы всегда хотели но боялись создать COM объект? Тогда мы идем к вам! С обычным блокнотом, где будем программировать на c#, и таймером ...

Всё более менее значимое рождается на стыке технологий. Не достаточно обладать знаниями только в одной области, чтобы перестать быть винтиком в большом механизме разработки ПО. Если вы хотите сделать что-то, что заметят, и что сможет повторить не каждый, то самый верный путь – комбинировать подходы из разных областей знаний, и чем неожиданнее, тем может получиться удачнее. Или наоборот… 

 

Секси # 
 

 

Знакомство со всем новым хорошо начинать под чьим-то доминирующим руководством. Мне с quick start помогла моя замечательная коллега, которая знакома с Microsoft Visual C# достаточно хорошо. Пара часов приватного программирования – и я уже опытный. Скажу сразу: первое знакомство оставило самые приятные впечатления. С# оказался доступным, приятным, необычным, волнующим, экстравагантным, э… языком программирования.

Собственно, для начала достаточно всего лишь знать – с чего начинать и в каком направлении двигаться, и дальше само пойдет.

Для закрепления материала я нашел заказик на c# для какого-то московского ночного клуба. Это дало необходимую практику, потому что учиться чему-то лучше тогда, когда это кто-то спонсирует, чего и всем желаю...

 

Cтарт #

 

Я вспоминаю, как много раз откладывал изучение нового языка и платформы, потому что их тутор оказывался слишком уж правильным и полным. А хочется, прочитав пару страниц, все понять и начать что-то писать. Поэтому, я не буду строго придерживаться установленных определений, я даже не гарантирую, что мое изложение материала правильное. Но я гарантирую, что, прочитав все до конца, вы напишите свою первую программу на C#, причем, в обычном блокноте, и не просто программу, а полнофункциональный com-сервер, который сможете затем запустить из под 1С…

 

И так, для работы нам потребуются:

  1. Блокнот. Т.е., программа NotePad, кто еще не понял (кто сейчас задумался, где её взять – ставим минус к этой статье!)
  2. .Net Framework 2.0 или выше (в состав его уже входит компилятор c#)

Обычно фреймворк тот или иной у большинства юзеров на компьютере уже имеется, поэтому ничего устанавливать не придется. Для софт меньшинств – ссылка: 

Скачать .NET Framework 3.5

 

C #

 

Для начала работы с C# про него нужно знать несколько фактов:

1. Это объектно-ориентированный язык, а значит, объект и станет главным понятием при программировании на нем. Иными словами, вся программа – это определение какого-то объекта, в состав которого входят другие объекты, в состав которых входят третьи, и т.д.

Выглядит это так:

 

namespace Work
{
   class Program
   {
      …
      class MyClass1
      {
         …
      }
      …
      class MyClass2
      {
         …
      }
      …
   }
}

 

2. C# - это просто еще один язык программирования, и без огромного набора объектов из библиотеки .Net Framework, которые можно очень легко подключать и использовать, C# был бы практически не интересен.

Для подключения чего-то из библиотек .Net мы просто добавляем в начало нашей программы определение пространства имен (namespase), где в .Net это что-то лежит:

using System;
using System.IO;
using Directory;
И т.д.

Конечно, нужно знать, где и что в библиотеках .Net лежит. Для этого пользуем справочники по >net Framework и свой накопленный в процессе опыт. 

Nubic #

 

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

А = 2012;

Когда мы определяем объект, то привязываем к «переменной» еще и методы, как с данными, что в ней хранятся, работать.

А.УстановитьГод(2012);

Т.е., объект – это логически оправданное объединение данных (кучи переменных, или полей, или еще говорят - свойств) и методов работы с ними (при этом, все свойства объекта по определению видны в его методах).

 

Hello, world #

 

И так, у нас C# есть, блокнот есть, с объектами мы определились, пора уже что-нибудь написать…

Мы будем использовать вывод информации в консоль (т.е., не в windows-окно). Объект Console, связанный с таким выводом на экран, находится в библиотеках .Net в пространстве имен System. Т.е., первая строка нашей программы должна сделать доступным это пространство имен. И, собственно, нам потребуется только один метод объекта Console, а именно Write().

using System;
namespace Work
{
    public class Program
    {
       static void Main() // основная рабочая функция
       {
          Console.Write("Hello, world!"); // Пишем
          Console.ReadLine(); // Ждем нажатия Enter
       }
    }
}

 

 

Это должно у нас получиться в блокноте. Сохраняем в myprogram.cs. Компилируем с помощью компилятора c#

csc.exe myprogram.cs

Если не запустилось, то ищем csc.exe. Обычно оно лежит в C:\WINDOWS\Microsoft.NET\Framework\ v3.5\ Для простоты можно скопировать наш файл туда и там выполнить компиляцию. (Увернулся от летящего помидора…)

Запускаем в режиме эмуляции DOS. Радуемся жизни.

 

Hello, class #

 

Все то же самое, но пробуем создать и использовать свой класс: 

 

using System;
namespace Work
{
    public class Program
    {
       static void Main() // основная рабочая функция
       {
          AClass A=new AClass(); // Создаем экземпляр своего класса
          A.Greeting("Олег"); // Обращаемся к его методу
       }

       private class AClass // Определяем наш класс
       {
          public void Greeting(string Name) // Определяем его метод Greeting
          {
             Console.Write("Hello,"+Name); // Пишем
             Console.ReadLine(); // Ждем нажатия Enter
          }
       }
    }
}
 
Hello, DLL #

 

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

В нашей DLL мы определяем некий метод, который хотим использовать для суммирования двух чисел. При этом, результат хотим сохранить внутри нашего DLL, и когда нужно- восстановить.

 

using System;
using System.Runtime.InteropServices;

namespace Work
{
    public interface MyInterface // Интерфейс нашей библиотеки
    {
       int Summa(int a, int b); // В нашем распоряжении – два метода. Тут мы их просто опишем
       int Memory();
    }

    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Server: MyInterface // Класс – потомок интерфейса.

// Значит, он должен содержать методы, описанные в интерфейсе
    {
       int buf;

       public int Summa(int a, int b) // А тут мы определяем описанные в интерфейсе методы
       {
          int res=a+b;
          buf=res;
          return res;
       }

       public int Memory()
       {
          return buf;
       }

    }
}

 

 

Ничего сложного. Язык интуитивно понятен.

Правда, теперь команда компиляции будет несколько иной:

csc.exe \target:library myprogram.cs

Появилась myprogram.dll. Регистрируем ее в системном реестре.

regasm myprogram.dll /cosebase

Если кому интересно, что такое это регасм – отвечу: это нечто, что наш dll делает видимым для других программ. Кому такого объяснения мало – прыгаем сюда и читаем много всего о regasm


Hello, 1С #

 

На самом деле, мы только что создали свой первый com-сервер на c#. Осталось проверить, как он работает в 1С.

Открываем конфигуратор, создаем внешнюю обработку и по нажатию клавиши выполняем:

Объект=Новый COMОбъект(“Work.Server”);
Сообщить(Объект.Summa(2,3));
Сообщить(Объект.Memory());

Проверяем, пляшем.

 
Crypto 1С #

 

Практическое применение com-технологий одинэсник может найти, например, в защите своих авторских прав. Как в прошлом примере мы передавали на вход нашего метода «Summa» числа, так я могу, например, передать объект «Запрос», инициализировать и выполнить его внутри dll, потом стереть текст запроса и возвратить только результат.

Таким образом, пользователь не увидит, что делает мой запрос, и без моей dll программа работать не будет. Осталось добавить некий подсчет числа запусков, или контроль даты запуска, и вот вам защита триал-версии!

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

Этот метод защиты ООО «О-Планет» давно и успешно использует в наших коммерческих решениях под «восьмерку», и при желании мы готовы бесплатно поделиться нашими наработками. ;)

 

Сцуко #

 

Поражает то, что с каждым разом видишь все больше и больше заказов сделать что-то на .Net с помощью VC#. Кажется, мелкомягкие на этот раз постарались: платформа получилась для разработчика проще, чем конфигуратор 1С, намного проще, чем Delphi а с учетом того, что это все-таки и С, и полноценное ООП – еще и продвинутее их обоих. К тому же, имеется бесплатные полнофункциональные версии ПО. А значит, и стоимость конечного продукта не зависит от числа приобретенных платформ, что очень радует.

На месте разрабов 1С я бы версию 1С:Предприятие 9 сделал ни как отдельную платформу, а как библиотеку классов для Microsoft Visual C#. Не 1С, так кто-то другой однажды такое сделает, и у 1С определенно настанут сложные времена…

 

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1870    stopa85    12    

34

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4660    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7650    4    SpaceOfMyHead    17    

56

Обфускатор байт-кода

Защита ПО и шифрование Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

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

10 стартмани

16.06.2022    10472    81    ZhokhovM    12    

41

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7925    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4545    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8932    John_d    73    

46
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
71. agulaev 33 27.05.12 23:34 Сейчас в теме
(70) vladen, Все работает! (проверь пути, кавычки и слеши)
Автору - Зачет! Познавательно.
72. kmar 28.05.12 04:27 Сейчас в теме
Интереснейшая статья, почитать можно.
90. fixin 4253 29.05.12 11:03 Сейчас в теме
Предлагаю переместиться с нашим интересным холиваром сюда: http://forum.infostart.ru/forum1/topic62249/
MaxDavid; +1 Ответить
102. пользователь 05.06.12 13:13
Сообщение было скрыто модератором.
...
103. ValeriVP 1308 06.06.12 16:20 Сейчас в теме
кто о чем, а лысый о расческе :)

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

...между делом ... кто-то приз обещал...

я решил описать, как НЕ СЛЕДУЕТ защищать конфигурации. Тут про это есть несколько роликов: http://www.1c-zk2.ru/articles/vskrytie-zasity-konfiguracij-1s


Хотя вообще методика использования разных инструментов в 1С лично для меня очень интересна - это делает возможности 1С практически не ограниченными
104. O-Planet 6432 06.06.12 23:38 Сейчас в теме
(103) Приз отправлен.

Но поскольку метод взлома не указан, то это все ниачом. Я предложил взломать ЭКСПЕРИМЕНТАЛЬНУЮ версию, которая только отлаживается, ни где официально не презентавалась. Мне и нужно было, чтобы кто-то протестировал. Такое было и для 7.7. Первоначально там присутствовала досадная недоработка: метод, возвращающий код функции использовал тот же алгоритм шифрования, что и метод, возвращающий строку. В результате, достаточно было просто переставить названия методов, чтобы получить код функции. В процессе обсуждения и отладки это все вычистили.

Твой взлом был бы зачетным, если бы ты опроверг жизнеспособность самого подхода. Но есть огромная вероятность, что ты просто воспользовался недостатками текущей реализации, которые легко исправить.
105. ValeriVP 1308 07.06.12 11:12 Сейчас в теме
(104) Я предложил тебе описание метода взлома и решение проблем защиты своих решений раз и на всегда. И совсем не дорого. Ты отказался.
Про досадные недоработки - в данном случае ненадежна сама идея защиты. Я уже рассматривал эту идею в свой статье И ещё несколько слов о защите разработок... (п.5).

С учетом особенностей платформы, используя данную технологию, и внеся изменения в систему защиты, можно только лишь в несколько раз замедлить процесс (т.е. например с 20мин до 60мин). Но не более.
25мин - текущее время на анализ и взлом - см. время в постах (45)O-Planet 22.05.12 14:06 и (47)Изменено: Rebelx - 22.05.12 14:30. Это время включает скачивание конфы по 3G, разворачивание, анализ, задавание вопросов про активацию, и получение результата - итого 24мин.
106. O-Planet 6432 07.06.12 11:50 Сейчас в теме
(105) Где описание метода взлома? Если бы оно было, то и вопросов никаких не было. Есть у меня Golden Key Prototype, выложенный здесь. Вот там привели описание метода взлома, и я тему оставил, потому что согласен, что тот вариант - тупиковый. В данном случае, твои слова - это просто слова, не подтвержденные ни чем. Я, в качестве аргумента, что метод рабочий, могу сослаться на Golden Key 7.7, который использует аналогичный подход, но взломать его не получилось пока ни у кого. А то, что ломали, как минимум, трое, у меня информация есть.
107. ValeriVP 1308 07.06.12 12:43 Сейчас в теме
(106) Я не буду выкладывать в общий доступ описание алгоритмов взлома. Но в данном случае он очень прост. Я готов дать его тебе как бонус к WA:ЗК2.
Поверь, твой протип гораздо надежнее - там надо больше времени на трансляцию html в 1С.

Если хочешь, можешь объявить конкурс по взлому Golden Key 7.7, но на большую сумму - я потрачу больше времени. Но в успехе я уверен примерно на 75%. Опишишь принципы защиты - я наверное соглашусь даже на пари - если там не используется прямое обращение к функциям dll 1C 7.7.
108. O-Planet 6432 07.06.12 12:52 Сейчас в теме
Я, как автор, разрешаю выложить механизм взлома в общий доступ. Тебе это, кстати, будет очень выгодно: у меня не останется защиты для моих разработок, и для меня самым логичным будет приобрести твое решение. Это же касается и 7.7 Ты ведь заинтересован в продвижении своего решения? По поводу 7.7 - там как раз используется прямое обращение к функциям dll ;)
109. ValeriVP 1308 07.06.12 13:13 Сейчас в теме
(108) Я не буду выкладывать в общий доступ описание алгоритмов взлома. Тем более, что GoldenKey не единственная реализация данной технологии защиты - см. И ещё несколько слов о защите разработок... (п.5) - я там GoldenKey тоже посчитал.
110. O-Planet 6432 07.06.12 13:16 Сейчас в теме
Таким образом, я предполагаю, что общей технологии взлома просто нет.
111. ValeriVP 1308 07.06.12 13:36 Сейчас в теме
(110) Есть общая технология взлома для этой технологии защиты.

Т.е. технологию защиты можно описать так:
Выполнение неизвестных запросов внутри внешнего объекта. Задача взлома - получить текст запроса.

При этом конкретная реализация совершенно не важна. От реализации может зависить только время анализа, но не общая идея взлома. Вероятность успеха - 99% при времени анализа до 4ч.
rustork; mmj14; +2 Ответить
116. mmj14 24 11.06.12 18:54 Сейчас в теме
(111) Спасибо, за подсказку, кажется, понял как производится сиё действо. :) На прямой вопрос вы бы ведь не ответили.
112. yamdj 08.06.12 18:32 Сейчас в теме
а как это все вяжется с 1С?
113. AlexO 135 10.06.12 16:09 Сейчас в теме
(112) yamdj,
а как это все вяжется с 1С?

да никак :)
ребята развлекаются.
У одного много московских денег, у другого - времени. Вот и договорились :)
114. ValeriVP 1308 10.06.12 17:21 Сейчас в теме
(113) вот я только не понял, у кого чего много...
115. AlexO 135 10.06.12 18:06 Сейчас в теме
(114) Rebelx,
а, т.е. у вас - и того, и другого? :)
117. Archikg 13.06.12 08:27 Сейчас в теме
спасибо за сие описание работы # с 1С, очень искал подобную инфу
по теме: насколько актуальна технология защиты закрытия модуля? я как-то писал модуль из набора математических алгоритмов, чтобы получить конечный код(пароль) для разовой активации конфигурации, сам текст модуля делал максимально запутанным и нечитабельным, а модуль закрыл, так вот интересна криптостойкость подобной выдумалки
119. EmpireSer 06.08.12 10:47 Сейчас в теме
Прошу прощения, но я не смог осилить столько комментариев...

Я лично против концептуальной разработки на C# для 1С. Т.е. разрабатывать коммерческие проекты с использованием любого языка из набора .NET - будет плохо для проекта:
1. Отсутствие кросплатформенности. Учитывая, что 1С при развитии так же стремиться мигрироваться на все ОС, игнорировать этот факт - плохо. Конечно можно какие-то плагины для 1С писать на разных языках программирования, но это будет черевато увеличением количества ошибок.
2. C#, VB.NET, F#, управляемый С++ - в них очень легко проанализировать Ваш код, пропатчить его. Даже обусфактором не сильно спасают положение. Единственный возможным способом защитить своё приложение на С# есть его преобразование на не управляемый код.
Хотя это тоже защита с "натяжкой", т.к. это "нависная" защита. С тем же Delphi можно любую нависную защиту усилить собственной.
122. O-Planet 6432 12.09.12 03:57 Сейчас в теме
(119) А если "код" - на сервере, а приложение - в окне браузера?
123. EmpireSer 13.09.12 09:46 Сейчас в теме
(122) O-Planet
Т.е. гоняем много лишних данных только для защиты? А что будет мешать просмотреть Ваше приложение на клиенте и его пропатчить?
А защита кода путём его размещения на сервере - универсальный метод и от используемого языка программирования не зависит.

А Вы пишете "... к защите конфигураций за 1 минуту, а тут "А если "код" - на сервере..." - тогда при чём тут заморочки с C#?
Если мы говорим только про удобство работы с разными визуально/невизуальными компонентами C# - то это удобство для программиста и не больше того.
Тут тогда можно сказать, что "Защита конфигурации - это полный переход на управляемые формы и вся работа с БД должна быть только в методах на сервере. От клиента и клиенту - только данные". Всё будет на сервере, а сервер можно защитить (в априори).

А если работать с NET платформой, то можно это делать и из языка 1С через 1С.Net:Предприятие - подключите .Net Framework к 1C через Elisy .Net Bridge

P.S. От этого COM уже просто тошнит... Ведь не зря сами Microsoft его "задвинули" и теперь во всю хвалят WCF.
120. v.a.ryag 37 11.09.12 21:28 Сейчас в теме
Интересно излагаете, много ваших статеек почитал)
121. O-Planet 6432 12.09.12 03:54 Сейчас в теме
(120) Пишу, когда что-то волнует, или заинтересовало. Значит, не меня одного.
124. tango 540 13.09.12 10:18 Сейчас в теме
(0)

На месте разрабов 1С я бы

:)

версию 1С:Предприятие 9 сделал ни как отдельную платформу, а как библиотеку классов для Microsoft Visual C#.


продавал бы - как?
125. chingiz001 26.09.12 22:41 Сейчас в теме
C:\WINDOWS\Microsoft.NET\Framework\ v3.5\csc.exe нашел. Не очень понял, как с его помощью скопмилировать myprogram.cs
131. rustork 24.02.13 04:00 Сейчас в теме
(125) chingiz001,
Два клика левой кнопкой мыши на myprogram.cs - открыть с помощью... - указать C:\WINDOWS\Microsoft.NET\Framework\ v3.5\csc.exe - В папке с myprogram.cs появится myprogram.exe
126. wunderland 201 01.10.12 11:44 Сейчас в теме
нормально так, коротко и по делу - однозначно "+"
127. maratimus 22 05.10.12 12:58 Сейчас в теме
Считаю, что если и формировать текст запроса во внешней dll, выполнять и очищать его после выполнения, то сам текст запрос можно отловить в трайсе слуля(SQL trace), а потом переформатировать в формат 1С или напрямую посылать запрос к базе данных из 1С, вывод такая защита только усложняет взлом, но не обеспечивает 100% защиты.
Для 100% защиты рекомендую использовать аппаратные ключи в которые записаны части ключевых фунций без возможности сканирования аппаратного средства(микроконтроллеры AVR поддерживают такую технологию).
Но в целом статья понравилась, можно писать свои функции которые невозможно реализовать с помощью 1С (например sleep(timeinms)).
128. vladen 83 28.11.12 12:27 Сейчас в теме
кто использует ВизуалСтудио то в свойствах основного файла проекта проследите что бы была строка [assembly: ComVisible(true)] (у меня по умолчанию false поставило).

Автору и милой девушке большое спасибо )
129. gavrikprog 117 23.02.13 18:37 Сейчас в теме
130. gavrikprog 117 23.02.13 18:53 Сейчас в теме
Раз уж на это сподобились, напишите как Native Api сделать.
А то у 1С только на c++
132. iliabvf 11.01.14 02:18 Сейчас в теме
Спасибо автору за пример, все работает.
Можно сделать не плохую защиту если совместить этот метод + обфускация + ключ защиты.
133. Garykom 16 17.07.15 01:16 Сейчас в теме
Мда уж...
защищать с помощью внешней проги (защищенной Themida), выполняющей запросы (текст запроса по id) к 1C через COM
когда сама 1С никаким образом не защищена от перехвата API-вызовов...
да и сама Themida снимается при желании...
134. rpgshnik 3645 06.03.17 10:55 Сейчас в теме
Оставьте свое сообщение