1. MR-X12.03.2025 в 17:09от
  2. D1zo12.03.2025 в 17:04от
Загрузка...

[c#] привязка по железу

Тема в разделе "С/С++/Pascal/Delphi", создана пользователем million, 04.05.2017.

  1. million

    logs x install
    million

    Статус:
    Оффлайн
    Регистрация:
    02.05.17
    Сообщения:
    57
    Репутация:
    24 +/-
    Всем Хай! Посмотрел и нашёл кучу уроков/гайдов о том, как можно осуществить привязку по железу, но они все(которые я видел) взаимодействуют с хостингом. Вообщем решил написать свою для пользователей форума.

    Плюсы данной привязки:
    Не требуется хостинг и определённых знаний/навыков в web-программировании.

    Минусы данной привязки:
    Нельзя запретить пользователю доступ к нашей программе. Вообще можно будет пошаманить, но стоит ли оно того? Тем более это будет несколько неудобно. Вообщем, прочитав далее, вы поймёте.

    Перейдём к самой привязке: Реализуется она довольно-таки просто, но нам понадобится 2-3 программы. Обо всём по порядку... Для начала создадим саму форму для авторизации (она у нас будет одна, а результат выведем в Label). Кидаем на форму TextBox, Button и Label(не обязательно, вместо него вы ставите запуск нужного вам окна).
    [​IMG]

    Далее прописываем код кнопке:
    Код:
    string Ferrum = Environment.GetFolderPath(Environment.SpecialFolder.System).Substring(0, 1);[/FONT][/COLOR][/FONT][/SIZE]
    [FONT=Arial][SIZE=14px][FONT=Verdana][COLOR=rgb(237, 237, 237)]ManagementObject Disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + Ferrum + ":\"");
    Disk.Get();
    string diskLetter = (Disk["VolumeSerialNumber"].ToString());
    string SysKey = (diskLetter.ToString());
    if (thirteenTextBox1.Text != SysKey) label1.Text = "Не верный SYS-KEY";
    else label1.Text = "Успешно";
    

    И по желанию можно добавить конструкцию try-catch. Но это не всё, так как мы будем кидать юзеру софт для получения его ID, то он сам сможет активировать себе программу и всё. Нам нужно зашифровать данный ключ:
    Код:
    try[/FONT][/COLOR][/FONT][/SIZE]
    [FONT=Arial][SIZE=14px][FONT=Verdana][COLOR=rgb(237, 237, 237)]{
        string Ferrum = Environment.GetFolderPath(Environment.SpecialFolder.System).Substring(0, 1);
        ManagementObject Disk = new ManagementObject("win32_logicalDisk.deviceid=\"" + Ferrum + ":\"");
        Disk.Get();
        string DiskLetter = (Disk["VolumeSerialNumber"].ToString());
        string SysKey = (DiskLetter.ToString());
        if (textBox1.Text != new Cipher().Codeс(SysKey, 5)) //5 - шаг сдвига
            label1.Text = "Не верный SYS-KEY";
        else label1.Text = "Успешно";
    }
    catch
    {
        label1.Text = "Ошибка";
    }

    Для шифрования мы возьмём обычный Шифр Цезаря, но вы можете выбрать иное шифрование, а потом ещё и в MD5 перевести для железобетонной надёжности:
    Код:
    class Tape[/FONT][/COLOR][/FONT][/SIZE]
    [FONT=Arial][SIZE=14px][FONT=Verdana][COLOR=rgb(237, 237, 237)]{
        string tape;
        public Tape(string symbol)
        {
            tape = symbol;
        }
        public string Replacement(string symbol, int key)
        {
            int Position = tape.IndexOf(symbol);
            if (Position == -1) return "";
            Position = (Position + key) % tape.Length;
            if (Position < 0) Position += tape.Length;
            return tape.Substring(Position, 1);
        }
    }
    class Cipher : List<Tape>
    {
        public Cipher()
        {
            Add(new Tape("A0B1C2D3E4F5G6H7I8J9KLMNOPQRSTUVWXYZ"));
        }
    
        public string Codeс(string symbol, int key)
        {
            string res = "", tmp = "";
            for (int i = 0; i < symbol.Length; i++)
            {
                foreach (Tape v in this)
                {
                    tmp = v.Replacement(symbol.Substring(i, 1), key);
                    if (tmp != "")
                    {
                        res += tmp;
                        break;
                    }
                }
                if (tmp == "") res += symbol.Substring(i, 1);
            }
            return res;
        }
    }

    [​IMG] [​IMG]

    Вообщем-то на данном этапе у нас уже есть авторизация. Теперь осталось разобраться с тем, как получить ID железа пользователя и сгенерировать ключ. Создаём программу, которую будем кидать пользователю, чтобы получить ID железа. Кидаем на форму TextBox и Button и прописываем код для кнопки:
    Код:
    try[/FONT][/COLOR][/FONT][/SIZE]
    [FONT=Arial][SIZE=14px][FONT=Verdana][COLOR=rgb(237, 237, 237)]{
        string Ferrum = Environment.GetFolderPath(Environment.SpecialFolder.System).Substring(0, 1);
        ManagementObject Disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + Ferrum + ":\"");
        Disk.Get();
        textBox1.Text = (Disk["VolumeSerialNumber"].ToString());
    }
    catch ()
    {
        textBox1.Text = "Ошибка";
    }

    Пользователь скидывает нам код, мы его шифруем и скидываем ему ключ активации. Для того, чтобы зашифровать: Кидаем на форму Button и 2 TextBox'а и прописываем код:
    Код:
    private void button1_Click(object sender, EventArgs e)[/FONT][/COLOR][/FONT][/SIZE]
    [FONT=Arial][SIZE=14px][FONT=Verdana][COLOR=rgb(237, 237, 237)]{
        try
        {
            textBox2.Text = new Cipher().Codeс(textBox1.Text, 5);
        }
        catch (Exception)
        {
            textBox1.Text = "Ошибка";
        }
    }
    class Tape
    {
        string tape;
        public Tape(string symbol)
        {
            tape = symbol;
        }
        public string Replacement(string symbol, int key)
        {
            int Position = tape.IndexOf(symbol);
            if (Position == -1) return "";
            Position = (Position + key) % tape.Length;
            if (Position < 0) Position += tape.Length;
            return tape.Substring(Position, 1);
        }
    }
    class Cipher : List<Tape>
    {
        public Cipher()
        {
            Add(new Tape("A0B1C2D3E4F5G6H7I8J9KLMNOPQRSTUVWXYZ"));
        }
    
        public string Codeс(string symbol, int key)
        {
            string res = "", tmp = "";
            for (int i = 0; i < symbol.Length; i++)
            {
                foreach (Tape v in this)
                {
                    tmp = v.Replacement(symbol.Substring(i, 1), key);
                    if (tmp != "")
                    {
                        res += tmp;
                        break;
                    }
                }
                if (tmp == "") res += symbol.Substring(i, 1);
            }
            return res;
        }
    }

    Ну как-то так... Гайд получился длинным, а способ в определённом случае неудобным, но для софта, который даётся раз и навсегда - самое то! Теперь немного поясню за шмот: Вы скидываете покупателю 2 программы, первая - программа, которую он купил, вторая - для получения ID железа. Покупатель скидывает ID железа, полученный через вторую программу, вы его зашифровываете и скидываете ему ключ активации.
    By Mathian Developer https://procoder.su
     
  2. Ino

    Ino

    Статус:
    Оффлайн
    Регистрация:
    17.12.15
    Сообщения:
    32
    Репутация:
    2.084 +/-
    Это нативный C# или с использованием каких то библиотек ?
    Да и тем более мне кажется лучше в БД хранить ключи , и при авторизации проверять их , тогда если что можно забанить лицензию будет .
     
      rivizoft нравится это.
  3. Samyrai

    Софты/сайты на заказ
    Samyrai

    Статус:
    Оффлайн
    Регистрация:
    09.06.13
    Сообщения:
    445
    Репутация:
    422 +/-
    Хоть бы допилил, для приличия, а уж потом свои копирайты ставил на слив. А так на привязку кейген написать не составит большого труда