Эта привязка работает так:
Вам генерируеться ваш уникальный код, чтобы войти в программу вам нужно чтобы ваш код был в базе + ваш логин
Для примера тут 2 логина:
1.BassBoy
2.Lol
Тоесть в первом текстбоксе будет ваш сгенерированый код а во втором вы должны будете ввести свой логин.
И так перейдем к делу:
Для начала создаем проект и добавляем к нему ссылку:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Выбераем вкладку .NET и выбераем System.Management
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Далее открываем файл Program.cs и пишем:
Using:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Management;
using System.Security.Principal;
using System.Diagnostics;
using System.ComponentModel;
Code:
Заменяем весь код от static class Program
на:
static class Program
{
public static string K1 = "";
Clipboard.SetText(DE.GS());// копирование в буфер обмена
Вот так должно у вас получиться:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Sinyss
28.10.2012, 11:23
Бред, это мне ради каждого нового пользователя придется править исходник...
Yukikaze
28.10.2012, 15:54
На дворе эра информационных технологий, хостинг стоит копейки, что мешает использовать связку мускул+пхп на веб серверах или для большей безопасности VPS+Verify Server, остается только обфусцировать код.
Для кого эти костыли с оффлайн привязкой?
brain()
28.10.2012, 18:03
Бред, это мне ради каждого нового пользователя придется править исходник...
я не новый пользователь /problem
я знаю кривизны тут достаточно но для новичков в самый раз
На дворе эра информационных технологий, хостинг стоит копейки, что мешает использовать связку мускул+пхп на веб серверах или для большей безопасности VPS+Verify Server, остается только обфусцировать код.
Для кого эти костыли с оффлайн привязкой?
я хотел сначало сделать так но ни чего не понял как проверять на сервере это..даже не смог разобрать привязку никтии..
знаю наб..
крайслер
28.10.2012, 18:26
я хотел сначало сделать так но ни чего не понял как проверять на сервере это..даже не смог разобрать привязку никтии..
знаю наб..
Бонально считать фаил(с построчно занесенными ключами) с сервера в переменную и осуществить поиск по совпадению? Не?
string Key_File ="[Ссылки могут видеть только зарегистрированные и активированные пользователи]";//Ссылка на базу
string serv = null;
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])WebRequest.Create(Key_File);
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
serv = reader.ReadToEnd();
Пример поиска
static int a = 0;
string temp = String.Empty;//переменная содержащая полученный индитификатор машины
while (a != -1)
{
a = RichTextBox.Find(temp, a, RichTextBoxFinds.None);
if (a != -1)
{
//---Проверка пройдена(в базе)
}
else
{
//---Проверка не пройдена(нет в базе)
}
break;
}
a++;
Sinyss
28.10.2012, 19:50
Бонально считать фаил(с построчно занесенными ключами) с сервера в переменную и осуществить поиск по совпадению? Не?
на самом деле такая защита не есть проблемной, но достаточно маленькой модификации и она будет намного эффективней )
warl0ck
28.10.2012, 20:34
а почему цифровую подпись никто не юзает?
Nickitee
28.10.2012, 20:38
на самом деле такая защита не есть проблемной, но достаточно маленькой модификации и она будет намного эффективней )
Например можно закриптовать данные, а ключ хранить в закриптованном виде, естественно обсуфицировать программу. Тогда подменить нельзя будет. Ибо условия:
1. Сервер не вернул ошибку
2. Сервер не вернул пустоту
3. Сервер вернул закриптованные данные
4. Данные успешно декриптуются по текущему ключу
5. Ключ проверен на наличие в базе
6. Если он есть => запускаем программу, если условие 5 выполнено а ключа нету => выводим окошко с HWID, если не выполнены условия 2|3|4 => попытка подменить данные, если не выполняется условие 1 => проблемы с сервером.
warl0ck
28.10.2012, 21:21
Например можно закриптовать данные, а ключ хранить в закриптованном виде, естественно обсуфицировать программу. Тогда подменить нельзя будет. Ибо условия:
1. Сервер не вернул ошибку
2. Сервер не вернул пустоту
3. Сервер вернул закриптованные данные
4. Данные успешно декриптуются по текущему ключу
5. Ключ проверен на наличие в базе
6. Если он есть => запускаем программу, если условие 5 выполнено а ключа нету => выводим окошко с HWID, если не выполнены условия 2|3|4 => попытка подменить данные, если не выполняется условие 1 => проблемы с сервером.
А как же ещё проверка цифровой подписи/okay
Sinyss
28.10.2012, 21:24
а почему цифровую подпись никто не юзает?
Хитро ) подписать файл, а потом из файла проверять его целостность =)
Спасибо за мотивацию таки доделать лабу =) (ЦП на эллиптических кривых, на базе укр. законодательства)
Nickitee
28.10.2012, 21:25
А как же ещё проверка цифровой подписи/okay
Я не знаю как пользоваться цифровой подписью.
Банальная криптация увеличит анти-крякабельность программы на 50%. /dgs
Ну и как вариант, сверять размер исполняемого файла вплоть до байтов с валидным размером файла последней версии с сервера в криптованном виде.
warl0ck
28.10.2012, 21:56
Я не знаю как пользоваться цифровой подписью.
Банальная криптация увеличит анти-крякабельность программы на 50%. /dgs
Ну и как вариант, сверять размер исполняемого файла вплоть до байтов с валидным размером файла последней версии с сервера в криптованном виде.
смысл в том что у тебя есть 2 ключа. 1 приватный, 2 публичный. с помощью приватного ключа можно шифровать и расшифровывать, а с помощью публичного только расшифровывать(он будет записан в программе). те ты криптуешь у себя на компьютере данные(допустим hwid) и кидаешь их на сервер. программа скачивает, проверяет публичным ключём целостность данных, если инфа и ключ совпадает всё ок, если нет ошибка
сейчас скину пример
генерация ключа
public RSACryptoServiceProvider rsa;
public void AssignNewKey()
{
const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "SpiderContainer";
CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
rsa = new RSACryptoServiceProvider(2048, cspParams);
//provide public and private RSA params
StreamWriter writer = new StreamWriter(@"privatekey.xml");
string publicPrivateKeyXML = rsa.ToXmlString(true);
writer.Write(publicPrivateKeyXML);
writer.Close();
//provide public only RSA params
writer = new StreamWriter(@"publickey.xml");
string publicOnlyKeyXML = rsa.ToXmlString(false);
writer.Write(publicOnlyKeyXML);
writer.Close();
}
public string enc(string ptext) //криптовка
{
// hash
SHA1CryptoServiceProvider cryptoTransformSHA1 = new SHA1CryptoServiceProvider();
//using System.Security.Cryptography;
byte[] buffer = Encoding.ASCII.GetBytes(ptext);
buffer = cryptoTransformSHA1.ComputeHash(buffer);
// sign
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
XmlDocument xmlPrivateKey = new XmlDocument(); //using System.Xml;
xmlPrivateKey.Load("privatekey.xml");
RSA.FromXmlString(xmlPrivateKey.InnerXml);
RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);
RSAFormatter.SetHashAlgorithm("SHA1");
byte[] SignedHash = RSAFormatter.CreateSignature(buffer);
return Convert.ToBase64String(SignedHash);
}
Бонально считать фаил(с построчно занесенными ключами) с сервера в переменную и осуществить поиск по совпадению? Не?
string Key_File ="[Ссылки могут видеть только зарегистрированные и активированные пользователи]";//Ссылка на базу
string serv = null;
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])WebRequest.Create(Key_File);
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
serv = reader.ReadToEnd();
Пример поиска
static int a = 0;
string temp = String.Empty;//переменная содержащая полученный индитификатор машины
while (a != -1)
{
a = RichTextBox.Find(temp, a, RichTextBoxFinds.None);
if (a != -1)
{
//---Проверка пройдена(в базе)
}
else
{
//---Проверка не пройдена(нет в базе)
}
break;
}
a++;
Этот код можно совместить с кодом ТС'а , или нужно все полностью переписывать ?
Lubot
31.10.2012, 17:36
Пример поиска
Код:
static int a = 0;
string temp = String.Empty;//переменная содержащая полученный индитификатор машины
while (a != -1)
{
a = RichTextBox.Find(temp, a, RichTextBoxFinds.None);
if (a != -1)
{
//---Проверка пройдена(в базе)
}
else
{
//---Проверка не пройдена(нет в базе)
}
break;
}
a++;
string html = strReader.ReadToEnd();
if(html.IndexOf("что ищем") == -1)
{
// не найдено
}
else
{
// найдено
}
вот это попроще будет
Sinyss
31.10.2012, 17:55
вот это попроще будет
это и обойти намного проще...