Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как защитить программу с помощью ключа, Помогизащитить программу с помощью ключа 
V
    Опции темы
Zakhar_Shan
  Дата 4.4.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

Репутация: 1
Всего: 2



Добрые люди, искал по форуму, но без особого конкретного результата.
Нужно написать модуль генерирования лицензионного ключа.
Как я хочу это сделать:
Ключ должен генерится исходя из каких либо постоянных данных, которые на разных машинах – разные (например id компа, который как достать я тоже пока не знаю smile ).
Зачем мне это нужно (кому не интересно может не читать):
Преподу написал программу для решения транспортной задачи на сети (Математика, Логистика…), а она хочет, чтоб эту прогу студенты только использовали для проверки задач в аудитории, и не брали домой, отсюда и решил: 
1.    Прога при первом запуске будет запрашивать ключ, выдавая id компа.
2.    Препод берёт id компа, и вводит его в программу-генератор (который будет только у него).
3.    Генератор генерит ключик
4.    Препод вводит ключик в прогу, прога записывает ключик в реестр, и при каждом запуске сравнивает его генерируя ключик от id компа у себя.
И всё в ажуре!!!
 smile  smile 
Сильно мудрёно тоже не надо, так как студенты у нас далеко не гении во взломе.

Помогите ПЛИЗЗЗЗЗ!!! smile 
PM MAIL   Вверх
mes
Дата 4.4.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Zakhar_Shan @  4.4.2009,  20:11 Найти цитируемый пост)
Сильно мудрёно тоже не надо, так как студенты у нас далеко не гении во взломе.

а не проще в таком случае просто записывать (без всяких зависимостей на железо) в реестр (программой активизатором) какое либо id, разрешающее запуск Вашей проги на данном компе  ?  



--------------------
PM MAIL WWW   Вверх
Zakhar_Shan
Дата 4.4.2009, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

Репутация: 1
Всего: 2



Цитата(mes @ 4.4.2009,  21:22)
Цитата(Zakhar_Shan @  4.4.2009,  20:11 Найти цитируемый пост)
Сильно мудрёно тоже не надо, так как студенты у нас далеко не гении во взломе.

а не проще в таком случае просто записывать  в реестр  какое либо id, разрешающее запуск Вашей проги на данном компе  ?

Ну не такие же тупые smile 
PM MAIL   Вверх
Anikmar
Дата 4.4.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Zakhar_Shan @  4.4.2009,  21:28 Найти цитируемый пост)
Ну не такие же тупые   

Думаете они будут дизассемблировать и смотреть как устроена зашита? Ключ можно спрятать так, что не зная где он - не найдешь.
PM MAIL ICQ   Вверх
Zakhar_Shan
Дата 4.4.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

Репутация: 1
Всего: 2



Цитата(Anikmar @  4.4.2009,  21:33 Найти цитируемый пост)
Думаете они будут дизассемблировать и смотреть как устроена зашита? Ключ можно спрятать так, что не зная где он - не найдешь. 

... не знаю, я бы на месте студента первым делом иска запись в реестре ну например: jv16 PowerTools'ом, но большое спасибо за вариант smile 


PM MAIL   Вверх
Anikmar
Дата 4.4.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(Zakhar_Shan @  4.4.2009,  21:43 Найти цитируемый пост)
я бы на месте студента первым делом иска запись в реестре

Вопрос вот только какую?
PM MAIL ICQ   Вверх
Zakhar_Shan
Дата 4.4.2009, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

Репутация: 1
Всего: 2



Цитата(Anikmar @  4.4.2009,  21:55 Найти цитируемый пост)
Вопрос вот только какую? 

Был у мя случай, когда программер один, написал прогу, а разрешал только пользоваться избранным, так я эту прогу к себе скопировал, и каспера на неё нацелил (помоему был 6й), сказал касперу чтоб следил за ней, а он мне при её запуске выдал сообщение об обращение по пути... далее дело за малым, посмотреть на компе где программа запускается сто в этом пути...
Anikmar, спасибо большое за вариант, если больше ничего дельного не покажут, чтож smile 
PM MAIL   Вверх
vikaz
Дата 4.4.2009, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 10
Всего: 12



Придумать можно все что угодно. Anikmar прав, не обязательно же обзывать ключ в реестре как называется твоя программа. Придумай какое нибудь заумное имя и никто никогда не найдет, если им сильно этого не захочется. Вот только если у них окажется один такой ключ, который разблокирует твою защиту, то они надут его в реестре легко.
Да и если она им очень сильно понадобятся, а они не знают, как её взломать, то я думаю что у кого нибудь найдется знакомый, который это умеет и поменяв несколько бит в исполняемом модуле, они получат полную и работоспособную программу.

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

Еще метод - аппаратный ключ защиты. Вот к примеру ссылка на один такой: http://senselock.ru/
Но как мне кажется не для твоего варианта, а то студенты стырят его и все..... smile



--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Zakhar_Shan
Дата 4.4.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

Репутация: 1
Всего: 2



Дело в том, что я сужу по себе.
Тот метод который предлагает Anikmar, я бы взломал без особых проблем (конечно если бы знал что прога так защищена, что прибовляет плюсов этому методу)
С TCP ну вообще не практиковался, но это не проблема, дело в том, что сетка у нас в универе уж сильно хреновая, и помоему даже комп препода толком вней и не стоит.
Возится с Битами в исполняемом модуле... Теоритически понимаю, но практичски... вот это ооочень сложно.

Добавлено через 4 минуты и 47 секунд
Вот что то нашёл, вроде оно, но толком не разберу, да и C# не очень знаю, может кто поможет перевести если это оно:
Код

  /// <summary>
    /// Generates a 16 byte Unique Identification code of a computer
    /// Example: 4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9
    /// </summary>
    public class FingerPrint  
    {
        private static string fingerPrint = string.Empty;
        public static string Value()
        {
            if (string.IsNullOrEmpty(fingerPrint))
            {
                fingerPrint = GetHash("CPU >> " + cpuId() + "\nBIOS >> " + 
            biosId() + "\nBASE >> " + baseId()
                            //+"\nDISK >> "+ diskId() + "\nVIDEO >> " + 
            videoId() +"\nMAC >> "+ macId()
                                     );
            }
            return fingerPrint;
        }
        private static string GetHash(string s)
        {
            MD5 sec = new MD5CryptoServiceProvider();
            ASCIIEncoding enc = new ASCIIEncoding();
            byte[] bt = enc.GetBytes(s);
            return GetHexString(sec.ComputeHash(bt));
        }
        private static string GetHexString(byte[] bt)
        {
            string s = string.Empty;
            for (int i = 0; i < bt.Length; i++)
            {
                byte b = bt[i];
                int n, n1, n2;
                n = (int)b;
                n1 = n & 15;
                n2 = (n >> 4) & 15;
                if (n2 > 9)
                    s += ((char)(n2 - 10 + (int)'A')).ToString();
                else
                    s += n2.ToString();
                if (n1 > 9)
                    s += ((char)(n1 - 10 + (int)'A')).ToString();
                else
                    s += n1.ToString();
                if ((i + 1) != bt.Length && (i + 1) % 2 == 0) s += "-";
            }
            return s;
        }
        #region Original Device ID Getting Code
        //Return a hardware identifier
        private static string identifier
        (string wmiClass, string wmiProperty, string wmiMustBeTrue)
        {
            string result = "";
            System.Management.ManagementClass mc = 
        new System.Management.ManagementClass(wmiClass);
            System.Management.ManagementObjectCollection moc = mc.GetInstances();
            foreach (System.Management.ManagementObject mo in moc)
            {
                if (mo[wmiMustBeTrue].ToString() == "True")
                {
                    //Only get the first one
                    if (result == "")
                    {
                        try
                        {
                            result = mo[wmiProperty].ToString();
                            break;
                        }
                        catch
                        {
                        }
                    }
                }
            }
            return result;
        }
        //Return a hardware identifier
        private static string identifier(string wmiClass, string wmiProperty)
        {
            string result = "";
            System.Management.ManagementClass mc = 
        new System.Management.ManagementClass(wmiClass);
            System.Management.ManagementObjectCollection moc = mc.GetInstances();
            foreach (System.Management.ManagementObject mo in moc)
            {
                //Only get the first one
                if (result == "")
                {
                    try
                    {
                        result = mo[wmiProperty].ToString();
                        break;
                    }
                    catch
                    {
                    }
                }
            }
            return result;
        }
        private static string cpuId()
        {
            //Uses first CPU identifier available in order of preference
            //Don't get all identifiers, as it is very time consuming
            string retVal = identifier("Win32_Processor", "UniqueId");
            if (retVal == "") //If no UniqueID, use ProcessorID
            {
                retVal = identifier("Win32_Processor", "ProcessorId");
                if (retVal == "") //If no ProcessorId, use Name
                {
                    retVal = identifier("Win32_Processor", "Name");
                    if (retVal == "") //If no Name, use Manufacturer
                    {
                        retVal = identifier("Win32_Processor", "Manufacturer");
                    }
                    //Add clock speed for extra security
                    retVal += identifier("Win32_Processor", "MaxClockSpeed");
                }
            }
            return retVal;
        }
        //BIOS Identifier
        private static string biosId()
        {
            return identifier("Win32_BIOS", "Manufacturer")
            + identifier("Win32_BIOS", "SMBIOSBIOSVersion")
            + identifier("Win32_BIOS", "IdentificationCode")
            + identifier("Win32_BIOS", "SerialNumber")
            + identifier("Win32_BIOS", "ReleaseDate")
            + identifier("Win32_BIOS", "Version");
        }
        //Main physical hard drive ID
        private static string diskId()
        {
            return identifier("Win32_DiskDrive", "Model")
            + identifier("Win32_DiskDrive", "Manufacturer")
            + identifier("Win32_DiskDrive", "Signature")
            + identifier("Win32_DiskDrive", "TotalHeads");
        }
        //Motherboard ID
        private static string baseId()
        {
            return identifier("Win32_BaseBoard", "Model")
            + identifier("Win32_BaseBoard", "Manufacturer")
            + identifier("Win32_BaseBoard", "Name")
            + identifier("Win32_BaseBoard", "SerialNumber");
        }
        //Primary video controller ID
        private static string videoId()
        {
            return identifier("Win32_VideoController", "DriverVersion")
            + identifier("Win32_VideoController", "Name");
        }
        //First enabled network card ID
        private static string macId()
        {
            return identifier("Win32_NetworkAdapterConfiguration", 
                "MACAddress", "IPEnabled");
        }
        #endregion
    }





Это сообщение отредактировал(а) Zakhar_Shan - 4.4.2009, 22:29
PM MAIL   Вверх
mes
Дата 4.4.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Zakhar_Shan @  4.4.2009,  20:28 Найти цитируемый пост)

Ну не такие же тупые smile  

зашифруйте свой ключ относительно ключа винды. 

см. [HKey_Local_Machine/Software/Microsoft/WindowsNT/CurrentVersion] 
в частности  [HKey_Local_Machine/Software/Microsoft/WindowsNT/CurrentVersion/WPAEvents] 

Это сообщение отредактировал(а) mes - 5.4.2009, 00:37


--------------------
PM MAIL WWW   Вверх
Zakhar_Shan
Дата 4.4.2009, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

Репутация: 1
Всего: 2



Цитата(mes @  4.4.2009,  22:41 Найти цитируемый пост)
зашифруйте свой ключ относительно ключа винда. 

Неплохо mes, спасибо, идея good  smile 
Но вопрос не относительно чего фиксировать, а как получить из этого что то типа: 4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9


Это сообщение отредактировал(а) Zakhar_Shan - 4.4.2009, 22:48
PM MAIL   Вверх
mes
Дата 5.4.2009, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Zakhar_Shan @  4.4.2009,  21:47 Найти цитируемый пост)
Но вопрос не относительно чего фиксировать, а как получить из этого что то типа: 4876-8DB5-EE85-69D3-FE52-8CF7-395D-2EA9

если я правильно понял Ваш вопрос :
возьмите строку в 16 символов, зашифруйте ее относительно ключа, и представьте каждый код символа в 16ричном виде - в итогe 32 цифры, или 8 пар по 4 цифры.





Это сообщение отредактировал(а) mes - 5.4.2009, 10:54


--------------------
PM MAIL WWW   Вверх
Zakhar_Shan
Дата 5.4.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

Репутация: 1
Всего: 2



Цитата(mes @  5.4.2009,  00:36 Найти цитируемый пост)
... зашифруйте ее относительно ключа, и представьте каждый код символа.... 

Так вот как её шифрануть?????


PM MAIL   Вверх
mes
Дата 5.4.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



самый простой способ проXORить .. при повторении операции происходит дешифровка.



--------------------
PM MAIL WWW   Вверх
Zakhar_Shan
Дата 5.4.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 14.6.2007
Где: Тюмень

Репутация: 1
Всего: 2



Цитата(mes @  5.4.2009,  13:10 Найти цитируемый пост)
самый простой способ проXORить .. при повторении операции происходит дешифровка.


... ага, во как... ладно сэнкс mes, будем XORить....
ещё бы знать как э то...

Это сообщение отредактировал(а) Zakhar_Shan - 5.4.2009, 13:20
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1493 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.