Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
1

Защита программы

03.09.2010, 14:07. Показов 11238. Ответов 19

Author24 — интернет-сервис помощи студентам
Требуется, чтобы программа работала в двух режимах:
- Режим с ограничениями (демо)
- Режим полной функциональности

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

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

В класс основной программы добавляется флаг 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();
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2010, 14:07
Ответы с готовыми решениями:

Защита программы
Здравствуйте, у меня есть такой вопрос, в программу загружается изображение и wav звук которые...

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

Защита данных программы
Как лучше защитить пароли программы от декомпиляции? Насчет обфускации знаю, а как то проще можно?

Защита программы паролем
есть к примеру элементарная программа(написанная в Borland C), нужно чтобы прога запрашивала...

19
14 / 14 / 3
Регистрация: 12.05.2010
Сообщений: 43
03.09.2010, 14:18 2
Лучший ответ Сообщение было отмечено как решение

Решение

Совсем не надёжное решение.
  • Во-первых, никогда нельзя создавать переменных, отвечающих за режим работы программы, достаточно изменить одну область в памяти и всё - защита разрушена!
  • Во-вторых, для проверки надо вставлять не ссылку на функцию(!!!), а саму функцию(!!!) по аналогичной причине, и делать это надо не в одном только месте программы.
  • В-третьих, нет никакой антиотладки, для начала поможет даже и IsDebuggerPresent(), смотри MSDN.
  • Ещё не помешает проверка контрольной суммы для предотвращения изменения кода программы. Тоже лучше делать не только при запуске,но и в процессе работы.
  • Так же можно запаковать программу каким-нибудь протектором.
Если проект не слишком значимый и дорогой, то этого вполне достаточно.
5
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
03.09.2010, 14:25  [ТС] 3
promix_17, Все это хорошо, но сейчас меня больше интересует конкретика нежели теория. Для начала мне надо написать хоть какое-то решение, а потом уже "защищаться от взлома".
Если проект не слишком значимый и дорогой, то этого вполне достаточно.
Проекта нет, проектом может быть хоть "Hello World"
0
14 / 14 / 3
Регистрация: 12.05.2010
Сообщений: 43
03.09.2010, 14:27 4
Ну всё равно, решение сразу учись писать надёжное, а то привыкнешь...
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
03.09.2010, 14:32  [ТС] 5
Цитата Сообщение от promix_17 Посмотреть сообщение
Ну всё равно, решение сразу учись писать надёжное, а то привыкнешь...
Ну так может быть покажете возможное правильное решение в коде.
0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
03.09.2010, 20:51 6
Самое надёжное,наверное,это сервер авторизации и прога с define-ами. Перекомпилировать для разной функциональности.
0
Заблокирован
03.09.2010, 21:01 7
#pragma, подскажешь как использовать сервер авторизации(или может книжку хорошую) ?
нельзя ведь писать если(ответ с сервера устраивает){ авторизовались } иначе { не получилось }
ведь возможно подменить вообще запрос сервера на что-то инное.
Чем помогут define-ы не представляю вообще.Про перекопилировать тоже непонял, вот получил для полной функциональности и неполной. Кому-то дал полную версию, как предотвратить ее распространение?
(лучше пример конечно)
0
155 / 102 / 12
Регистрация: 22.07.2010
Сообщений: 445
03.09.2010, 21:12 8
Цитата Сообщение от fasked Посмотреть сообщение
Требуется, чтобы программа работала в двух режимах:
- Режим с ограничениями (демо)
- Режим полной функциональности
Я вижу тут только одно самое надёжное и простое решение это удаление кусков кода для демо режима.
0
Эксперт С++
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
03.09.2010, 22:46 9
Не стоит выдумывать колесо, давно разработана куча техник защиты.
Регулярные проверки CRC на предмет изменения екзешника.
Проверки на работающий дебаггер (Skype)
Привязка к железу по серийным номерам (Windows).
Проблема распространения решается баном серийника, если с двух разных компов высылали запрос авторизации за короткий период (вряд ли один человек может, например, завтра переехать в другую страну, сменить комп, повторить это опять в следующий день и т.д.)
С сервера можно получать набор смещений, добавляемых к адресу функции - если адрес неправильный, програма крашанёт. В таком случае заранее нельзя знать, что подобранный код правильный. Можно по-разному изворачиться, банить черезе некоторое время, по рендому и т.п.

Но снова ж таки, это всё предположения, догадки. Есть куча людей, к-рые посвятили этому тучу времени и написали соответсвенные статьи.
0
1360 / 988 / 119
Регистрация: 30.07.2010
Сообщений: 5,297
03.09.2010, 22:57 10
Всегда считал, что демо-версия не должна в принципе имеет в дистрибутиве того функционала, который защищается, тем более если его ещё можно и запустить на исполнение. Методов защиты триал- и демо-версий - полным-полно, выбирайте и встраивайте. Мне, например, нравится вариант, когда при всех охраняемых дествиях, хеш файла программы сверяется с правильным хешем, созданым при сборке дистра. Сам хеш лучше держать не в ресурсах, а в файле, создаваемом при установке в, например, виндире, с не привлекающим внимания именем.
0
Временно недоступен
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
04.09.2010, 02:56 11
Цитата Сообщение от rrrFer Посмотреть сообщение
#pragma, подскажешь как использовать сервер авторизации(или может книжку хорошую) ?
нельзя ведь писать если(ответ с сервера устраивает){ авторизовались } иначе { не получилось }
ведь возможно подменить вообще запрос сервера на что-то инное.
Чем помогут define-ы не представляю вообще.Про перекопилировать тоже непонял, вот получил для полной функциональности и неполной. Кому-то дал полную версию, как предотвратить ее распространение?
(лучше пример конечно)
Продавать. Мало кто захочет распространять то,за что заплачено =) Хотя ещё есть альтруисты,это радует))
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
05.09.2010, 09:02  [ТС] 12
Цитата Сообщение от #pragma Посмотреть сообщение
Перекомпилировать для разной функциональности.
Хочется сделать как раз без компилирования, чтобы один дистрибутив в зависимости от наличия регистрации предоставлял различных функционал.
Кому-то дал полную версию, как предотвратить ее распространение?
И это конечно тоже

Тогда такой вариант. Основная программа хранится в зашифрованном виде. Программа защитник запускается, проверяет регистрационные данные на валидность, расшифровывает основную программу и выполняет (при чем желательно выполнять прямо из оперативной памяти, не сохраняя расшифрованную копию на диск). Конечно, можно сделать дамп участка памяти с программой, но это уже проблема.
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
05.09.2010, 09:12 13
Цитата Сообщение от fasked Посмотреть сообщение
Конечно, можно сделать дамп участка памяти с программой, но это уже проблема.
Это будет проблемой, если в программе применены антиотладочные трюки и отладчик не защищен от них. Сам отладчик, например OllyDbg 1.10, можно защитить.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
05.09.2010, 09:17  [ТС] 14
Цитата Сообщение от Евгений М. Посмотреть сообщение
Это будет проблемой, если в программе применены антиотладочные трюки и отладчик не защищен от них. Сам отладчик, например OllyDbg 1.10, можно защитить.
Может быть, в этих вопросах я еще не просвещен
А вот зашифровать/расшифровать файл, а также предварительно проверить контрольную сумму для него несложно. Осталось только извернуться, чтобы запустить код из памяти.
0
6 / 6 / 0
Регистрация: 28.07.2010
Сообщений: 12
13.09.2010, 00:18 15
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
Регулярные проверки CRC на предмет изменения екзешника...
Можно подробнее как это реализовывается? Мне на ум приходит только одно - программа получает CRC c какого-то сервера и сверяет его со своим... иначе ведь не реализовать? Если я вписываю CRC в код программы, то её CRC уже меняется...и так можно подобрать, но уйдет вечность...
Так, или я что-то не уловил?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
13.09.2010, 00:23  [ТС] 16
Цитата Сообщение от nail89 Посмотреть сообщение
Так, или я что-то не уловил?
считать CRC не учитывая того места в файле, где хранится значение CRC
0
Эксперт С++
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
13.09.2010, 00:54 17
Цитата Сообщение от nail89 Посмотреть сообщение
Можно подробнее как это реализовывается? Мне на ум приходит только одно - программа получает CRC c какого-то сервера и сверяет его со своим... иначе ведь не реализовать? Если я вписываю CRC в код программы, то её CRC уже меняется...и так можно подобрать, но уйдет вечность...
Так, или я что-то не уловил?
Ну почему. ЦРЦ считается по вполне математическим формулам. Считаешь сначала ЦРЦ с подставленными в проверке нулями, потом считаешь, каким должен быть ЦРЦ для программы, в которой для проверки используется такой же ЦРЦ.

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

Реализуется это через шифрование таблицы констант. Из всех защищаемых функций выбираются константы, создается большая таблица. Она шифруется пару сотен раз с разными ключами и разными алгоритмами и остается в программе. В коде программы есть ключи. Набор алгоритмов для расшифровки находится в HASP-e. Хакер, обладая шифром и ключем, но без алгоритма не сможет ничего сделать. Сотни различных вариантов нужны для того, чтобы усложнить перехват взаимодействия с ключем. Хакер каждый раз будет получать новую последовательность данных с новыми ключами и с новыми запросами.
0
Эксперт С++
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
13.09.2010, 15:20 19
Shaper, что мешает взломщику, имея 1 рабочий ключ, захардкодить все констатны в ф-циях, где они используются ?
0
23 / 23 / 4
Регистрация: 05.05.2010
Сообщений: 82
13.09.2010, 15:55 20
Я упустил один момент. Создатели ключа это предусмотрели и создали систему кодирования приложения. Оно переводится с обычного машинного кода на виртуальный. Причем, при запуске формируется не одна, а целых 5 виртуальных машин, и каждая из них - со своим языком. Работают они по очереди и каждая выполняет свой участок кода. Разбирать это все дебагером очень сложно. Я только не знаю, будет ли такая оболочка работать без ключа. Я с ключом делал.
0
13.09.2010, 15:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2010, 15:55
Помогаю со студенческими работами здесь

Защита программы от неверного ввода
Написал программу, определяющую счастливый ли билет. То есть вводится шестизначное число и если...

Защита программы от остановки процесса
Есть лаунчер для игрового сервера который отслеживает у пользователя читерский софт и разумеется...

Обеспечить надежность программы (защита от ввода неверных символов)
Имеется программа, считающая сумму ряда х квадрат на отрезке от а до а. #include &quot;studio.h&quot; ...

Защита программы от НСД. Защита путем шифрования части программы на флеш-диске или флешке
Написать программу на любом известном Вам языке программирования. Программа должна выполнять...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru