PDA

Просмотр полной версии : [Руководство] Привязка на c#


brain()
27.10.2012, 21:57
Привет всем.
Теория:

Эта привязка работает так:
Вам генерируеться ваш уникальный код, чтобы войти в программу вам нужно чтобы ваш код был в базе + ваш логин
Для примера тут 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 = "";

[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
}
}

public class DE
{
public static string GS()//GetSerial
{
string obmanka1 = "7EA1";//пишешь все, что хочешь.
string str1 = "";
ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");
foreach (ManagementObject queryObj in searcher.Get())//Получение ид процессора
{
str1 = queryObj["ProcessorId"].ToString();
}
return str1 + obmanka1;
}
}
}

Далее на форму кидаем 2 лейбла 2 текстбокса и 2 кнопки


нажимаем 2 раза по форме и на событии Form_Load пишем:

if (DE.GS() == K1) //if (DE.GS() == K1 || DE.GS() == K2 || DE.GS() == K3)
{
this.Text = "[Activated]";
textBox1.Text = DE.GS();
}
else
{
this.Text = "[Not activated]";
textBox1.Text = DE.GS();
}

Тепеть после

public Form1()
{
InitializeComponent();
}

пишем:

public static string K1 = "";//тут будут ваши ключи

Теперь нажимаем 2 раза на первую кнопку и вставляем код:

if (textBox2.Text == "BassBoy" & DE.GS() == K1 || textBox2.Text == "Lol" & DE.GS() == K2)
{
MessageBox.Show("Успешно!");
}
else
{
MessageBox.Show("Вашего ключа нету в базе.");
}

а на вторую кнопку:

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);
}

//проверка
//<key1> - незашифрованный текст
//<key2> - зашифрованый
public bool lookkey(string key1, string key2)
{
try
{
byte[] buffer = Encoding.ASCII.GetBytes(key1);
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.KeySize = 2048;
RSA.FromXmlString(@"publickey.xml");
byte[] Signature = Convert.FromBase64String(key2);
return RSA.VerifyData(buffer, "SHA1", Signature);
}
catch
{
return false;
}
}

Awesome kiss
29.10.2012, 13:34
Бонально считать фаил(с построчно занесенными ключами) с сервера в переменную и осуществить поиск по совпадению? Не?



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
вот это попроще будет
это и обойти намного проще...