Home > Інше > C#: привязка програми

C#: привязка програми

  Привіт =)
В минулому пості я розказував про обфускацію коду, в цьому розкажу як створити свою “привязку” програми до конкретного компа.

Для початку, нам потрібно включити System.Management в наш проект.
Робиться це просто:
C# Добавить ссылку
І у відкритому діалозі вибираємо System.Management:
C# Добавить ссылку

Далі потрібно підключити декілька модулів в наш проект:

using System.Net;
using System.Management;
using System.Management.Instrumentation;
using System.IO;

Далі потрібно придумати цікавий і запутаний алгоритм відправки коду на наш сервер..
Нехай це буде так:
- в UserAgent відправляється наш key
- також в _GET шлемо ?key=key

php-скрипт, який приймає та перевіряє дані:

	$key = @$_SERVER['HTTP_USER_AGENT'];

	if ( !empty($key) && isset($_GET[$key]) && $_GET[$key] == $key )
	{
		$code = md5( $key . "uasc.org.ua" );
		if ($code == @$_GET['code']) {
			die('true');
		}
	}

	die('false');

Як видно із скрипта в _GET[key] це ключ юзера, а _GET[code] це згенерований програмою ключ, відповідно до ip \ mac \ або інших параметрів пк.

Тепер напишемо деякий клас protectProject, який буде генерувати ключ на основі MAC-адреси, а також перевіряти його валідність:

    class protectProject
    {
        public string получити_ключ()
        {
            string MACAddress = GetMACAddress();
            string ключ = HashString(MACAddress + "x" + MACAddress);
            ключ = HashString(ключ + "x" + ключ);
            return ключ.Substring(0, 10);
        }

        public bool валідний_ключ(string key, string code)
        {
            HttpWebRequest ua = (HttpWebRequest)System.Net.WebRequest.Create(
                    "http://uasc.org.ua/files/csharp_check_license.php?" + key + "=" + key + "&code=" + code
            );
            ua.AllowAutoRedirect = false;
            ua.Timeout = 10000;
            ua.UserAgent = key;
            ua.Accept = "*/*";
            ua.Method = "GET";
            ua.Referer = "http://uasc.org.ua/";
            try
            {
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)ua.GetResponse();
                StreamReader myStreamReadermy = new StreamReader(myHttpWebResponse.GetResponseStream(), Encoding.GetEncoding(1251));
                string result_page = myStreamReadermy.ReadToEnd();
                if (result_page == "true")
                {
                    return true;
                }
            }
            catch {}
            return false;
        }

        public static string GetMACAddress()
        {
            ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection moc = mc.GetInstances();
            string MACAddress = String.Empty;
            foreach (ManagementObject mo in moc)
            {
                if (MACAddress == String.Empty) // only return MAC Address from first card
                {
                    if ((bool)mo["IPEnabled"] == true) MACAddress = mo["MacAddress"].ToString();
                }
                mo.Dispose();
            }
            return MACAddress;
        }

        private static string HashString(string Value)
        {
            System.Security.Cryptography.SHA1CryptoServiceProvider x = new System.Security.Cryptography.SHA1CryptoServiceProvider();
            byte[] data = System.Text.Encoding.ASCII.GetBytes(Value);
            data = x.ComputeHash(data);
            string ret = "";
            for (int i = 0; i < data.Length; i++)
            {
                ret += data[i].ToString("x2").ToLower();
            }
            return ret;
        }
    }

protectProject.получити_ключ() = повертає персоналький ключ пк
protectProject.валідний_ключ(string key, string code) = перевірка ключа key

Приклад використання:

    class Program
    {
        static void Main(string[] args)
        {
            protectProject протектор = new protectProject();
            string ключ = протектор.получити_ключ();
            Console.WriteLine("ID вашого ПК: " + ключ);

            Console.Write("Введiть ваш персональний ключ: ");
            string код = Console.ReadLine();
            Console.WriteLine("");

            if (протектор.валідний_ключ(ключ, код) != true)
            {
                Console.WriteLine("FAIL");
                Console.ReadLine();
                return;
            }

            Console.WriteLine("SUCCESS");
            Console.ReadLine();
        }
    }

також можна добавити купу провірок в пхп-скрипт \ c#-код, і не забути (!!) зробити обфускацію коду =)

В результаті , гарантую Вам, захист і привязку вашої програми =)

Скачати код: http://uasc.org.ua/files/projectProtector.zip

Categories: Інше Tags: , ,
  1. May 25th, 2010 at 16:04 | #1

    а я так розумію в С# можна імена методів змінних і т.д. писати навіть на українській мові???
    Мені така фішка сподобалася. Прикольно виглядає!

  2. May 25th, 2010 at 19:21 | #2

    ага, можна =)
    я спеціально написав, шоб показати )

  3. May 26th, 2010 at 10:20 | #3

    В минулоМУ пості…

  4. Jamon
    May 30th, 2010 at 08:53 | #4

    пишите статьи на русском, у вас будет больше читателей:) хорошо что то хром умеет переводить с Вашего языка.

  5. Jamon
    May 30th, 2010 at 09:04 | #5

    да, кстати, будь Ваш код хоть тысячу раз обфусцирован, вот такую строчку:

    протектор.валідний_ключ(ключ, код) != true

    в IL коде найти можно без особых проблем, и после этого заменить на false ее всю тоже не проблема. Нужно что то более глобальное:)

  6. May 31st, 2010 at 14:54 | #6

    Jamon: на рахунок російської – подумаємо

  7. July 5th, 2010 at 19:38 | #7

    Дуже цiкаво….

  1. No trackbacks yet.