Intro Всем привет! Т.к. привязка v1 была сделана не совсем правильно (особенно хранение hwid) я решил сделать новую версию, на этот раз подменить ответ будет невозможно. Только надо изменять инструкции программы для "кряка". В этой привязке мы сможем задавать время, до которого будет действительна лицензия. Что нам понадобится Для просмотра внешних ссылок необходимо зарегистрироваться либо авторизоваться Пароль: Спойлер pbhack Начнём 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. Спойлер 4. На кнопку а именно в эвент Click запишем код: Код: string publicKey = String.Empty; string privateKey = String.Empty; DigitalSign.AssignNewKey(ref privateKey, ref publicKey); textBox1.Text = privateKey; textBox2.Text = publicKey; Главное не путать textBox-ы куда записываем ключи! (Хотя определить private и public ключи не сложно) 5. Теперь этот проект понадобится только для генерации ключей. 6. Теперь откроем globalsettings.php и изменим настройки: Код: $RSAprivateKey = "<RSAKeyValue><Modulus></Modulus><Exponent></Exponent></RSAKeyValue>"; Сюда в кавычки мы скопируем приват ключ, у меня получилось так Спойлер Код: $RSAprivateKey = "<RSAKeyValue><Modulus>qPATiJQqZiJayNJkknPQ4IhFBXDHWYiBJeSE2QiuRwb5en+58OADRh6ssXzZIo9CyHDjlLB8ETjkrY4pPjO+SmH9h55tVns/VKyi73rZxDg4+EsenZUXa19z7SuzlhCyq/JXW2/SMSADBBKjch2L+JQuZi46eHxWZVyNFvzKy8XaCWYJFDgk9XYirUZ0XesL/UYMxTjiePCOjZJM6w6X+iUGWZhMcDfXsFnLpWJ1rXPUBGjPJrrnFs7GyKuuyw4UsXkD6jH6R4uiP2392Zf6bHwnQC5xGdT/1kP/kjIa42EakXrwkcQkpJj1SSy9MvYX0TJQ5SKOwi5jXEF0GZAVHw==</Modulus><Exponent>AQAB</Exponent> 4aEI1nXR2GLpbdyV5VfQkq5ZlO3/daczu0ns52RE6pgVVO32L+cFsFYJy03d8KmAI5MozZ8BMv15ug7Hj6m+/RyMQIBOcLHwNLgs/MPzF/BOArbORsDu+6jHr022kN4Org5NLz/3pkVPA/zOuVqIuKGP3mSvxXS+mofiLZoQz3E=</P><Q>v62DvtWjTJ+PDvCxdILRBplVEjFuufCCYSIP6XcsC5jq5hbMizsOka6WmYaoK8jmyXi1idbWjLU5N/Fj5W0pnslE9lRoDlLD+xmhWuV0TwEeHbLl0+kWJ6CAcMFOFF4LiAbtN6SG0WNw8AJtwOTqjxzlvDVfeck07BGEgzaPBY8=</Q><DP>I8RYV07kDg5X/K9sH6gVCzuSPdagmXEA9V6ZrHCrsBidwRHb5eoUb8ij0tOsLBtikcEhRb8//GpMIp93KSH6gbtFzG/Kf3jloCXWE9eoMJJKe4mpF3Q8Li6qQPLrzvk0kIj52VSlmHkCNpqb1qwwYjxSRynk50NDd9G0nBABPDE=</DP><DQ>UyEmvTIcc5PT0I/09mnxy6Heclh8BCpZ8VR7gC6OLK1yWr3SkiPXyrjkWcs7zlmANiqi2RgSzs2d9jQ7tfnlDheOUCMFSgj9ND7GawyOp+D9NbYr1P8G+8KxUbWUbmLnL2SJpxM04UT2azEydnERhWXsAPdI5CGuUR+7z8huuOM=</DQ><InverseQ>Lx6Fnqvj7/uo6MxSMm26lHReHTHn8SGFx1mI7Z+4+NgB9hqO+OaCXZ3oQJiSVlHzv7Be+72mPyu6A60Y5DUBAif3NA90vLJ+3hFMeD9jA5KhHDSbOgFoqKzHmedXl+lYQhhhaFpsomInOTMItrSvn1tNwi6RU1pJSc2suQT9r5c=</InverseQ><D>O71Buw9h+uH1JoS3yc4os+2cMrNR20hZGxQ3IiRetIEz4WyfTR16KuaX/N+ATSdJ32WEJMVP6isrOnBGB1f214jVRYrxcR5+I6w0pejUbv3Or4ao2eKp+G81qE3G4K8g74rv90aQloySZHNO1wC5yXpk+f8o8AhP6OIUhmd4Mxw9T12sAvdp2Px3FsG4F2r2pF5YNIt8PAcV6uhYiZEdb+qR+HrZOj99Is+aGwuAhlAmsQcOEkARYuYwlYI6ZYjGsYWyEQGscdOMBFXrR6k1zdO6B0gVns5rWHOM82805qU8EPAlf19fL2Pqf8H1evTsLWQMNnoqqUDDZihD3FwQ4Q==</D></RSAKeyValue>"; Далее Код: $MySQL_hostname = "sql.site.com"; Мы заменяем на адрес сервера где расположена 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 специально для {реклама} Автор не несёт ответственности за пользование информацией При копировании на другие сайты/блоги/форумы и т.п. - указывать автора Тема Копипаст
Специально тут зарегался, чтобы утереть нос постодрочерам. 1. Подмене не поддаётся. 2. Я накрою паблик реактором, который de4dot не возьмёт, и что дальше? Вы даже исходный код не сможете восстановить, я уже молчу о читабельном виде.
Не возможно,накрою той же темидой и рефлектор твой будет курить в стороне,а ловить пакет нету смысла,как видно всё продумана,есть только один способ,переадресация на наш сервер с полной подменой файлов