Заставка

Программирование на старых и современных языках, а так-же дизайн

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Защита ПО от пиратства

Сообщений 1 страница 4 из 4

1

Важно!!!, то что тут написано это я всё сам делал, я всё сам выдумал, и активационные ключи я тоже сам придумал случайные!
В  колледже это был мой проект, было типа лабараторной работой, или практики

В Алматы мы использовали Российские ключи защиты (dongle) Guardant:
https://b.radikal.ru/b20/2112/8b/3293be248989.jpg

Так выглядят западные ключи защиты (dongle):
https://c.radikal.ru/c33/2112/63/50ab47d7b629.jpg

В колледже был проект "программа активации". Итак вот простой пример, консольное приложение :
Файл Main.cs:

Код:
using System;
using System.IO;
using System.Text;
using System.Net;

namespace ConsoleApplication1 
{
  class Program 
  {
    static void Main(string[] args)
    {
      try {
        WebClient wcl = new WebClient();
        Console.WriteLine("Your name:");
        String strName = Console.ReadLine();
        Console.WriteLine("Your email:");
        String strEmail = Console.ReadLine();
        Console.WriteLine("Activation key:");
        String strKey = Console.ReadLine();
        String strResult = wcl.DownloadString(String.Format("http://localhost/activation/activate.php?key={0}&name={1}&email={2}", strKey, strName, strEmail));
        Console.WriteLine(strResult);
        Console.WriteLine("Press any key...");
        Console.ReadKey();
      }
      catch(Exception ex) {
        Console.WriteLine(String.Format("Error: {0}", ex.Message));
      }
    }
  }
}

Это SQL:

Код:
-- phpMyAdmin SQL Dump
-- version 5.0.1
-- https://www.phpmyadmin.net/
--
-- Хост: 127.0.0.1
-- Время создания: Дек 05 2021 г., 07:33
-- Версия сервера: 10.4.11-MariaDB
-- Версия PHP: 7.4.2

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- База данных: `activation`
--

-- --------------------------------------------------------

--
-- Структура таблицы `activate_software`
--

CREATE TABLE `activate_software` (
  `activation_id` bigint(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `code` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `activate_software`
--
ALTER TABLE `activate_software`
  ADD PRIMARY KEY (`activation_id`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `activate_software`
--
ALTER TABLE `activate_software`
  MODIFY `activation_id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Это код PHP index.php:

Код:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=activation', 'root', '');
if(is_null($_GET['email']) || !isset($_GET['email']))
  exit;
if(is_null($_GET['name']) || !isset($_GET['name']))
  exit;
if(is_null($_GET['key']) || !isset($_GET['key']))
  exit;

$str_email = $_GET['email'];
$str_name = $_GET['name'];
$str_key = $_GET['key'];
$str_date = date('Y-m-d H:i:s', mktime());

$pdo->prepare('UPDATE `activate_software` SET `name`=?, `date`=?, `email`=? WHERE `activate_software`.`code`=?')->execute([$str_name, $str_date, $str_email, $str_key]);
echo $str_name . "\n";
echo $str_date . "\n";
echo $str_email . "\n";
echo $str_key . "\n";
?>

Результат:
Это так выглядет сама таблица:
https://i.ibb.co/xCwMtSj/activation-01-06-25-05-12-2021-min.jpg

Это ввод данных, и активация:
https://i.ibb.co/YQg0mxV/activation-02-06-55-05-12-2021-min.jpg

Это результат активации (имя - Anton Popov, e-mail - anton.popov.82@example.com, итд.):
https://i.ibb.co/h7FzgHk/activation-03-06-56-05-12-2021-min.jpg

0

2

Усовершенствуем наш код:
Файл Main.cs:

Код:
using System;
using System.IO;
using System.Text;
using System.Net;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        WebClient wcl = new WebClient();
        Console.WriteLine("Your name:");
        String strName = Console.ReadLine();
        Console.WriteLine("Your email:");
        String strEmail = Console.ReadLine();
        Console.WriteLine("Activation key:");
        String strKey = Console.ReadLine();
        String strResult = wcl.DownloadString(String.Format("http://localhost/activation/activate2.php?key={0}&name={1}&email={2}", strKey, strName, strEmail));
        if(strResult.Equals("OK"))
          Console.WriteLine("Success activated!");
        else
          Console.WriteLine(strResult);
  
        Console.WriteLine("Press any key...");
        Console.ReadKey();
      }
      catch (Exception ex)
      {
        Console.WriteLine(String.Format("Error: {0}", ex.Message));
      }
    }
  }
}

Файл activate2.php:

Код:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=activation', 'root', '');
if(is_null($_GET['email']) || !isset($_GET['email']))
  exit;
if(is_null($_GET['name']) || !isset($_GET['name']))
  exit;
if(is_null($_GET['key']) || !isset($_GET['key']))
  exit;

$str_key = $_GET['key'];
$obj_stmt = $pdo->prepare('SELECT * FROM `activate_software` WHERE `activate_software`.`code`=:code');
$obj_stmt->execute(['code' => $str_key]);
$arr_row = $obj_stmt->fetch();
if(isset($arr_row) && !is_null($arr_row)) {
  if($arr_row['name'] != '')
    exit;

  if($arr_row['email'] != '')
    exit;

  if($arr_row['date'] != '0000-00-00 00:00:00')
    exit;
  
  $str_email = $_GET['email'];
  $str_name = $_GET['name'];
  $str_date = date('Y-m-d H:i:s', mktime());
  $pdo = new PDO('mysql:host=localhost;dbname=activation', 'root', '');
  $pdo->prepare('UPDATE `activate_software` SET `name`=?, `date`=?, `email`=? WHERE `activate_software`.`code`=?')->execute([$str_name, $str_date, $str_email, $str_key]);
  echo 'OK';
}
?>

Результат:
Вводим данные:
https://i.ibb.co/x2dkxHQ/activation-01-10-16-05-12-2021-min.jpg

Результат записи в БД:
https://i.ibb.co/1sLQSBb/activation-02-10-17-05-12-2021-min.jpg

0

3

Но лучше вот так:

Код:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=activation', 'root', '');
if(is_null($_GET['email']) || !isset($_GET['email']))
  exit;
if(is_null($_GET['name']) || !isset($_GET['name']))
  exit;
if(is_null($_GET['key']) || !isset($_GET['key']))
  exit;

$str_key = $_GET['key'];
$obj_stmt = $pdo->prepare('SELECT * FROM `activate_software` WHERE `activate_software`.`code`=:code');
$obj_stmt->execute(['code' => $str_key]);
$arr_row = $obj_stmt->fetch();
if(isset($arr_row) && !is_null($arr_row)) {
  if(isset($arr_row['name']) || !is_null($arr_row['name'])) {
   if($arr_row['name'] != '')
    exit;
  }

  if(isset($arr_row['email']) || !is_null($arr_row['email']) {
    if($arr_row['email'] != '')
      exit;
  }

  if(isset($arr_row['date']) || !is_null($arr_row['date'])) {
    if($arr_row['date'] != '0000-00-00 00:00:00')
      exit;
  }

  $str_email = $_GET['email'];
  $str_name = $_GET['name'];
  $str_date = date('Y-m-d H:i:s', mktime());
  $pdo = new PDO('mysql:host=localhost;dbname=activation', 'root', '');
  $pdo->prepare('UPDATE `activate_software` SET `name`=?, `date`=?, `email`=? WHERE `activate_software`.`code`=?')->execute([$str_name, $str_date, $str_email, $str_key]);
  echo 'OK';
}
?>

0

4

А теперь напечатаем наш ключ, который я спонтанно придумал:
https://c.radikal.ru/c12/2112/79/47fcf6b6c924.jpg

0