C#: привязка програми
|
Привіт =) В минулому пості я розказував про обфускацію коду, в цьому розкажу як створити свою “привязку” програми до конкретного компа. |
Для початку, нам потрібно включити System.Management в наш проект.
Робиться це просто:

І у відкритому діалозі вибираємо System.Management:

Далі потрібно підключити декілька модулів в наш проект:
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
а я так розумію в С# можна імена методів змінних і т.д. писати навіть на українській мові???
Мені така фішка сподобалася. Прикольно виглядає!
ага, можна =)
я спеціально написав, шоб показати )
В минулоМУ пості…
пишите статьи на русском, у вас будет больше читателей:) хорошо что то хром умеет переводить с Вашего языка.
да, кстати, будь Ваш код хоть тысячу раз обфусцирован, вот такую строчку:
протектор.валідний_ключ(ключ, код) != true
в IL коде найти можно без особых проблем, и после этого заменить на false ее всю тоже не проблема. Нужно что то более глобальное:)
Jamon: на рахунок російської – подумаємо
Дуже цiкаво….