Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Создание защиты Shareware программ


Автор: CasperSC 24.1.2010, 14:25
Смысл темы в том, что давайте поможем начинающим (мне в том числе), как создавать shareware защиту программ, конкретно генератор ключей и проверка в программе, не надо ухищрений как спрятать проверку подальше, это всё можно найти  интернете, да и думаю никто особо стараться не будет. Просто нужно на конкретных примерах показать как это делается. Я просмотрел кучу сайтов и ничего не понял, там вообще ничего толком не объясняется. Знаю только, что для это нужно пространство имён System.Security.Cryptography

например шаблон на основе которого нужен конкретный код:
Код

namespace WindowsFormsApplication1
{
    static class ProtectSoftware
    {
           static string nameUser, namePC
           //проверить совпадает ли код (например при следующей загрузке зарегистрированной программы или при первой загр.)
           //в параметрах думаю можно ещё и какую нибудь аппаратную часть привязывать
           piblic CheckUserCode(string namePC, string userName) //есди не те параметры, что нужны, то конечно же можно поменять
           {
                 
           }

           public void GenerateNewUserCode(string namePC, string userName) //также можно поменять, если что то не то
           {
                 
           }

           //получить имя ПК
           public string GetNamePC()
           {

           }

           //получить имя пользователя
           public string GetNameUser()
           {

           }
     }
}


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

private void MainForm_Load(object sender, EventArgs e)
        {
              ProtectSoftware.CheckUserCode( -//-//-, -//-//- )
        }


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

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

...
using System.Security.Cryptography;
using System.IO;
...

            //вызывать так:
            FileInfo fi = new FileInfo(@"C:\CONFIG.SYS"); 
            _fileMD5 = cGlobal.GetHashMD5FromStream(fi.OpenRead());

         //Для расчета контрольной суммы файла можно воспользоваться алгоритмом шифрования MD5.
        public static string GetHashMD5FromStream(Stream aStream)
        {
             HashAlgorithm _algMD5 = (HashAlgorithm)new MD5CryptoServiceProvider();
            byte[] _fHashMD5Client = _algMD5.ComputeHash(aStream);
            string _resultHashString = string.Empty;

            for (int i = 0; i <= _fHashMD5Client.Length - 1; i++)
            {
                _resultHashString += _fHashMD5Client[i].ToString("x2");
            }

            return _resultHashString;
        }


Если из этой темы, что нибудь выйдет и если я разбирусь с защитой, выложу более менее приличный метод защиты.

Автор: CasperSC 26.1.2010, 18:48
Неужели никто не умеет? Все программируют, все защищают, никто не умеет? Ну хоть что нибудь напишите.

Автор: mr.Anderson 26.1.2010, 18:53
Для .NET вразумительных попыток защиты кода сейчас немного. Из нормальных - это обфускация. Есть еще попытки динамической расшифровки кода, но она в стадии разработки, бешеной цены и не кроссплатформенная. Других методов пока не придумано.

Автор: ДобренькийПапаша 26.1.2010, 19:32
Я поднимал такую тему. http://forum.vingrad.ru/index.php?showtopic=286624&view=findpost&p=2069919
Собственными силами, Вы не напишите адекватной защиты.

Автор: Sfate 27.1.2010, 00:59
когда то тоже интересовался защитой кода... нашел программу, которая сжимает размер программы, путем замены некоторых значений на более простые... в итоге, просмотреть код программы тем же net.reflector уже нельзя... но полная работоспособность программы не гарантируется))

Автор: gambit 27.1.2010, 11:56
Лучше написать 2 программы, одна полная-вторая урезанная, ибо все защиты тем более в .net на ура ломаются.
Вы можете написать самую невероятную защиту, но в итоге она сведется к одному bool значению, и для работы с программой достаточно его поменять, т.е. изменить один бит и вся ваша защита падает.

Автор: CasperSC 27.1.2010, 17:21
Цитата(gambit @ 27.1.2010,  11:56)
Лучше написать 2 программы, одна полная-вторая урезанная, ибо все защиты тем более в .net на ура ломаются.
Вы можете написать самую невероятную защиту, но в итоге она сведется к одному bool значению, и для работы с программой достаточно его поменять, т.е. изменить один бит и вся ваша защита падает.

Можно сделать кучу условий и не только с bool и не в одном методе. Поверь я хоть и новичок ну не на столько глуп.

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

Автор: gambit 27.1.2010, 19:19
Цитата(CasperSC @  27.1.2010,  17:21 Найти цитируемый пост)
Можно сделать кучу условий и не только с bool и не в одном методе. Поверь я хоть и новичок ну не на столько глуп.

мне интересно на это посмотреть

Автор: CasperSC 27.1.2010, 22:55
Цитата(gambit @ 27.1.2010,  19:19)
Цитата(CasperSC @  27.1.2010,  17:21 Найти цитируемый пост)
Можно сделать кучу условий и не только с bool и не в одном методе. Поверь я хоть и новичок ну не на столько глуп.

мне интересно на это посмотреть

Работает 1 - 5 тамер(ов) Имею ввиду например пользователь вводит пароль и нажимает принять, при этом происходит ложная проверка, можно ещё при ложной проверке как нибудь повлиять на какие нибудь переменные (опять же как нибудь замудрённо, чтобы это небыло очевидно). 1 из 5-ти таймеров проверяет нажимали ли кнопку, если да, то запустить 40 таймеров, 3 - 8 из которых реально проверяют, 1 из 40 таймеров проверяет ту переменную которая была изменена при нажатии на кнопку (где производилась ложная проверка), но в разное время, например 1 через минут 20, остальные позже. и если там переменная не изменена, а программа как бы работает, то завершить программу и удалить себя с компьютера пользователя или низнаю, мож зашифроваться или заархивироваться, короче как нибудь неявно стать неработоспособной.   Да вообще можно такого бреда понаписать, что сам потом не разберёшься smile переменную с введённым паролем при вводе сразу рабивать пополам или задом наперёд, потом по таймеру создавать новую, перекидывать туда её. Хранить её в массиве таких переменных, эти переменные все разные и одна в чистом виде как вводили, но она не работает, так как в введённый код добавляется какие нибудь символы и при проверке учитывая их проверяются. Конечно я тут понаписал, но думаю такое можно вполне замутить,  в ходе написани исправлять недочёты, что-то убрать, что-то добавить. Плюс обфускатор. Можно проверять запущен ли Reflector и подобные. Короче попортить взлом ломающему, даже если сломает, то хотя бы помучается.

Автор: Любитель 27.1.2010, 23:21
Цитата(CasperSC @  27.1.2010,  22:55 Найти цитируемый пост)
Короче попортить взлом ломающему, даже если сломает, то хотя бы помучается.

Из всего, что вы написали эффективен только хороший обфускатор (с криптованием строк, с качественной обфускацией control flow, с невалидными конструкциями с точки зрения декомпилеров и т. д.). А в остальном - вы будете мучаться больше, чем взломщик. Проверка на "запущенность" рефлектора вообще убила - рефлектор это дизассемблер/декомпилятор, а не дебаггер!

Автор: gambit 27.1.2010, 23:48
Цитата(CasperSC @  27.1.2010,  22:55 Найти цитируемый пост)
запустить 40 таймеров

Правильно, поставим комп на колени.

Цитата(CasperSC @  27.1.2010,  22:55 Найти цитируемый пост)
Да вообще можно такого бреда понаписать, что сам потом не разберёшься 

Это все отсеивается в 2 секунды.


Я вам еще раз повторяю, какую бы защиту вы не написали, в итоге все сведется к
Код

if(условие)
{
код принят
}
else
{
код не принят, сжигаем комп
}

Так что все свелось к одному биту.


Цитата(CasperSC @  27.1.2010,  22:55 Найти цитируемый пост)
Работает 1 - 5 тамер(ов) Имею ввиду например пользователь вводит пароль и нажимает принять, при этом происходит ложная проверка, можно ещё при ложной проверке как нибудь повлиять на какие нибудь переменные (опять же как нибудь замудрённо, чтобы это небыло очевидно). 1 из 5-ти таймеров проверяет нажимали ли кнопку, если да, то запустить 40 таймеров, 3 - 8 из которых реально проверяют, 1 из 40 таймеров проверяет ту переменную которая была изменена при нажатии на кнопку (где производилась ложная проверка), но в разное время, например 1 через минут 20, остальные позже.

А вообще улыбнуло, реализуйте, я вам на примере покажу что это хренотень.

Добавлено через 1 минуту и 36 секунд
Цитата(CasperSC @  27.1.2010,  22:55 Найти цитируемый пост)
Работает 1 - 5 тамер(ов) Имею ввиду например пользователь вводит пароль и нажимает принять, при этом происходит ложная проверка, можно ещё при ложной проверке как нибудь повлиять на какие нибудь переменные (опять же как нибудь замудрённо, чтобы это небыло очевидно). 1 из 5-ти таймеров проверяет нажимали ли кнопку, если да, то запустить 40 таймеров, 3 - 8 из которых реально проверяют, 1 из 40 таймеров проверяет ту переменную которая была изменена при нажатии на кнопку (где производилась ложная проверка), но в разное время, например 1 через минут 20, остальные позже. и если там переменная не изменена, а программа как бы работает, то завершить программу и удалить себя с компьютера пользователя или низнаю, мож зашифроваться или заархивироваться, короче как нибудь неявно стать неработоспособной.   Да вообще можно такого бреда понаписать, что сам потом не разберёшься smile переменную с введённым паролем при вводе сразу рабивать пополам или задом наперёд, потом по таймеру создавать новую, перекидывать туда её. Хранить её в массиве таких переменных, эти переменные все разные и одна в чистом виде как вводили, но она не работает, так как в введённый код добавляется какие нибудь символы и при проверке учитывая их проверяются. Конечно я тут понаписал, но думаю такое можно вполне замутить,  в ходе написани исправлять недочёты, что-то убрать, что-то добавить. Плюс обфускатор. Можно проверять запущен ли Reflector и подобные. Короче попортить взлом ломающему, даже если сломает, то хотя бы помучается.

Дочитал до конца, я бы вас принял на работу. Мне так хочется вас уволить.

Автор: CasperSC 28.1.2010, 07:41
Код

Правильно, поставим комп на колени.


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

Код

Это все отсеивается в 2 секунды.

Не спорю, может быть, только интересно чем?

Код

А вообще улыбнуло, реализуйте, я вам на примере покажу что это хренотень.

Надо попробовать, правда генерация пароля будет полной лажей, так как не знаю как его генерировать. Мне даже интересно, может это всё и вправду хрень?

Код

Дочитал до конца, я бы вас принял на работу. Мне так хочется вас уволить.

Во первых какая работа, я только начал учить C#, да и вообще программирование в целом. Всё что я понаписал я начитался на сайтах по защите кода, правда там писали про Delphi и ещё советовали не использовать VCL (вроде) и API функции. Короче видимо мне запудрили мозги. Ну и практически всё я сочинил на ходу не обдумывая деталей. 

P.S Ну а вообще, полюбому такой способ, пусть даже не такой замудрённый всё равно доставит проблем, чем просто if(true) {} else {} вот такое думаю как раз в 5 сек и ловиться и выключается.

Вообще надо было тему назвать: Генерация ключей.
Вопрос как сгенерировать, а не то поможет ли защита такая-то. Люди если кто умеет на C# покажите пример пожалуйста. На любом форуме одно и тоже. Не ответ на вопрос, а просто обсуждение, что это всё фигня и не поможет.

Автор: CasperSC 28.1.2010, 12:01
Цитата(Любитель @ 27.1.2010,  23:21)
Цитата(CasperSC @  27.1.2010,  22:55 Найти цитируемый пост)
Короче попортить взлом ломающему, даже если сломает, то хотя бы помучается.

Проверка на "запущенность" рефлектора вообще убила - рефлектор это дизассемблер/декомпилятор, а не дебаггер!

Да  smile  что-то меня это тоже убило, когда перечитал внимательно. У меня же есть этот самый Reflector. Сам смотрел им код после обфускации.


Ещё раз спрошу: Как сгенерировать код на основе 3 - ёх каких либо строк, например имя ПК - Пользоватея - ещё что нибудь?

Автор: gambit 28.1.2010, 14:47
Цитата(CasperSC @  28.1.2010,  12:01 Найти цитируемый пост)
Ещё раз спрошу: Как сгенерировать код на основе 3 - ёх каких либо строк, например имя ПК - Пользоватея - ещё что нибудь? 

самый элементарный md5(имяПК + серийный номер любой платы)

Я только не понимаю, какую защиту вам даст получение ключа у пользователя. Мне всегда казалось что это мы должны пользователю ключ давать, а не он нам.

Добавлено через 2 минуты и 54 секунды
Или схема такая?
Программа генерит код, отсылает его вам, потом вы присылаете его пользователю, он вводит и удивляется - как это вы создали код который только на этом компе работает?

Автор: CasperSC 28.1.2010, 16:23
[QUOTE=gambit,28.1.2010,  14:47]
Цитата(CasperSC @  28.1.2010,  12:01 Найти цитируемый пост)

Добавлено @ 14:50
Или схема такая?
Программа генерит код, отсылает его вам, потом вы присылаете его пользователю, он вводит и удивляется - как это вы создали код который только на этом компе работает?

Слушай, а у тебя есть чувство юмора  smile 
Вот писал, для друга, он не знает как установить аську, типа учил его. Так вот обработали её 2 обфускатора, будь другом скажи такая защита ломается? По сути паролей и т.д. там нет, просто код реально прочитать? Ведь если его можно прочитать, то и защиту как я понимаю сломать? http://narod.ru/disk/17349523000/Protected%20-%20No%20sounds.rar.html

Вообще-то, надо, чтобы только на его компе работал этот ключ, а как иначе? Он просто его выложит где нибудь и всё.

Автор: gambit 28.1.2010, 17:26
Цитата(CasperSC @  28.1.2010,  16:23 Найти цитируемый пост)
Слушай, а у тебя есть чувство юмора

Стараемся  smile  smile  smile  smile 


Цитата(CasperSC @  28.1.2010,  16:23 Найти цитируемый пост)
Так вот обработали её 2 обфускатора, будь другом скажи такая защита ломается?

1. Помнишь фильм, я к сожалению не помню как он называется, там труп попросили 2 раза проформалинить. Вот 2 обфускатора, напомнили мне именно этот момент.

Цитата(CasperSC @  28.1.2010,  16:23 Найти цитируемый пост)
просто код реально прочитать

в этом нет смысла

Цитата(CasperSC @  28.1.2010,  16:23 Найти цитируемый пост)
Ведь если его можно прочитать, то и защиту как я понимаю сломать?

если можно прочитать код, то можно вскрыть, но это не значит, что если код прочитать не удается, то вскрыть невозможно.

Цитата(CasperSC @  28.1.2010,  16:23 Найти цитируемый пост)
Вообще-то, надо, чтобы только на его компе работал этот ключ, а как иначе?

Цитата(CasperSC @  28.1.2010,  16:23 Найти цитируемый пост)
Он просто его выложит где нибудь и всё.

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

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

Я так и не понял в чем вопрос?
а) как защитить код от просмотра?
б) как защитить копию программы?
в) как создать ключ?
Давайте все таки определим ветвь дискуссии. 

Автор: CasperSC 29.1.2010, 11:22
Цитата(gambit @  28.1.2010,  17:26 Найти цитируемый пост)
Цитата(CasperSC @  28.1.2010,  16:23 )Так вот обработали её 2 обфускатора, будь другом скажи такая защита ломается?1. Помнишь фильм, я к сожалению не помню как он называется, там труп попросили 2 раза проформалинить. Вот 2 обфускатора, напомнили мне именно этот момент.


нет ну просто 1-ый обфускатор работает не полностью, точнее программы не работают, если в нём в настройках все пункты выбрать, ну типа защита по максимуму. Так вот программы работают, если выбрать только 2 пункта:
1) Strings obfuscation
2) Control Flow obfuscation.

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


Цитата(gambit @  28.1.2010,  17:26 Найти цитируемый пост)
Я так и не понял в чем вопрос?а) как защитить код от просмотра?б) как защитить копию программы?в) как создать ключ?Давайте все таки определим ветвь дискуссии. 


А чё толку? Никто всё равно конкретного кода не приводил и видимо не приведёт. Я только понял, что видимо меня не очень поняли, когда  я просил показать как генерировать код имел ввиду как сгенерировать код наподобии - FD4RT-SD5GN-QP9K0-AV1W1 Ну как бы хотел узнать как это делают профессионалы, а не тупо пробовать "перемешивать" строки и т.д. На основе namespace System.Security.Cryptography хотелось бы научиться это делать.

Мне предлагали на одном форуме использовать CPU ID (ага знать бы как его получить).

Автор: ДобренькийПапаша 29.1.2010, 13:39
CasperSC, Вы Криса Касперски читали? Если нет, почитайте (Касперски "Отладка без исходных текстов"), увидите как ломаются программы написанные на С++, даже такие которые пишут отличные системные программисты. После этого у Вас отпадут глупости по поводу защиты .NET.

Автор: gambit 29.1.2010, 17:51
Цитата(CasperSC @  29.1.2010,  11:22 Найти цитируемый пост)
как сгенерировать код наподобии - FD4RT-SD5GN-QP9K0-AV1W1

1. Любой генератор паролей
2. Используйте GUID
3. хеш от оборудования

Но при 3 варианте, будьте готовы к разборкам, в стиле, пользователь сменил комп или компонент - прога больше не работает.

Цитата(CasperSC @  29.1.2010,  11:22 Найти цитируемый пост)
System.Security.Cryptography

В этом пространстве, собраны все таки классы для шифрования данных, а не защиты проги.

Цитата(CasperSC @  29.1.2010,  11:22 Найти цитируемый пост)
использовать CPU ID (ага знать бы как его получить).

http://forum.vingrad.ru/topic-119723.html
правда там про делфи, но почитайте, вам будет интересно.
но для этого надо писать функции, работы с памятью, что приводит к тому, что c# только мешается.

Добавлено через 5 минут и 30 секунд
Цитата(CasperSC @  29.1.2010,  11:22 Найти цитируемый пост)
нет ну просто 1-ый обфускатор работает не полностью, точнее программы не работают, если в нём в настройках все пункты выбрать, ну типа защита по максимуму. Так вот программы работают, если выбрать только 2 пункта:
1) Strings obfuscation
2) Control Flow obfuscation.

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

вам как будто жалко, что в ваш код заглянут.

Кроме того, вся прелесть .net в последующем использовании компонентов программы.
Например, я написал обалденную прогу для работы с БД на WinForm. Пока писал формы стали не модными, стало модно WPF или web. В этом случае я просто пишу UI и подключаю библиотеку для работы с БД, все прога готова. При обфусификации, подключить библиотеку уже довользо затруднительно, значит надо искать и достовать ее исходник, а если исходник потерял, то писать заново.

Добавлено через 12 минут и 3 секунды
Цитата(gambit @  29.1.2010,  17:51 Найти цитируемый пост)
использовать CPU ID (ага знать бы как его получить).

А вообще посмотрите класс diagnostic, может там что и найдете, но врятли

Автор: gambit 29.1.2010, 18:09
Вообще, защита программ, на мой взгляд, это больше юридический аспект, нежели технический.

Цитата(ДобренькийПапаша @  29.1.2010,  13:39 Найти цитируемый пост)
Касперски "Отладка без исходных текстов"

Еще почитайте Майкл Ховард "Защищенный код"
там правда основной упор на другое, но по поводу взлома кое что есть

Добавлено через 2 минуты и 28 секунд
а в этой статье
http://www.cracklab.ru/art/?action=view&id=350

разбор программы после обфусификации

Автор: AGENTxXx 5.2.2010, 21:59
Ребята, а каким образом можно дописать в exe файл какие ни будь данные и не повредить его? т.е. есть 2 exe файла которые написанны на C#. Нужно чтобы один добавил данные в другой. Это реально? Пишу по теме, так как думаю как разработать тоже защиту

Автор: Любитель 5.2.2010, 22:33
Цитата(AGENTxXx @  5.2.2010,  21:59 Найти цитируемый пост)
Ребята, а каким образом можно дописать в exe файл какие ни будь данные и не повредить его?

В случае с .Net-ом вообще всё просто. Если программно - я бы рекомендовал Mono.Cecil. Если "вручную" - Reflector+Reflexil (последний использует тот же Mono.Cecil).

Автор: AGENTxXx 5.2.2010, 22:44
Не, не с помощью лезть во внутрь, а с помощью отдельного exe файла который тоже сам пишешь

Автор: Любитель 5.2.2010, 23:26
Цитата(AGENTxXx @  5.2.2010,  22:44 Найти цитируемый пост)
Не, не с помощью лезть во внутрь, а с помощью отдельного exe файла который тоже сам пишешь 

 smile 

Посмотри туториалы по Mono.Cecil - там всё просто. Загружаешь сборку, ищешь нужный класс, нужный метод, берёшь для его Body CilWorker и делаешь с инструкциями что угодно.

Автор: AGENTxXx 5.2.2010, 23:53
Спасибо! Чет ни чего, кроме Обфускации не нашел по поводу хорошей защиты. Хотя если подумать... долго подумать, то найдется все равно хороший метод который бы защитил от взлома. Например, придумали ведь шифрование с помощью открытого и закрытого ключа. И ведь пипец как долго его ломать, если приличной длины брать. Тут нужно что ни будь похожее по своей защите реализовать бы

Автор: AGENTxXx 6.2.2010, 01:04
Вот, хорошая статья. Как защитить прогу (любую). Конечно тоже не 100% но время взлома точно увеличит: http://www.z-oleg.com/secur/articles/progprotect.php

Автор: Любитель 6.2.2010, 12:01
"Не используйте стандартные функции" - сурово... "Ассеблер, ассемблер" - у нас же .Net вроде?
В целом - стандартные, отчасти очевидные, отчасти маниакальные и.. вообщем-то бессмысленные советы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)