Да хоть 33 ключа, это не значит что шансы на взлом уменьшаются в 33 раза.
неее, просто шансы подобрать ключ к расшифровки трафика снизится.
вот например рабочий клиент, но не активирован сервером [Ссылки могут видеть только зарегистрированные пользователи. ]
Все процедуры описывать довольно догло, в кратце есть Switch(OPCODE) по нему выполняются действия активации проги в несколько этапов, до получения опкода трафик расшифровывается, ну а на сервере(на моем компе) уже идет проверки на все ключи и подтверждение активации. если все совпадает и дата и активация, то шифруются пакеты с определенными данными и высылаются на клиент, ну и так вот все происходит
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо"
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
неее, просто шансы подобрать ключ к расшифровки трафика снизится.
вот например рабочий клиент, но не активирован сервером [Ссылки могут видеть только зарегистрированные пользователи. ]
Все процедуры описывать довольно догло, в кратце есть Switch(OPCODE) по нему выполняются действия активации проги в несколько этапов, до получения опкода трафик расшифровывается, ну а на сервере(на моем компе) уже идет проверки на все ключи и подтверждение активации. если все совпадает и дата и активация, то шифруются пакеты с определенными данными и высылаются на клиент, ну и так вот все происходит
Насколько я понимаю подбирать никто не будет. Будут подмены.
Не знаю почему, но у меня функция GetHDDStaticSerial() работала некорректно. Вставил флешку - значение другое.
Оказалось, что по запросу "SELECT * FROM Win32_DiskDrive" первым элементом вылезала пустая строка, которая и сбивала всё с толку, поэтому её необходимо пропустить
Не знаю почему, но у меня функция GetHDDStaticSerial() работала некорректно. Вставил флешку - значение другое.
Оказалось, что по запросу "SELECT * FROM Win32_DiskDrive" первым элементом вылезала пустая строка, которая и сбивала всё с толку, поэтому её необходимо пропустить
Есть такое.
Но сейчас я работаю над более современной системой активации.
Если тесты пройдут норм, то возможно опишу как и что.
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
а как можно будет добавить новую переменную для проверки?
например выбор группы , если обычный юзер то паблик если приватный то грузить приват. и выбор групп сделать на форме входе например в comboBox
читать ее и пускать туда куда надо
Последний раз редактировалось Lubot; 02.02.2015 в 00:50.
Дополнительный параметр в GET запросе к серверу. Дополнительный стобец в таблице БД. Сделать ответом от сервера параметр license=1 или license=2 для выбора версии. Но без вашей смекалки обойти защиту не составит проблем
Дополнительный параметр в GET запросе к серверу. Дополнительный стобец в таблице БД. Сделать ответом от сервера параметр license=1 или license=2 для выбора версии. Но без вашей смекалки обойти защиту не составит проблем
ну этоже надо создовать еще один count вроде или не?
if ($count == 1) //Если число рядков равно 1
else if ($count == 0) //Тогда если число рядков равно 0
к примеру group5 это одна, group10 дргуая группа
не я всеравно исключаю сервер, т.к думаю что сама программа чтото не то отправляет
вот поставил бряк на страку, где еррорит
[Ссылки могут видеть только зарегистрированные пользователи. ]
мне вот както писали, что responseSplited пустой
Всем привет! Т.к. привязка v1 была сделана не совсем правильно (особенно хранение hwid) я решил сделать новую версию, на этот раз подменить ответ будет невозможно. Только надо изменять инструкции программы для "кряка". В этой привязке мы сможем задавать время, до которого будет действительна лицензия.
Что нам понадобится
1. Класс для получения HWID (HardWare ID) - скачать
2. Класс для работы с RSA на C# - скачать
3. PHP скрипты - скачать
4. Хостинг с поддержкой PHP - на данном примере я буду использовать хостинг от koding.com (не реклама)
5. MySQL - на данном примере я буду использовать [Ссылки могут видеть только зарегистрированные пользователи. ] (не реклама)
6. Microsoft Visual Studio 2008+ с редистрибутивом C# - гугл : )
7. Базовые знания (например как добавить класс в проект)
Начнём
1. Для начала необходимо создать MySQL базу. Для этого зарегистрируемся на [Ссылки могут видеть только зарегистрированные пользователи. ] и создадим MySQL базу (не MSSQL).
У вас должно получится что-то типо такого:скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
2. Теперь создадим таблицу в MySQL базе данных, где будет храниться информация для лицензии. Для этого зайдём в phpMyAdmin, введём туда данные (пароль после регистрации бд приходит на почту) и нажмём "Создать таблицу", количество полей 2 - с именами "Hardware ID" и "End Time", тип - TEXT, и далее обязательно выставтить сравнение на "utf8_general_ci". и нажать "Сохранить". скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
3. Теперь надо сгенерировать паблик и приват ключи RSA. Для этого создадим проект с шаблоном "Приложение Windows Forms" и назовём его RSAKeysGenerator, далее на основную Form кинем 2 textBox-a, 2 label-a и 1 кнопку. Так же добавим в проект DigitalSign.cs. скрин
[Ссылки могут видеть только зарегистрированные пользователи. ]
Мы заменяем на адрес сервера где расположена MySQL БД.
В моём случае:
Код:
$MySQL_hostname = "sql3.freesqldatabase.com";
Далее
Код:
$MySQL_username = "user";
Мы за меняем на имя пользователя для MySQL бд.
В моём случае:
Код:
$MySQL_username = "sql313795";
Далее
Код:
$MySQL_password = "password";
Мы заменяем на пароль для пользователя для MySQL бд.
Далее
Код:
$MySQL_databasename = "database name";
Мы заменяем на имя базы данной для MySQL.
В моём случае:
Код:
$MySQL_databasename = "sql313795";
Далее
Мы заменяем имя таблицы MySQL бд
Код:
$MySQL_table = "table name";
В моём случае:
Код:
$MySQL_table = "licensetable";
Всё, сохраняем настройки, загружаем все php файлы на сервер.
7. Теперь создадим новый проект тот же шаблон "Приложение Windows Forms". На него кинем 1 richTextBox, 1 кнопку. Добавим в проект DigitalSign.cs и HWIDGrabber.cs
Теперь объявим пару функций (можно прямо в коде формы)
Код:
public string getDays(TimeSpan time)
{
return ((time < TimeSpan.Zero) ? String.Format("Лицензия истекла {0} дней {1} часов {2} минут назад", Math.Abs(time.Days).ToString(), Math.Abs(time.Hours).ToString(), Math.Abs(time.Minutes).ToString()) : String.Format("Лицензия активна. Осталось {0} дней {1} часов {2} минут", time.Days, time.Hours, time.Minutes));
}
public static string getSignedText(string[] response)
{
string returned = String.Empty;
for (int i = 0; i < response.Length - 1; i++)
{
returned += response.GetValue(i) + "\r\n";
}
return returned;
}
public static string info(Random rn, Int32 token1,string preKey)
{
string tokenString = String.Format("token={0}&hwid={1}", DigitalSign.EncryptString(token1.ToString(), preKey), HWIDGrabber.GetUHI);
return tokenString;
}
public static string GetRequest(string url, string post)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
byte[] buffer = Encoding.UTF8.GetBytes(post);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = buffer.Length;
request.Method = "POST";
Stream newStream = request.GetRequestStream();
newStream.Write(buffer, 0, post.Length);
newStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader strReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1251));
string WorkingPage = strReader.ReadToEnd();
response.Close();
return WorkingPage;
}
public static string randomStringWithNumbers(int maxlength, Random rn)
{
StringBuilder sb = new StringBuilder();
char[] allowedChars = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
for (int i = 0; i < maxlength; i++)
{
int n = rn.Next(0, allowedChars.Length);
if (char.IsLetter(allowedChars[n]))
{
if (rn.Next(0, 2) == 0)
{
sb.Append(allowedChars[n].ToString().ToUpper());
}
else
{
sb.Append(allowedChars[n]);
}
}
else
{
sb.Append(allowedChars[n]);
}
}
return sb.ToString();
}
Теперь на эвент OnLoad на нашей форме запишем код:
Код:
richTextBox1.Text = HWIDGrabber.GetUHI;
p.s. если у вас ругается на ссылки, то вы должны подключить следующие:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
А если ругается на Managment, то добавьте в ссылки System.Managment в .net ветке
Далее на эвент кнопки Click:
Код:
//////////////////////////////////////////////////////////////////////////////////////////
string pubKeyNotXORed = "<RSAKeyValue><Modulus></Modulus><Exponent></Exponent></RSAKeyValue>"; //Сюда в кавычки копируем ПАБЛИК rsa ключ.
//////////////////////////////////////////////////////////////////////////////////////////
Random curRandom = new Random();
string preKey = randomStringWithNumbers(curRandom.Next(15, 21), curRandom);
Int32 XORkey = curRandom.Next(1, int.MaxValue);
///////////////////////////////////////////////////////////////////////////////////////////
string urlToScript = DigitalSign.XOR("http://site.com/base.php", XORkey); //Вместо site.com/base.php полный путь до скрипта на вашем хостинге
///////////////////////////////////////////////////////////////////////////////////////////
string pubKey = DigitalSign.XOR(pubKeyNotXORed, XORkey);
Int32 token = curRandom.Next(1000000, int.MaxValue);
string infoXORed = DigitalSign.XOR(info(curRandom, token, preKey), XORkey);
string responseXORed = DigitalSign.XOR(GetRequest(DigitalSign.XOR(urlToScript, XORkey), DigitalSign.XOR(infoXORed, XORkey)), XORkey);
string[] responseSplitted = DigitalSign.XOR(responseXORed, XORkey).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
try
{
if (responseSplitted[0].Split('=')[1] == "1")
{
if (Int32.Parse(DigitalSign.DecryptString(responseSplitted[4], preKey)) == token)
{
if (HWIDGrabber.GetUHI == Encoding.UTF8.GetString(Convert.FromBase64String(responseSplitted[1].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)[0])))
{
if (DigitalSign.CompareRSAMethod(getSignedText(responseSplitted), responseSplitted[responseSplitted.Length - 1].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)[0], DigitalSign.XOR(pubKey, XORkey)))
{
DateTime CurrentTime = DateTime.Parse(responseSplitted[2].Split('=')[1]);
DateTime EndTime = DateTime.Parse(responseSplitted[3].Split('=')[1]);
TimeSpan ActivatedTime = EndTime.Subtract(CurrentTime);
if (ActivatedTime < TimeSpan.Zero)
{
MessageBox.Show(getDays(ActivatedTime));
//Тут мы что-то делаем, если лицензия истекла
}
else
{
MessageBox.Show(getDays(ActivatedTime));
//Тут мы что-то делаем, если лицензия активна.
}
}
}
}
}
else
{
MessageBox.Show("Лицензии не обнаружено!");
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка!\nКатастрофа!\nАхтунг!");
//AnyErrors
}
8. Запускаем, видим что в richTextBox появился наш HWID.
Жмём на кнопку, получаем
[Ссылки могут видеть только зарегистрированные пользователи. ]
9. Идём в phpMyAdmin, открывает нашу таблицу выбираем "Вставить", в Hardware ID пишем то, что выдал richTextBox, в EndTime время окончания, строго в таком формате: 14.07.2013 20:00:00
[Ссылки могут видеть только зарегистрированные пользователи. ]
10. Опять нажимаем на кнопку, и получаем:
[Ссылки могут видеть только зарегистрированные пользователи. ]
11. Пробуем поставить время окончания лицензии раньше нашего текущего времени, получем:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Заключение
Я сделал лишь основу, дальше вы можете модернизировать, как вам захочется, сделать автоматическое добавление в базу и т.д.
Самое главное - это обезопасить себя от декомпиляции кода, полностью обезопасить - невозможно, но от обычных юзеров можно.
Для этого делаем скрытые проверки, делаем условия из нескольких переменных типа int на основе математики и так далее... Ну и конечно использовать обсуфикаторы.
За основу для работы с RSA на php были взяты скрипты от Jim Wigginton
Гайд подготовил Nickitee специально для zhyk.ru
Автор не несёт ответственности за пользование информацией
При копировании на другие сайты/блоги/форумы и т.п. - указывать автора
Можешь помочь пишет Вроде бы все делал как у тебя показано !