شاید شما هم تا به امروز پروژه ای نوشته باشید که هفته ها یا شاید ماه ها روی اون کار کردین و امروز ترس لو رفتن زحمتتون از طریق مشتری ها یا از ملت خون گرم حق کپی رعایت کن مون میترسین.
تو این پست قراره درباره ی جلوگیری از استفاده شدن بدون اجازه از برنامه مون بحث کنیم
شاید اولین فکری که به ذهن یه برنامه نویس نوپا یا یه آدم معمولی برسه اینه که یه کاری کنیم فایل کپی نشه
میشه این کار رو کرد ولی برای اینکار برنامه باید حداقل یه بار اجرا بشه
عمل کپی شدن در ویندوز رو در نظر بگیرید
برای کپی نشدن یک فایل یا باید کلا کپی شدن رو برای تمام فایل ها رو غیر فعال کنیم
یا باید تو ریجستری یک کلید ایجاد کنیم تا اجازه کپی شدن به فایل مورد نظرمون رو نده
عملکرد بعضی از ویروس ها و برنامه های کاربری هم به همین شکله که توضیح کامل این روش در این پست به نظر جایز نیست!!!
خلاصه کلام فایل در هر صورت با این روش کپی میشه
(حالا آماتور ها کپی نکنن یه آدم مثل خودمون خیلی راحت میتونه کپیش کنه)
به نظر من بهترین روش محدود کردن برنامه به سخت افزار میتونه باشه
برنامه رو هرچقدر که میخوان میتونن کپی کنن ولی اگه سخت افزار مورد نظر نباشه نمیشه ازش استفاده کرد.
ما میتونیم برنامه رو به سخت افزار های مختلفی وابسته کنیم
حتی برای امنیت بیشتر میتونیم به چند سخت افزار وابسته اش کنیم
برای اینکار من روش خودم رو توضیح میدم که البته شاید به نظر خیلی از برنامه نویس های اصول گرا روش من کار درستی نباشه
ولی به نظر خودم کار درستیه :)
اصل مطلب :
هر پروژه ای که استارت میزنیم یه فایل به اسم Program.cs ایجاد میکنه برا خودش
این صفحه تعیین میکنه که برنامه چجوری اجرا بشه
این صفحه رو باز کنید
یه سری کد داره
ما اینجا میخواییم بگیم قبل از اجرا شدن برنامه سخت افزاری رو شناسایی کنه ،
اگه سخت افزار شناسایی شده سخت افزاری باشه که ما از پیش براش تعریف کردیم
برنامه رو اجرا کنه
و در غیر این صورت پیام "سخت افزار یافت نشد" رو به کاربر نمایش بده
و برنامه رو اجرا نکنه
برای اینکار کتابخونه ی زیر رو به این صفحه اضافه کنید
using System.Management;
در ادامه کد زیر برای قفل برنامه بر روی USB ها هسسش :)
string seryal = "";
ManagementObjectSearcher s = new ManagementObjectSearcher("select * from win32_DiskDrive where InterfaceType='USB'");
string Str = string.Empty;
foreach (ManagementObject obj in s.Get())
{
ManagementObject se = new ManagementObject("Win32_physicalMedia.Tag='" + obj["DeviceID"] + "'");
seryal = obj.Properties["SerialNumber"].Value.ToString();
}
if (seryal == "usb32")
{
Application.Run(new Form1());
}
else
{
MessageBox.Show("سخت افزار برنامه یافت نشد");
}
کد زیر برای قفل برنامه بر روی CPU هست
ManagementObjectSearcher s = new ManagementObjectSearcher("select * from win32_processor");
foreach (ManagementObject obj in s.Get())
{
ManagementObject se = new ManagementObject("Win32_physicalMedia.Tag='" + obj["DeviceID"] + "'");
seryal = obj.Properties["processorid"].Value.ToString();
}
if (seryal == "cpu32")
{
Application.Run(new Form1());
}
else
{
MessageBox.Show("سخت افزار برنامه یافت نشد");
}
قفل برنامه بر روی مادربورد MotherBoard
ManagementObjectSearcher ComSerial = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard");
foreach (ManagementObject wmi in ComSerial.Get())
{
seryal = wmi.GetPropertyValue("SerialNumber").ToString();
}
if (seryal == "mb32")
{
Application.Run(new Form1());
}
else
{
MessageBox.Show("سخت افزار برنامه یافت نشد");
}
قفل برنامه بر روی هارد دیسک HDD
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
foreach (ManagementObject wmi_HD in searcher.Get())
{
seryal = wmi_HD["SerialNumber"].ToString();
}
if (seryal == "hdd32")
{
Application.Run(new Form1());
}
else
{
MessageBox.Show("سخت افزار برنامه یافت نشد");
}
و .... هر سخت افزاری که شما فکر میکنید میتوانیم برنامه مون رو روی اون سخت افزار قفل کنیم
البته یادتون باشه کدهای خود این صفحه رو نباید پاک کنید
یعنی دو خط زیر باید تو صفحه بمونن
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
یه توضیح مختصر درباره کدها میدم و بحث رو میبندم چون داره طولانی میشه
یه رشته به اسم seryal در ابتدا تعریف کردیم
به کمک جستجوگری مدیریت اشیا شماره سریال سخت افزار رو بدست آوردیم
این شماره سریال رو در رشته seryal تعریف کردیم
در نهایت هم شرط کردیم که اگه سریال سریال مورد نظر ما بود برنامه رو اجرا کنه
دوست ندارم بگم ولی ...
شاید با خودتون بگید خوب ما سریال رو از کجا بدست بیاریم تا در دستور شرطی ازش استفاده کنیم
برای اینکار هم بعد از کد زیر
seryal = wmi_HD["SerialNumber"].ToString();
کد زیر رو قرار بدین
MessageBox.Show(seryal);
سریال سخت افزار رو براتون نمایش میده
یا اصلا میتونید یه برنامه برا خودتون بسازید که هر دکمه ای رو که زدین سریال یه کوفتی رو بهتون نشون بده دیگه
احتمالات خطای کاربری رو هم خودتون پیش بینی کنید و براش کد بنویسید
ایرانی همیشه سرافراز