@wlastas

Как реализовать платные доп. опции в C# приложении (схема)?

Есть C# приложение с открытым исходным кодом(github.com), которое реализует базовый функционал.
Поддержка пользователей осуществляется через Discord канал (~200подписок). 99% пользователей ничего не Commit.
Приложение очень часто обновляется - условно - каждый день. Новый функционал тестируется пользователями, и часть его становится доступна по платной подписке (от 10уе в мес) 
Желательно, чтобы разные пользователи не могли юзать приложение, купленное один раз кем-то из них, а также, чтобы пользователь, оплативший опции на одно рабочее место, не мог ими воспользоваться на 10 компьютерах.
Я понимаю, что любая защита ломается - интересует вариант с "защитой от дурака" с минимальными трудозатратами. 
Возможно, в моем случае достаточна простенькая обфускация приватной части кода, но я что-то не хочу с этим связываться - паранойя?.

Вариант, который тестирую сейчас и который, вроде как, работает - очень трудозатратен для меня, так как я имею крайне скудные познания в С++. 
1. Пользователь генерит уникальный uid своего компьютера(виртуалки) открытой c# функцией и отсылает его мне.
2. На этот uid я генерю и отсылаю обратно key по которому буду идентифицировать пользователя.
3. В папку с C# докидываются нативные релизные С++ dll, в которых реализованы платные опции, функционал которых дергается через DllImport в основном c# приложении.
При этом внутри С++ dll происходит проверка валидности пользовательского key на наличие подключенных опций и соответствие key=>PC(WM) для которого он генерился и в зависимости от этого они работают или выдают мусор.

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

3. После запуска C# приложения оно в Runtime запрашивает на сервере(подписывая ключом) доп опции, и получает их в "байт коде" который на лету превращается в работающие функции.
Возможно как то через AssemblyLoadContext - к сожалению совсем не знаком с этими возможностями C#. 
Сильно ли сложно будет этот полученный "байт код" превратить в C# и задействовать в основном приложении обойдя лицензию? 
И если это прям совсем просто, может есть какие-то варианты с той же обфускацией или еще как.
  • Вопрос задан
  • 259 просмотров
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
Собственно как один из вариантов:
некий hardware-key (например серийник материнки, биоса, hdd) от юзерской машины, участвующий в дешифрации модуля
а шифруется собственно "платная" сборка

то бишь ставится обработчик currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
и в нём дешифрация и AssemblyLoad из потока дешифрации

p.s. это вольный и сильно упрощённый пересказ реализации из коммерческих систем лицензирования для шарпа
Ответ написан
Griboks
@Griboks Куратор тега C#
Сейчас тенденция идёт к тому, что вы требуете постоянного подключения к интернету, где непрерывно проверяете лицензию. Причём привязка лицензии идёт к конкретному устройству + IP. Также невозможно одновременно работать с двух разных отпечатков. Смена отпечатков требует каких-то сложных действий, например через личный кабинет или звонок в поддержку. При любых подозрениях просто обрубаете пользователя - путь обращается в службу поддержки или подождёт часик, пока интернет не дадут.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы