Форум программистов, компьютерный форум CyberForum.ru

Защита программы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
03.09.2010, 14:07     Защита программы #1
Требуется, чтобы программа работала в двух режимах:
- Режим с ограничениями (демо)
- Режим полной функциональности

Методы регистрации программы пока что не интересуют.

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

В класс основной программы добавляется флаг demo_mode, который отвечает за урезку функционала. В GUI интерфейсе можно, например, будет делать недоступными некоторые кнопки.

Набросал скелет защитника. Может у кого есть какие идеи по этому поводу?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
 
class MainProgram
{
public:
    void Run() {
        if(demo)
            std::cout << "Main Program running in Demo Mode" << std::endl;
        else
            std::cout << "Main Program running in Registered Mode" << std::endl;
    }
    
    void SetDemoMode() {
        demo = true;
    }
    
private:
    bool demo;
};
 
// Подсистема противодействия
// нейтрализации защитных функций
class ReactionSystem
{
    // Методы этого класса должны срабатывать,
    // если регистрационные данные подверглись изменениям
};
 
// Подсистема реализации защитных функций 
class DefendSystem
{
public:
    // Блок идентификации параметров 
    bool ParamsIdentificationBlock() {
        // -- Проверка идентифицирующего элемента
        // Параметры считываются в данные класса DefendSystem
        return true;
    }
    
    // Блок принятия решений
    bool DecisionMakingBlock() {
        // -- Сравнение считанных параметров с эталоном
        // Самое обычное сравнение
        return true;
    }
    
    // Блок ответной реакции
    void ResponseBlock() {
        // -- Срабатывает при наличии факта несанкционированного копирования
        // Например выдается соответствующее предупреждение
        std::cout << "ResponseBlock message" << std::endl;
    }
    
    // Комбинатор
    void Run() {
        // Если параметры считаны и проверены, то запускается основная программа
        // Иначе управление передается блоку ответной реакции
        if(!(ParamsIdentificationBlock() && DecisionMakingBlock())) {
            ResponseBlock();
            mp.SetDemoMode();
        }
        
        mp.Run();
    }
    
    // Класс основной программы
    MainProgram mp;
    ReactionSystem rs;
};
 
int main()
{
    DefendSystem d;
    d.Run();
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
promix_17
14 / 14 / 2
Регистрация: 12.05.2010
Сообщений: 43
03.09.2010, 14:18     Защита программы #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Совсем не надёжное решение.
  • Во-первых, никогда нельзя создавать переменных, отвечающих за режим работы программы, достаточно изменить одну область в памяти и всё - защита разрушена!
  • Во-вторых, для проверки надо вставлять не ссылку на функцию(!!!), а саму функцию(!!!) по аналогичной причине, и делать это надо не в одном только месте программы.
  • В-третьих, нет никакой антиотладки, для начала поможет даже и IsDebuggerPresent(), смотри MSDN.
  • Ещё не помешает проверка контрольной суммы для предотвращения изменения кода программы. Тоже лучше делать не только при запуске,но и в процессе работы.
  • Так же можно запаковать программу каким-нибудь протектором.
Если проект не слишком значимый и дорогой, то этого вполне достаточно.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
03.09.2010, 14:25  [ТС]     Защита программы #3
promix_17, Все это хорошо, но сейчас меня больше интересует конкретика нежели теория. Для начала мне надо написать хоть какое-то решение, а потом уже "защищаться от взлома".
Если проект не слишком значимый и дорогой, то этого вполне достаточно.
Проекта нет, проектом может быть хоть "Hello World"
promix_17
14 / 14 / 2
Регистрация: 12.05.2010
Сообщений: 43
03.09.2010, 14:27     Защита программы #4
Ну всё равно, решение сразу учись писать надёжное, а то привыкнешь...
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
03.09.2010, 14:32  [ТС]     Защита программы #5
Цитата Сообщение от promix_17 Посмотреть сообщение
Ну всё равно, решение сразу учись писать надёжное, а то привыкнешь...
Ну так может быть покажете возможное правильное решение в коде.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
03.09.2010, 20:51     Защита программы #6
Самое надёжное,наверное,это сервер авторизации и прога с define-ами. Перекомпилировать для разной функциональности.
rrrFer
Заблокирован
03.09.2010, 21:01     Защита программы #7
#pragma, подскажешь как использовать сервер авторизации(или может книжку хорошую) ?
нельзя ведь писать если(ответ с сервера устраивает){ авторизовались } иначе { не получилось }
ведь возможно подменить вообще запрос сервера на что-то инное.
Чем помогут define-ы не представляю вообще.Про перекопилировать тоже непонял, вот получил для полной функциональности и неполной. Кому-то дал полную версию, как предотвратить ее распространение?
(лучше пример конечно)
Mencey
 Аватар для Mencey
145 / 92 / 7
Регистрация: 22.07.2010
Сообщений: 424
03.09.2010, 21:12     Защита программы #8
Цитата Сообщение от fasked Посмотреть сообщение
Требуется, чтобы программа работала в двух режимах:
- Режим с ограничениями (демо)
- Режим полной функциональности
Я вижу тут только одно самое надёжное и простое решение это удаление кусков кода для демо режима.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
03.09.2010, 22:46     Защита программы #9
Не стоит выдумывать колесо, давно разработана куча техник защиты.
Регулярные проверки CRC на предмет изменения екзешника.
Проверки на работающий дебаггер (Skype)
Привязка к железу по серийным номерам (Windows).
Проблема распространения решается баном серийника, если с двух разных компов высылали запрос авторизации за короткий период (вряд ли один человек может, например, завтра переехать в другую страну, сменить комп, повторить это опять в следующий день и т.д.)
С сервера можно получать набор смещений, добавляемых к адресу функции - если адрес неправильный, програма крашанёт. В таком случае заранее нельзя знать, что подобранный код правильный. Можно по-разному изворачиться, банить черезе некоторое время, по рендому и т.п.

Но снова ж таки, это всё предположения, догадки. Есть куча людей, к-рые посвятили этому тучу времени и написали соответсвенные статьи.
iama
 Аватар для iama
1249 / 974 / 48
Регистрация: 30.07.2010
Сообщений: 5,297
03.09.2010, 22:57     Защита программы #10
Всегда считал, что демо-версия не должна в принципе имеет в дистрибутиве того функционала, который защищается, тем более если его ещё можно и запустить на исполнение. Методов защиты триал- и демо-версий - полным-полно, выбирайте и встраивайте. Мне, например, нравится вариант, когда при всех охраняемых дествиях, хеш файла программы сверяется с правильным хешем, созданым при сборке дистра. Сам хеш лучше держать не в ресурсах, а в файле, создаваемом при установке в, например, виндире, с не привлекающим внимания именем.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
04.09.2010, 02:56     Защита программы #11
Цитата Сообщение от rrrFer Посмотреть сообщение
#pragma, подскажешь как использовать сервер авторизации(или может книжку хорошую) ?
нельзя ведь писать если(ответ с сервера устраивает){ авторизовались } иначе { не получилось }
ведь возможно подменить вообще запрос сервера на что-то инное.
Чем помогут define-ы не представляю вообще.Про перекопилировать тоже непонял, вот получил для полной функциональности и неполной. Кому-то дал полную версию, как предотвратить ее распространение?
(лучше пример конечно)
Продавать. Мало кто захочет распространять то,за что заплачено =) Хотя ещё есть альтруисты,это радует))
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.09.2010, 09:02  [ТС]     Защита программы #12
Цитата Сообщение от #pragma Посмотреть сообщение
Перекомпилировать для разной функциональности.
Хочется сделать как раз без компилирования, чтобы один дистрибутив в зависимости от наличия регистрации предоставлял различных функционал.
Кому-то дал полную версию, как предотвратить ее распространение?
И это конечно тоже

Тогда такой вариант. Основная программа хранится в зашифрованном виде. Программа защитник запускается, проверяет регистрационные данные на валидность, расшифровывает основную программу и выполняет (при чем желательно выполнять прямо из оперативной памяти, не сохраняя расшифрованную копию на диск). Конечно, можно сделать дамп участка памяти с программой, но это уже проблема.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
05.09.2010, 09:12     Защита программы #13
Цитата Сообщение от fasked Посмотреть сообщение
Конечно, можно сделать дамп участка памяти с программой, но это уже проблема.
Это будет проблемой, если в программе применены антиотладочные трюки и отладчик не защищен от них. Сам отладчик, например OllyDbg 1.10, можно защитить.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.09.2010, 09:17  [ТС]     Защита программы #14
Цитата Сообщение от Евгений М. Посмотреть сообщение
Это будет проблемой, если в программе применены антиотладочные трюки и отладчик не защищен от них. Сам отладчик, например OllyDbg 1.10, можно защитить.
Может быть, в этих вопросах я еще не просвещен
А вот зашифровать/расшифровать файл, а также предварительно проверить контрольную сумму для него несложно. Осталось только извернуться, чтобы запустить код из памяти.
nail89
5 / 5 / 0
Регистрация: 28.07.2010
Сообщений: 12
13.09.2010, 00:18     Защита программы #15
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
Регулярные проверки CRC на предмет изменения екзешника...
Можно подробнее как это реализовывается? Мне на ум приходит только одно - программа получает CRC c какого-то сервера и сверяет его со своим... иначе ведь не реализовать? Если я вписываю CRC в код программы, то её CRC уже меняется...и так можно подобрать, но уйдет вечность...
Так, или я что-то не уловил?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
13.09.2010, 00:23  [ТС]     Защита программы #16
Цитата Сообщение от nail89 Посмотреть сообщение
Так, или я что-то не уловил?
считать CRC не учитывая того места в файле, где хранится значение CRC
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
13.09.2010, 00:54     Защита программы #17
Цитата Сообщение от nail89 Посмотреть сообщение
Можно подробнее как это реализовывается? Мне на ум приходит только одно - программа получает CRC c какого-то сервера и сверяет его со своим... иначе ведь не реализовать? Если я вписываю CRC в код программы, то её CRC уже меняется...и так можно подобрать, но уйдет вечность...
Так, или я что-то не уловил?
Ну почему. ЦРЦ считается по вполне математическим формулам. Считаешь сначала ЦРЦ с подставленными в проверке нулями, потом считаешь, каким должен быть ЦРЦ для программы, в которой для проверки используется такой же ЦРЦ.

Добавлено через 7 минут
Цитата Сообщение от fasked Посмотреть сообщение
Тогда такой вариант. Основная программа хранится в зашифрованном виде. Программа защитник запускается, проверяет регистрационные данные на валидность, расшифровывает основную программу и выполняет (при чем желательно выполнять прямо из оперативной памяти, не сохраняя расшифрованную копию на диск). Конечно, можно сделать дамп участка памяти с программой, но это уже проблема.
Насколько я знаю, многие проги пишутся в виде виртуальной машины (напр, машины тьюринга).
Сначала загрузчик загружаем машину, затем запускает код в этой машине.
Если вирт. машина хорошо спроектирована, хакер задолбается её расшифровывать.
Всю программу, особенно если она большая, нет смысла в вирт. машину писать - слишком геморройно.
http://ru.wikipedia.org/wiki/%D0%92%...B8%D0%BD%D0%B0
http://seculab.ru/ru/projects-neoguard.php
Shaper
22 / 22 / 2
Регистрация: 05.05.2010
Сообщений: 82
13.09.2010, 15:18     Защита программы #18
Цитата Сообщение от fasked Посмотреть сообщение
Хочется сделать как раз без компилирования, чтобы один дистрибутив в зависимости от наличия регистрации предоставлял различных функционал.
Могу порекомендовать HASP-ключи. Например, Guardant Stealth 3. Я сам имел с ними дело. Можно сделать так, чтобы дистрибутив распространялся бесплатно, а ключ был платным. Без ключа доступен урезанный функционал, а с ключем - расширенный.

Реализуется это через шифрование таблицы констант. Из всех защищаемых функций выбираются константы, создается большая таблица. Она шифруется пару сотен раз с разными ключами и разными алгоритмами и остается в программе. В коде программы есть ключи. Набор алгоритмов для расшифровки находится в HASP-e. Хакер, обладая шифром и ключем, но без алгоритма не сможет ничего сделать. Сотни различных вариантов нужны для того, чтобы усложнить перехват взаимодействия с ключем. Хакер каждый раз будет получать новую последовательность данных с новыми ключами и с новыми запросами.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
13.09.2010, 15:20     Защита программы #19
Shaper, что мешает взломщику, имея 1 рабочий ключ, захардкодить все констатны в ф-циях, где они используются ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2010, 15:55     Защита программы
Еще ссылки по теме:

C++ Защита от дурака
Защита программы от остановки процесса C++
Защита данных программы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Shaper
22 / 22 / 2
Регистрация: 05.05.2010
Сообщений: 82
13.09.2010, 15:55     Защита программы #20
Я упустил один момент. Создатели ключа это предусмотрели и создали систему кодирования приложения. Оно переводится с обычного машинного кода на виртуальный. Причем, при запуске формируется не одна, а целых 5 виртуальных машин, и каждая из них - со своим языком. Работают они по очереди и каждая выполняет свой участок кода. Разбирать это все дебагером очень сложно. Я только не знаю, будет ли такая оболочка работать без ключа. Я с ключом делал.
Yandex
Объявления
13.09.2010, 15:55     Защита программы
Ответ Создать тему

Метки
защита программы, регистрация программы
Опции темы

Текущее время: 15:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru