[Руководство] [C#] Привязка К Железу V2.

Тема в разделе "Создания ПО", создана пользователем FoLez, 18 авг 2013.

Статус темы:
Закрыта.
  1. FoLez

    FoLez Active Member

    Репутация:
    0
    Регистрация:
    4 май 2013
    Сообщения:
    1.088
    Симпатии:
    1
    Intro



    Всем привет! Т.к. привязка v1 была сделана не совсем правильно (особенно хранение hwid) я решил сделать новую версию, на этот раз подменить ответ будет невозможно. Только надо изменять инструкции программы для "кряка". В этой привязке мы сможем задавать время, до которого будет действительна лицензия.



    Что нам понадобится



    Для просмотра внешних ссылок необходимо зарегистрироваться либо авторизоваться

    Пароль:

    pbhack



    Начнём​





    1. Для начала необходимо создать MySQL базу. Для этого зарегистрируемся на Для просмотра внешних ссылок необходимо зарегистрироваться либо авторизоваться Не реклама! и создадим MySQL базу (не MSSQL).

    У вас должно получится что-то типо такого:

    [​IMG]



    2. Теперь создадим таблицу в MySQL базе данных, где будет храниться информация для лицензии. Для этого зайдём в phpMyAdmin, введём туда данные (пароль после регистрации бд приходит на почту) и нажмём "Создать таблицу", количество полей 2 - с именами "Hardware ID" и "End Time", тип - TEXT, и далее обязательно выставтить сравнение на "utf8_general_ci". и нажать "Сохранить".

    [​IMG]





    3. Теперь надо сгенерировать паблик и приват ключи RSA. Для этого создадим проект с шаблоном "Приложение Windows Forms" и назовём его RSAKeysGenerator, далее на основную Form кинем 2 textBox-a, 2 label-a и 1 кнопку. Так же добавим в проект DigitalSign.cs.

    [​IMG]



    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.

    Жмём на кнопку, получаем

    [​IMG]



    9. Идём в phpMyAdmin, открывает нашу таблицу выбираем "Вставить", в Hardware ID пишем то, что выдал richTextBox, в EndTime время окончания, строго в таком формате: 14.07.2013 20:00:00

    [​IMG]



    10. Опять нажимаем на кнопку, и получаем:

    [​IMG]



    11. Пробуем поставить время окончания лицензии раньше нашего текущего времени, получем:

    [​IMG]



    Заключение





    Я сделал лишь основу, дальше вы можете модернизировать, как вам захочется, сделать автоматическое добавление в базу и т.д.

    Самое главное - это обезопасить себя от декомпиляции кода, полностью обезопасить - невозможно, но от обычных юзеров можно.

    Для этого делаем скрытые проверки, делаем условия из нескольких переменных типа int на основе математики и так далее... Ну и конечно использовать обсуфикаторы.



    За основу для работы с RSA на php были взяты скрипты от Jim Wigginton



    Гайд подготовил Nickitee специально для {реклама}

    Автор не несёт ответственности за пользование информацией

    При копировании на другие сайты/блоги/форумы и т.п. - указывать автора​

    Тема Копипаст
     
  2. Teest

    Teest Active Member

    Репутация:
    0
    Регистрация:
    28 сен 2011
    Сообщения:
    2.106
    Симпатии:
    7
    Не вижу смысла делать привязку на решётке
     
  3. FoLez

    FoLez Active Member

    Репутация:
    0
    Регистрация:
    4 май 2013
    Сообщения:
    1.088
    Симпатии:
    1
    Для новичков есть
     
  4. Teest

    Teest Active Member

    Репутация:
    0
    Регистрация:
    28 сен 2011
    Сообщения:
    2.106
    Симпатии:
    7
    Щито? Причём здесь новички?

    Эту привязку хакнуть как 2 пальца обосрать
     
  5. FoLez

    FoLez Active Member

    Репутация:
    0
    Регистрация:
    4 май 2013
    Сообщения:
    1.088
    Симпатии:
    1
    Запиши видео как хакнуть с меня наградка
     
  6. Teest

    Teest Active Member

    Репутация:
    0
    Регистрация:
    28 сен 2011
    Сообщения:
    2.106
    Симпатии:
    7
    Перехватом пакетов. или куда проще- Рефлектором
     
  7. FoLez

    FoLez Active Member

    Репутация:
    0
    Регистрация:
    4 май 2013
    Сообщения:
    1.088
    Симпатии:
    1
    Запиши видео с меня Наградка
     
  8. Teest

    Teest Active Member

    Репутация:
    0
    Регистрация:
    28 сен 2011
    Сообщения:
    2.106
    Симпатии:
    7
    ноу
     
  9. S1S3F3

    S1S3F3 New Member

    Репутация:
    0
    Регистрация:
    20 июл 2011
    Сообщения:
    871
    Симпатии:
    0
    как?) (новичек)
     
  10. NCDesing

    NCDesing New Member

    Репутация:
    0
    Регистрация:
    29 окт 2012
    Сообщения:
    751
    Симпатии:
    0
    Делать привязку на c#? Это же бред полный)

    Лучше изучить тот же С++ и делать там WinForm приложения)
     
  11. Abioz18rus

    Abioz18rus New Member

    Репутация:
    0
    Регистрация:
    27 май 2013
    Сообщения:
    159
    Симпатии:
    0
     
  12. Nickitee

    Nickitee New Member

    Репутация:
    0
    Регистрация:
    9 окт 2013
    Сообщения:
    1
    Симпатии:
    0
    Специально тут зарегался, чтобы утереть нос постодрочерам.

    1. Подмене не поддаётся.

    2. Я накрою паблик реактором, который de4dot не возьмёт, и что дальше? Вы даже исходный код не сможете восстановить, я уже молчу о читабельном виде.
     
  13. #RoX

    #RoX New Member

    Репутация:
    0
    Регистрация:
    22 май 2014
    Сообщения:
    5
    Симпатии:
    0
  14. NoName%

    NoName% Member

    Репутация:
    0
    Регистрация:
    24 авг 2011
    Сообщения:
    807
    Симпатии:
    0
    Не возможно,накрою той же темидой и рефлектор твой будет курить в стороне,а ловить пакет нету смысла,как видно всё продумана,есть только один способ,переадресация на наш сервер с полной подменой файлов
     
  15. Joker456

    Joker456 New Member

    Репутация:
    0
    Регистрация:
    29 янв 2016
    Сообщения:
    1
    Симпатии:
    0
    При получении hwid пишет в richTextBox "0", в чем может быть проблема ?



    Скриншот!

    [​IMG]
     
Статус темы:
Закрыта.

Поделиться этой страницей