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


Автор: Нитонисе 10.12.2009, 11:36
Нужно установить защиту на программу, таким образом, чтобы она могла запускаться только на одном компьютере. То есть - у пользователя есть экземпляр программы, он проводит ее активацию с моей помощью, после чего он может пользоваться этой программой, но только на том компьютере, где эта программа была установлена. Как это можно реализовать?

Автор: djamshud 10.12.2009, 11:43
Можно привязаться к железу. И знать, что вас сломают.

К с++ вопрос отношения не имеет.

Автор: Нитонисе 10.12.2009, 12:03
Я пишу на С++, потому тут и разместил эту тему. На счет привязки к железу это понятно, не понятна только конкретная реализация. 

Автор: GoldFinch 10.12.2009, 12:04
Нитонисе, юзай поиск по форуму и гугл, тема - боян

Автор: xvr 10.12.2009, 13:44
Цитата

он может пользоваться этой программой, но только на том компьютере, где эта программа была установлена. Как это можно реализовать?
Со 100% надежностью - только вынеся жизненно важную часть функционала программы во внешний аппаратный (защищенный) ключ. Чисто софтово (со 100% надежностью) - невозможно

Автор: 17dufa 10.12.2009, 14:00
когда в универе делали подобную лабу привязывались к ID процессора, ID жесткого диска (не тома, а именно диска) или MAC адресу сетевухи. Если будет малейшее желание сломать такую защиту - действительно сломают, ломают даже HASP ключи smile 
*MAC сетевухи в винде, наскока мне известно, вообще мона поменять (при перезагрузке он приравнивается реальному, но во время сеанса можно поменять и все следующие запросы MAC в этом сеансе будут возвращать измененное значение). 
Какие конкретно API использовали - уже не помню, гугл в помощь. 

Автор: xvr 10.12.2009, 14:12
Вдогонку - можно привязать к конкретной Винде через CryptoAPI (см. сертификаты и хранилища ключей). Если на компе есть TPM, то наверное возможно привязаться к нему.
Но в любом случае это програмная защита, и она может быть отломана  smile 

Автор: Нитонисе 10.12.2009, 14:12
Программа не сильно важная, потому супер-мега защита не требуется. Нужна простенькая защита от мелких вредителей. То есть чтобы если вдруг кому-то захочется осуществить взлом - программа должна продержаться хотя бы день))

Добавлено через 56 секунд
Я так понимаю прописывать в реестре какие-то спец-ключи - неэффективная защита?

Автор: 17dufa 10.12.2009, 15:08
Нитонисе, смотря от кого. от тетечки гоняющей солитер - более чем smile 

Автор: GoldFinch 10.12.2009, 15:26
Цитата(xvr @  10.12.2009,  14:44 Найти цитируемый пост)
Со 100% надежностью - только вынеся жизненно важную часть функционала программы во внешний аппаратный (защищенный) ключ. Чисто софтово (со 100% надежностью) - невозможно

внешний аппаратный ключ взаимодействует с программой через кучу левого софта, поэтому ключи можно эмулировать

"софтово" - можно реализовать с большей надежностью, чем аппаратно, если код защиты нельзя будет протрассировать\перехватить

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

Добавлено через 2 минуты и 21 секунду
и да, можно защитить не "уникально для системы" а "уникально для экземпляра программы", если программа будет стучаться на серв в интернетах, который будет проверять не запущены ли где-то еще ее копии.

Автор: 17dufa 10.12.2009, 16:05
GoldFinch, а про вариант "и если код защиты может прочитать это значение только своими средствами, не вызывая системных АПИ, то такой код можно виртуализировать, и такую защиту практически невозможно будет реверсировать используя дизасм и отладку." где можно подробней почитать? что-то не совсем понимаю.

Автор: GoldFinch 10.12.2009, 16:23
17dufa, ты когданить код накрытый themidа/winlicense видел? 
это когда 30 инструкций процессора превращаются в 3миллиона инструкций

конечно если из кода накрытого ВМ вызывается АПИ, это эту АПИ можно перехватить, и примерно понять что этот код делает.
а если код не вызывает апи - его практически невозможно реверсировать.
декомпилировать ВМ у themida допустим можно, но ничто не мешает сделать ее метаморфной.

Автор: xvr 10.12.2009, 18:34
Цитата(GoldFinch @ 10.12.2009,  15:26)
Цитата(xvr @  10.12.2009,  14:44 Найти цитируемый пост)
Со 100% надежностью - только вынеся жизненно важную часть функционала программы во внешний аппаратный (защищенный) ключ. Чисто софтово (со 100% надежностью) - невозможно

внешний аппаратный ключ взаимодействует с программой через кучу левого софта, поэтому ключи можно эмулировать

Ключевое слово вынеся жизненно важную часть функционала программы во внешний аппаратный (защищенный) ключ. Т.е. ВНУТРИ ключа крутится часть программы. Для его эмуляции эту часть программы придется написать с нуля. Если эта 'часть' будет правильно выбранна, то такое 'написание с нуля' по трудозатратам будет эквивалентно вообще написанию всей программы с нуля.
Так что это не ломается.

Цитата

"софтово" - можно реализовать с большей надежностью, чем аппаратно, если код защиты нельзя будет протрассировать\перехватить
На реальном CPU это всегда можно сделать, например запустив все (вместе с Windows) под какой нибудь виртуальной машиной.

Автор: 17dufa 10.12.2009, 18:46
xvr, взаимодействие с аппаратным ключом идет через сторонний софт (в частности ОС), что мешает просто в тупую записать весь лог взаимодействия и в последствии его сэмулировать?

Хотя понял, взаимодействие недетерминировано. Но попробовать можно.

Автор: xvr 10.12.2009, 21:23
Цитата(17dufa @ 10.12.2009,  18:46)
xvr, взаимодействие с аппаратным ключом идет через сторонний софт (в частности ОС), что мешает просто в тупую записать весь лог взаимодействия и в последствии его сэмулировать?

Пример - делаем САПР для разводки печатных плат. Сам разводчик помещаем в ключ. Т.е. при старте в него заливается netlist, в конце из него читается готовая топология.
Перехватив и записав ВЕСЬ обмен данными с ключем, мы сможем сделать его эмулятор, который будет корректно разводить одну единственную плату, ту, на которой его ломали  smile 

Цитата

Хотя понял, взаимодействие недетерминировано. 
Именно

Автор: W4FhLF 11.12.2009, 09:54
xvr, а какое щас железо в ключиках? Писать целиком "жизненно важную часть" под ключ (там же ARM вроде всегда были) это тоже весьма трудозатратно. И не факт, что потом этот алгоритм будет удовлетворять требованиям. Это если сравнивать с ВМ на CPU. 

Автор: xvr 11.12.2009, 11:18
Цитата(W4FhLF @ 11.12.2009,  09:54)
xvr, а какое щас железо в ключиках? 

Какое поставят, то и будет  smile 
Цитата

Писать целиком "жизненно важную часть" под ключ (там же ARM вроде всегда были) это тоже весьма трудозатратно. 
Угу
Цитата

И не факт, что потом этот алгоритм будет удовлетворять требованиям. Это если сравнивать с ВМ на CPU.
Я же не предлагаю делать спецвычислители в ключиках для ускорения расчетов. Вопрос был про 100% надежную защиту программы. Такой ключик - это способ '100% надежной защиты', а не способ ускорения работы  smile 

Автор: DrHex 11.12.2009, 12:02
все зависит то что хочет автор, если знает заранее ключ компьютера(например ид железа) то надо будет сделать что то типо архива с паролям(ну и конечно что паролем будет именно этот ключ, а когда программа стартует то читает текущие значения ид(винчестера) сравнимает с оригинальным по CRC32 к примеру и если подходит то начинает расспаковку), но с другой стороны как узнать ключ заранее???
Конечно можно сделать саможификацию инсталяции, но если сохранят на диск то тут маленький трабыл, хотя.... 
Вообще это исскуство где нужна фантация...

Автор: xvr 11.12.2009, 12:47
Цитата(DrHex @ 11.12.2009,  12:02)
все зависит то что хочет автор, если знает заранее ключ компьютера ... то надо будет сделать что то ... но с другой стороны ... Конечно можно сделать ... то тут маленький трабыл, хотя.... 
Вообще это исскуство где нужна фантация...

 smile 
В одном маленьком королевстве жил-был король, который очень любил воевать. И очень он любил разное оружие и защиту от него. 
И пришел как то к нему изобретатель, и сказал:
- О великий король, я изобрел пушку, которая может пробить любую броню! Вот ее чертежи, - с этими словами он полез в карман, достал чертежи и вручил их королю.
Обрадовался король, велел выдать изобретателю 1000 золотых. А изобретатель достал из 2го кармана пачку чертежей и продолжил:
- А еще я изобрел броню, которую не может пробить эта пушка!
Обрадовался король, велел выдать изобретателю еще 1000 золотых. А изобретатель полез в 3й карман, достал еще пачку чертежей, и продолжил:
- А еще я изобрел пушку, которая может пробить эту броню.
Задумался король, но все же велел дать изобретателю еще 1000 золотых. А изобретатель достал из 4го кармана еще одну пачку чертежей, и сказал:
- А еще я изобрел бро...
Тут король велел страже схватить изобретатели и пересчитать, сколько у него карманов. 
- 145 штук, - пересчитала стража.
И велел король выдать изобретателю 145000 золотых, а затем немедленно казнить. 
После чего запретил заниматься изобретательством в своем королевстве под страхом смертной казни.

Автор: 29Victor29 22.12.2009, 23:01
Подскажите пожалуйста, где можно найти информацию для написания драйвера для USB-устройств ( можно под DOS , лучше на C/C++ , хотя буду рад любому предложенному Вами варианту ). 
ЗАРАНИЕ БЛАГОДАРЮ ВСЕХ ОТКЛИКНУВШИХСЯ!!!

Автор: rthsobakas 25.12.2009, 21:06
я извиняюсь что тут вмешиваюсь. Я все не читал тока начало. А что если исользовать параметры  железа(тока не говорить никому какого) как ключи при шифровании rsa. То есть прога делает откртый , закрытый ключ, потом расшифровывает прогу в память. Как -нибудь так..  smile 

Автор: kolobok0 28.12.2009, 09:52
Цитата(rthsobakas @ 25.12.2009,  21:06)
..А что если исользовать параметры  железа(тока не говорить никому какого) как ключи при шифровании rsa....

1) взять отпечаток ключа под дебагером - два пальца об асфальт.
2) в защите есть парадокс.
  а) защита нужна для коммерческого софта - иначе теряется смысл.
  б) слишком полная и правильная защита отрицательно влияет на распространение софта.

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


удачи Вам
(круглый)
ЗЫ
По поводу расшифровывания программы - см. цербер (дос)
была когда то такая софтинка для защиты.
уход от отладки, изменение среды работы, дешифровка программы на старте.
брешь - защита чужих программ smile

Автор: BEOWOLF 1.2.2010, 02:59
Цитата(17dufa @ 10.12.2009,  14:00)
когда в универе делали подобную лабу привязывались к ID процессора, ID жесткого диска (не тома, а именно диска) или MAC адресу сетевухи. Если будет малейшее желание сломать такую защиту - действительно сломают, ломают даже HASP ключи smile 
*MAC сетевухи в винде, наскока мне известно, вообще мона поменять (при перезагрузке он приравнивается реальному, но во время сеанса можно поменять и все следующие запросы MAC в этом сеансе будут возвращать измененное значение). 
Какие конкретно API использовали - уже не помню, гугл в помощь.

Да забудьте вы наконец о защите программ через ID винчестера, видеокарты и прочего железа, сколько можно писать, что эта защита - полная туфта? Поясню, почему.
Во-первых, вы договариваетесь с клиентом насчёт софта, а не обязываете его привязаться к железу. Может он захочет проапгрейдить камп, или поработать с программой дома/наработе. А может установит программу на внешний винчестер, один на всех.
Во-вторых, группе пользователей ничто не мешает установить VMWare, и спокойно пользоваться несколькими копиями программы якобы под одним и тем же железом. Именно так все и поступают в подобных случаях.
Что делать? Самый лучший вариант - когда пользователь запускает программу, то копия логинится на вашем сервере, когда закрывает программу - logout. И таким образом, лицензионные соглашения всегда будут выполняться - залогиненой сможет быть только то количество копий, о котором договаривались, и не больше, ну а запускаться они смогут с того железа, с которого удобно smile 

Автор: Abyx 4.2.2010, 14:06
BEOWOLF, не везде есть и может быть интернет.

Автор: Cтpaнник 7.2.2010, 15:58
Цитата(BEOWOLF @  1.2.2010,  02:59 Найти цитируемый пост)
Самый лучший вариант - когда пользователь запускает программу, то копия логинится на вашем сервере, когда закрывает программу - logout.

Ага. А если проге по логике ее работы доступ в Инет и нафиг не нужен, то подобная ненужная и непонятная сетевая активность вызывает паранойю у системных администраторов, и прога быстро "получает по рукам" файерволом. С соответствующими юридическими последствиями для разработчика, разумеется.

Автор: CasperSC 27.3.2010, 18:13
Цитата(Cтpaнник @  7.2.2010,  15:58 Найти цитируемый пост)
С соответствующими юридическими последствиями для разработчика, разумеется.

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

Автор: Yogurt 11.2.2011, 13:53
У меня в программе есть функция, которая берёт имя компьютера, шифрует его, и записывает в идентификационный файл. Но сама программа разблокируется только после нажатия определённой последовательности букв на клавиатуре. Нажатия перехватывает PreTranslateMessage. Затем вышеуказанная функция, и затем человек работает уже без меня
Тут единственная проблема, что удалённо программу не поставишь

Автор: Akella 11.2.2011, 15:23
Цитата(Yogurt @  11.2.2011,  13:53 Найти цитируемый пост)
У меня в программе есть функция, которая берёт имя компьютера, шифрует его, и записывает в идентификационный файл.

А если пользователь изменил имя компьютера? Всё? Переактивация?

Автор: Yogurt 14.2.2011, 14:23
Я за всю жизнь не разу не менял имя просто так. Это делается только при переустановке ОС. При это, естественно, придётся переустанавливать всё ПО.

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

Код

BOOL CAAADlg::PreTranslateMessage(MSG* pMsg) 
{
    if (pMsg->message == WM_CHAR)
    {
        password += (TCHAR)pMsg->wParam;
        if(password.GetLength() > 10)
            password = password.Right(10);

        if(password.Right(5) == L"jlvby" || password.Right(5) == L"одмин" ||
            password.Right(5) == L"JLVBY" || password.Right(5) == L"ОДМИН")
        {
            //this->GetDlgItem(IDC_BUTTON_SUPEREXPRESS)->EnableWindow(true);        
            this->GetDlgItem(IDC_BUTTON_PARAMETERS_DB)->EnableWindow(true);        
        }

        if(password.Right(8) == L"register")
        {
            FulfilRegistration();
        }

        return 1;
    }
    return CDialog::PreTranslateMessage(pMsg);
}

Автор: xvr 14.2.2011, 17:57
Цитата(Yogurt @  14.2.2011,  14:23 Найти цитируемый пост)
Я за всю жизнь не разу не менял имя просто так. Это делается только при переустановке ОС.
Это замечательно делается и без переустановки ОС.  
Цитата(Yogurt @  14.2.2011,  14:23 Найти цитируемый пост)
При это, естественно, придётся переустанавливать всё ПО.

Так что - не аргумент  smile 

Автор: Akella 28.2.2011, 11:33
Цитата(Yogurt @  14.2.2011,  14:23 Найти цитируемый пост)
Я за всю жизнь не разу не менял имя просто так. Это делается только при переустановке ОС.

Бред какой-то, извините за выражение.

Автор: Hayate 17.8.2011, 08:48
Цитата(xvr @ 10.12.2009,  18:34)
Ключевое слово вынеся жизненно важную часть функционала программы во внешний аппаратный (защищенный) ключ. Т.е. ВНУТРИ ключа крутится часть программы. Для его эмуляции эту часть программы придется написать с нуля. Если эта 'часть' будет правильно выбранна, то такое 'написание с нуля' по трудозатратам будет эквивалентно вообще написанию всей программы с нуля.
Так что это не ломается.

Можно где-нибудь почитать про проектирование таких приложений?
А то хочется попробовать у ПО с открытым исходным кодом вынести жизненно важную часть функционала на сервер в интернете.

Автор: PavelSafonov 29.1.2015, 22:51
Можно вынести жизненно важный функционал (в виде бинарного кода) на сервер и организовать лицензионный доступ с контролем кол-ва запущенных процессов. Это реалиует технология http://resanity.com.

Автор: chukhlomin 20.7.2015, 10:56
28 июля компания SafeNet(мировой лидер в области защиты и лицензирвания программного обеспечения(ключи HASP/Sentinel)), будет проводить бесплатный вебинар по теме защиты и лицензирования ПО.
На вебинаре будут наглядно продемонстиррованы способы защиты ПО с использования аппаратных, программных и облачных ключей защиты.
Также будут показаны способы создания демо-версий, удаленных обновлений лицензий, перенос части кода для выполнения внутри ключа защиты и многое другое.
Зарегистрироваться на вебинар можно по ссылке: _http://safenet-sentinel.ru/events/index.php?ELEMENT_ID=6512

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