Попытка разобраться с временным лицензированием приложений магазина

Автор Тема: Попытка разобраться с временным лицензированием приложений магазина  (Прочитано 56798 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Блин я даже скачать не знаю как :-(
Заходишь сюда:
https://github.com/ADN-DevTech/EntitlementAPI
Жмешь Clone or download -> Download ZIP
Или вот это: https://codeload.github.com/ADN-DevTech/EntitlementAPI/zip/master
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BearDyugin

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Александр Ривилис, спасибо, всё получилось, даже ObjectARX скачал, чтоб путь к нему указать. Кстати, без ObjectARX ни как, нельзя какую-нибудь из установленного AutoCAD папку указать?

Ещё вот такое сообщение показывает, якобы есть не обязательные строки?


Я так понял вот сюда нам тольок нужно прописать путь к своему приложению и можно компилировать?
Код - C# [Выбрать]
  1.  String appID = "<appstore.exchange.autodesk.com:Your App id>";
Как можно изменить код, чтобы это значение стало передаваемым в функцию аргументом? Чтоб раз скомпилировать и пользоваться для разных приложений.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не проверял, но думаю что должно быть так:
Код - C# [Выбрать]
  1.  String appID = "<appstore.exchange.autodesk.com:" + args[0].Value.ToString() + ">";
В функцию должен быть передан как минимум один строчный аргумент.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BearDyugin

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Не проверял, но думаю что должно быть так:
Код - C# [Выбрать]
  1.  String appID = "<appstore.exchange.autodesk.com:" + args[0].Value.ToString() + ">";
В функцию должен быть передан как минимум один строчный аргумент.
Что-то ему так не нравится :-(


Код - C# [Выбрать]
  1. // (C) Copyright 2015 by Microsoft
  2. //
  3. using System;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.DatabaseServices;
  7. using Autodesk.AutoCAD.Geometry;
  8. using Autodesk.AutoCAD.EditorInput;
  9. using RestSharp;
  10. using RestSharp.Authenticators;
  11. using RestSharp.Contrib;
  12. using System.Net;
  13. // This line is not mandatory, but improves loading performances
  14. [assembly: CommandClass(typeof(EntitlementAPI_AutoCAD.MyCommands))]
  15.  
  16. namespace EntitlementAPI_AutoCAD
  17. {
  18.  
  19.     // This class is instantiated by AutoCAD for each document when
  20.     // a command is called by the user the first time in the context
  21.     // of a given document. In other words, non static data in this class
  22.     // is implicitly per-document!
  23.     public class MyCommands
  24.     {
  25.  
  26.         static private bool verifyEntitlement(string appId, string userId)
  27.         {
  28.             // REST API call for the entitlement API.
  29.             // We are using RestSharp for simplicity.
  30.             // You may choose to use other library.
  31.  
  32.             // (1) Build request
  33.             var client = new RestClient();
  34.             client.BaseUrl = new System.Uri("https://apps.exchange.autodesk.com");
  35.  
  36.             // Set resource/end point
  37.             var request = new RestRequest();
  38.             request.Resource = "webservices/checkentitlement";
  39.             request.Method = Method.GET;
  40.  
  41.             // Add parameters
  42.             request.AddParameter("userid", userId);
  43.             request.AddParameter("appid", appId);
  44.  
  45.             // (2) Execute request and get response
  46.             IRestResponse<EntitlementResult> response = client.Execute<EntitlementResult>(request);
  47.  
  48.             // Get the auth token.
  49.             bool isValid = false;
  50.             if (response.Data != null && response.Data.IsValid)
  51.             {
  52.                 isValid = true;
  53.             }
  54.  
  55.             //  
  56.             return isValid;
  57.         }
  58.  
  59.        
  60.  
  61.         [LispFunction("TestEntitlementLisp", "TestEntitlementLisp")]
  62.         public int TestEntitlement_Lisp(ResultBuffer args) // This method can have any name
  63.         {
  64.             Document doc = Application.DocumentManager.MdiActiveDocument;
  65.             Editor ed = doc.Editor;
  66.  
  67.             //app id
  68.             //replace your App id here...
  69.             //contact appsubmissions@autodesk.com for the App Id
  70.             String appID = args[0].Value.ToString();
  71.             // String appID = "<appstore.exchange.autodesk.com:Your App id>";
  72.  
  73.  
  74.             //Steps to get the user id
  75.             String userID = Application.GetSystemVariable("ONLINEUSERID") as String;
  76.  
  77.             //Not logged in with Autodesk Id, hence we can not get user id
  78.             if (userID.Equals(""))
  79.             {
  80.                 ed.WriteMessage("Entitlement API check failed. Please log-in to Autodesk 360\n");
  81.  
  82.                 //you can choose to return any number like 100 for fail & 200 for pass..
  83.                 return 0;
  84.             }
  85.  
  86.             bool isValid = verifyEntitlement(appID, userID);
  87.  
  88.  
  89.             if (isValid)
  90.             {
  91.                 //User has downloaded the App from the store and hence is a valid user...
  92.                 ed.WriteMessage("\nEntitlement API check successful \n");
  93.                 ed.WriteMessage("User can use the App\n");
  94.             }
  95.             else
  96.             {
  97.                 //Not a valid user. Entitlement check failed.  
  98.                 ed.WriteMessage("Not a valid user. Entitlement API check failed\n");
  99.                 return 0;
  100.             }
  101.  
  102.             return 1;
  103.         }
  104.  
  105.         //command to be called
  106.  
  107.         [CommandMethod("ADNPLUGINS", "NETAppCommand", CommandFlags.Modal)]
  108.         static public void TestEntitlement_NET()
  109.         {
  110.             //if (!verifyEntitlement())
  111.             //{
  112.             //    return ;
  113.             //}
  114.             Document doc = Application.DocumentManager.MdiActiveDocument;
  115.             Editor ed = doc.Editor;
  116.  
  117.             //app id
  118.             //replace your App id here...
  119.             String appID = "appstore.exchange.autodesk.com:adncopyprotectiondemoapp_windows32and64";
  120.  
  121.             //Steps to get the user id
  122.             String userID = Application.GetSystemVariable("ONLINEUSERID") as String;
  123.  
  124.             //Not logged in with Autodesk Id, hence we can not get user id
  125.             if (userID.Equals(""))
  126.             {
  127.                 ed.WriteMessage("Entitlement API check failed. Please log-in to Autodesk 360\n");
  128.  
  129.                 //you can choose to return any number like 100 for fail & 200 for pass..
  130.                 return;
  131.             }
  132.  
  133.             bool isValid = verifyEntitlement(appID, userID);
  134.  
  135.            
  136.             if (isValid)
  137.             {
  138.                 //User has downloaded the App from the store and hence is a valid user...
  139.                 ed.WriteMessage("\nEntitlement API check successful \n");
  140.                 ed.WriteMessage("User can use the App\n");
  141.             }
  142.             else
  143.             {
  144.                 //Not a valid user. Entitlement check failed.  
  145.                 ed.WriteMessage("Not a valid user. Entitlement API check failed\n");
  146.                 return ;
  147.             }
  148.            
  149.  
  150.             //continue the function
  151.             return ;
  152.         }
  153.  
  154.     }
  155.  
  156.     class EntitlementResult
  157.     {
  158.         public String UserId { get; set; }
  159.         public String AppId { get; set; }
  160.         public bool IsValid { get; set; }
  161.         public String Message { get; set; }
  162.  
  163.     }
  164.  
  165. }


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Был не прав. Вместо:
Код - C# [Выбрать]
  1. String appID = args[0].Value.ToString();
должно быть:
Код - C# [Выбрать]
  1. String appID = args.AsArray()[0].Value.ToString();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BearDyugin

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Александр Ривилис, да всё заработало, спасибо!
Такой ещё вопрос, там в коде если пользователь не вошёл в учётку возвращается nil и сообщение в ком строку, там на любое действие сообщения отправляются. убрать их не проблема.
И предварительно проверить тоже не фопрос
Код - Auto/Visual Lisp [Выбрать]
  1. (if (eq (getvar 'onlineuserid) "")
  2.   (alert "\n Пожалуйста, войдите в учётную запись Autodesk")
  3. (TestEntitlementLisp "app _id")
  4. )
Но может user не очень опытный и в душе не представляет как в неё входить...
При запуске "входа"  в комстроку ни какой команды не передается...

Или опять из Lisp это окно ни как не вызвать?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Но может user не очень опытный и в душе не представляет как в неё входить...
Лучше с таким не иметь дела. Боюсь, что и в остальном с ним будут проблемы.
Или опять из Lisp это окно ни как не вызвать?
Лучшее из того, что я смог придумать, это запустить команду _ONLINEOPTIONS
Правда если он такой неопытный, то он дальше не поймёт что ему вводить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BearDyugin

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Лучше с таким не иметь дела. Боюсь, что и в остальном с ним будут проблемы.
Пользователей нужно всяких любить :-)

Такой ещё вопрос возник, как проверить есть ли вообще доступ к интернету? Лучше конечно через Lisp, но на краяняк будем пробовать в NET функцию это засунуть.

Off-Topic: показать
Всех с новым годом!
Каникулы, для меня самое любимое время, когда можно спокойно по-программировать, пока не отвлекает, ни основная работа, ни пользователи...

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Цитировать
Такой ещё вопрос возник, как проверить есть ли вообще доступ к интернету?
в Win API есть функция InternetGetConnectedState. достучаться до нее можно практически с любого языка программирования. вот только смысла в этом нет в данном случае никакого :)
но самый простой, ну и самый правильный - это попытаться достучаться до какой-нить страницы в инете с заранее известным адресом (тоже функция WinAPI InternetCheckConnection).
чаще всего пытаются достучаться до поисковиков: гугл, яндекс,... в текущей мировой обстановке это не всегда срабатывает (поисковики могут быть под баном). но и это в данном конкретном случае не важно. у тебя уже есть адрес, который точно существует и к нему точно есть доступ (каким-то ж образом именно с этого адреса человечек получил инсталляционный пакет программы). функция verifyEntitlement как-раз занимается достукиванием до этого адреса. посмотри под дебагом на переменную response при выключенном интернете и при включенном. по поводу того, что функция вызывается после того, как получен userID, а проверка наличия интернета нужна намного раньше - а кто мешает вызвать эту функцию для userID="000" или "12345". для проверки коннекта достаточно знать, что пришел возврат от этой функции (естественно, саму функцию нада будет модернизировать, т.к. она возвращает сейчас false и если нет коннекта, и если коннект есть, но пользователь лицом не вышел :) )


ну и вдогонку, описалово класса, к которому принадлежит переменная response http://developer.intersoftsolutions.com/display/crosslightapi/IRestResponse+Interface

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Такой ещё вопрос возник, как проверить есть ли вообще доступ к интернету?
1. Зачем?
2. А если интернет есть, а конкретные сайты / IP заблочены или самим пользователем, или админами, или провайдером, то к какой категории это отнести?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн BearDyugin

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Николай Горлов, спасибо за совет, люблю твои посты читать они обычно длинные и интересные. Но ссылка не работает :-(

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

А вот в случаи покупки приложения "навсегда" нужно предусмотреть и оффлайн проверку.

А если интернет есть, а конкретные сайты / IP заблочены или самим пользователем, или админами, или провайдером, то к какой категории это отнести?
Спасибо так и на писал, либо с интернетом беда, либо к админу бегите :-)

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

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using RestSharp;
  8. using RestSharp.Authenticators;
  9. using RestSharp.Contrib;
  10. using System.Net;
  11. // This line is not mandatory, but improves loading performances
  12. [assembly: CommandClass(typeof(EntitlementAPI_AutoCAD.MyCommands))]
  13.  
  14. namespace EntitlementAPI_AutoCAD
  15. {
  16.  
  17.     // This class is instantiated by AutoCAD for each document when
  18.     // a command is called by the user the first time in the context
  19.     // of a given document. In other words, non static data in this class
  20.     // is implicitly per-document!
  21.     public class MyCommands
  22.     {
  23.  
  24.         static private int verifyEntitlement(string appId, string userId)
  25.         {
  26.             // (1) Build request
  27.             var client = new RestClient();
  28.             client.BaseUrl = new System.Uri("https://apps.exchange.autodesk.com");
  29.  
  30.             // Set resource/end point
  31.             var request = new RestRequest();
  32.             request.Resource = "webservices/checkentitlement";
  33.             request.Method = Method.GET;
  34.  
  35.             // Add parameters
  36.             request.AddParameter("userid", userId);
  37.             request.AddParameter("appid", appId);
  38.  
  39.             // (2) Execute request and get response
  40.             IRestResponse<EntitlementResult> response = client.Execute<EntitlementResult>(request);
  41.  
  42.             // Get the auth token.
  43.             int isValid;
  44.             if (response.Data == null)
  45.                 isValid = 0;
  46.             else
  47.                 if (response.Data.IsValid)
  48.                 isValid = 1;
  49.             else isValid = 2;          
  50.  
  51.             //  
  52.             return isValid;
  53.         }
  54.  
  55.        
  56.  
  57.         [LispFunction("TestEntitlementLisp", "TestEntitlementLisp")]
  58.         public int TestEntitlement_Lisp(ResultBuffer args) // This method can have any name
  59.         {
  60.             Document doc = Application.DocumentManager.MdiActiveDocument;
  61.             Editor ed = doc.Editor;
  62.  
  63.             //app id          
  64.             String appID = args.AsArray()[0].Value.ToString();
  65.            
  66.             //Steps to get the user id
  67.             String userID = Application.GetSystemVariable("ONLINEUSERID") as String;
  68.  
  69.             int isValid = verifyEntitlement(appID, userID);
  70.                      
  71.             return isValid;
  72.         }
  73.  
  74.         //command to be called      
  75.  
  76.     }
  77.  
  78.     class EntitlementResult
  79.     {
  80.         public String UserId { get; set; }
  81.         public String AppId { get; set; }
  82.         public bool IsValid { get; set; }
  83.         public String Message { get; set; }
  84.  
  85.     }
  86.  
  87. }
  88.  


Код - Auto/Visual Lisp [Выбрать]
  1. (defun Check_Valid (app_id Russ / user_id user_name result pass)
  2.                                         ;(Check_Valid "7024841255247590068" t)
  3.   (setq user_id   (getvar 'onlineuserid)
  4.         user_name (getvar 'onlineusername)
  5.         pass      (strcat
  6.                     "HKEY_CURRENT_USER\\Software\\BearDyugin\\"
  7.                     app_id
  8.                   )
  9.   )
  10.   (cond
  11.     ((eq user_id "")
  12.      (if Russ
  13.        (alert
  14.          "\nПожалуйста, войдите в учётную запись Autodesk, \nдля проверки права на использование приложения \n\nА затем запустите приложение повторно."
  15.        )
  16.        (alert
  17.          "\nPlease log in to the Autodesk account \nto verify the right to use the application. \n\nAnd then run the application again"
  18.        )
  19.      )
  20.     )
  21.     ((not user_id)
  22.      (if Russ
  23.        (alert
  24.          "\nК сожалению ваша версия AutoCAD не поддерживается."
  25.        )
  26.        (alert
  27.          "\nUnfortunately your version of AutoCAD is not supported."
  28.        )
  29.      )
  30.     )
  31.     (TestEntitlementLisp
  32.      (setq result (TestEntitlementLisp app_id))
  33.      (cond
  34.        ((eq result 0)                   ;Нет интернета
  35.         (or
  36.           (eq (vl-registry-read
  37.                 pass
  38.                 user_id
  39.               )
  40.               "Ok"
  41.           )
  42.           (if Russ
  43.             (alert
  44.               (strcat
  45.                 "    "
  46.                 user_name
  47.                 ", к сожалению, мы не смогли получить доступ к сайту https://apps.exchange.autodesk.com
  48. \n    Проверьте пожалуйста ваше интернет соединении,
  49. \n    Либо обратитесь к вашему системному администратору.
  50. "
  51.               )
  52.             )
  53.             (alert
  54.               (strcat
  55.                 "    "
  56.                 user_name
  57.                 ", unfortunately, we could not access the site https://apps.exchange.autodesk.com
  58. \n    Please check your Internet connection,
  59. \n    Either ask your system administrator for help."
  60.               )
  61.             )
  62.           )
  63.         )
  64.        )
  65.        ((eq result 1)                   ;Пользователь наш!
  66.         (or
  67.           (eq (vl-registry-read
  68.                 pass
  69.                 user_id
  70.               )
  71.               "Ok"
  72.           )
  73.           (vl-registry-write
  74.             pass
  75.             user_id
  76.             "Ok"
  77.           )
  78.         )
  79.        )
  80.        ((eq result 2)                   ;Пользователь не наш :-(
  81.         (if Russ
  82.           (alert
  83.             (strcat
  84.               "    "
  85.               user_name
  86.               ", к сожалению, мы не нашли вас в базе купивших данное приложение.
  87. \n    Проверьте пожалуйста, возможно при покупке вы использовали другой аккаунт.
  88. \n    Если вы считаете, что произошла ошибка, свяжитесь со мной: BearDyugin@gmail.com"
  89.             )
  90.           )
  91.           (alert
  92.             (strcat
  93.               "    "
  94.               user_name
  95.               ", unfortunately, we did not find you in the database who bought this application.
  96. \n    Please check, maybe you used a different account when purchasing.
  97. \n    If you think that an error has occurred, please contact me: BearDyugin@gmail.com"
  98.             )
  99.           )
  100.         )
  101.        )
  102.      )
  103.     )
  104.   )
  105. )

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Цитировать
они обычно длинные и интересные
постараюсь и в этот раз оправдать оказанное доверие :):):)

Цитировать
Но ссылка не работает :-(
:o как не работает. я вот только что по ней и правой и левой кнопкой клацал - открывает в новом окне. потом скопировал текст ссылки в буфер и вставил в новое окно браузера. тоже открылась страница.

Цитировать
верю что проще было бы всё это засунуть в один Net
увы, тут могу не согласиться. всё написанное на .net (exe,dll) с легкостью можно превратить обратно в проект (даже не в одинокий cs файл, а в полноценный проект с ресурсами). тут вроде бы уже поднимался где-то этот вопрос, так что подробно описывать не буду. скажу только, что есть существенная разница между бинарным исполняемым файлом (например, С++ вариант реализации) и файлом инструкций (C#). бинарный файл - это машинный асемблер, а файл инструкций - это просто слегка ужатый исходный проект в одном файле. следовательно, чтоб разобраться в работе C# dll или exe, нужен простой декомпилятор (кажись даже в поставку самой студии входит, но могу ошибаться), кружка кофе и минимальные знания как сбилдить декомпилированный проект и запустить его под отладчиком. и сразу станет понятно, ЧТО функция должна вернуть, чтоб программа работала исправно. потом, например, затираются внутренности функции и остается только return 100500; :). компилируется и подменяется исходный файл. так что в .net и автодеск и майкрософт советуют писать то, что не жалко. и почаще вставлять комментарии с копирайтами :):):), но никак не защиту

Цитировать
В общем получились вот такие функции
1. не проверяется хоть какая-то контрольная сумма dll, а значит её можно просто подменить
2. в dll можно передать не только appId но и userId, т.к. он уже известен до запуска функции
3. редирект в файле hosts (C:\windows\system32\drivers\etc\) и, например, Apache безболезненно убивают этот вариант автодесковской защиты.
4. а вот что будет, если скопировать ветку реестра полнофункциональной программы на другой комп, отключить там инет и запустить программу?

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

-------------------------------------------------------------------------
если уж говорить об онлайн проверке, то без СВОЕГО сервера с таблицей минимум из двух полей: например, UUID материнской платы и userId не обойтись.
а автодесковский вариант защиты нужен лишь для того, чтоб была возможность автоматически добавить набор (UUID - userId) на свой сервер.
например, логика может быть такой. изначально идет проверка по UUID-userId на своем сервере. если ничего не нашло запускаем автодесковский вариант. если автодесковский вариант разрешил работать, добавляем в таблицу на своем сервере пользовательские UUID-userId.

варианты обработки своей таблицы:
- есть UUID, userId правильный - работаем
- есть UUID, userId другой - не работаем
- есть UUID, userId пустой - работаем, т.к. пользователь просто вышел из автодесковского аккаунта
- левый UUID, userId правильный - тут на твое усмотрение. если желаешь разрешить одному купившему запускать на нескольких компах, тогда считаем, сколько раз userId встречается в таблице и если меньше чем разрешено, автоматом добавили, иначе - пиши письмо разработчику, т.к. ты уже запускал эту программу на другом компе. ну и после письма нужно просто убить строку из таблицы, чтоб её можно было автоматом пересоздать для нового UUID.

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

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

Это я к чему так подробно... прочитал личное сообщение от 11.11.2017 :). Извиняй, исходниками поделиться не могу, но логику тут описал. ток я пользуюсь не только UUID. там еще есть серийник монитора, HDD с установленной виндой и серийники планок оперативки. естественно, всё адаптируется под частичную замену оборудования, но купив 1 лицензию не получится разобрать комп так, чтоб вышло 2 лицензии :):):)

Оффлайн BearDyugin

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Николай Горлов, спасибо за развёрнутый ответ.

Но я вот думаю, а есть смысл на столько заморачиваться с защитой? Ну сколько этих хацкеров? И тем более при желание ломают всё!

Я согласен, что обладая определённым уровнем знаний в программировании это и не такие уж заморочки (тобой описанный алгоритм)


Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 238
  • Карма: 34
Цитировать
Но я вот думаю, а есть смысл на столько заморачиваться с защитой?
для пятибаксовых программ - нет, т.к. строчек кода защиты будет раз в надцать больше, чем строчек кода самой программы. а учитывая особенность C#, такую защиту можно рассматривать как подарок для тех, кто не желает писать защиту самостоятельно :):):). скачал демку программы, декомпилировал dll, вставил к себе исходники слегка модернизировав.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
для пятибаксовых программ - нет, т.к. строчек кода защиты будет раз в надцать больше, чем строчек кода самой программы. а учитывая особенность C#, такую защиту можно рассматривать как подарок для тех, кто не желает писать защиту самостоятельно . скачал демку программы, декомпилировал dll, вставил к себе исходники слегка модернизировав.
Такая защита определённо лучше, чем совсем без неё.
Как уже неоднократно отмечалось (и здесь тоже): разработка системы защиты по трудозатратам может превысить разработку основной программы. Со временем, возможно, это будет иметь смысл. Но на начальных этапах можно и по-простому. В большинстве случаев, те кто сумеют снять защиту, способны самостоятельно написать аналогичное приложение. И предпочтут именно это и сделать, чем разбираться в чужом коде или использовать его как "чёрный ящик".