چند روز پیش یک افزونه در nuget نظرم رو به خودش جلب کرد . بعد از دانلود و نصب اون و مقداری کار کردن باهاش جای خودش رو تو دلم باز کرد ولی متاسفانه این افزونه تا 21 روز رایگان بود. توی نت برای پیدا کردن سریال و یا کرکش زیاد گشتم ولی هیچ چیز یافت نشد . شاید به خاطر اینکه از زمان تولیدش زیاد نمیگذره ... در هر حال گذشتن از خیرش برام سخت بود بنابر این به یاد قدیم تصمیم گرفتم خودم دست به کار بشم و release کنمش ...
بعد از deobfuscate کردنش سیستم امنیتیش نکات خیلی جالبی داشت که یکیش ایجاد شناسهی منحصر به فرد برای هر سیستم بود . البته شاید باورش سخت باشه ولی برای بخش امنیتش 23 تا کلاس داشت که هر کدوم کلی تابع و ... داشتن که همه هم به هم مرتبط بود . تا به حال ندیده بودم توی هیچ افزونه ای اینقدر روی امنیتش کار بشه و خب همینم باعث شد 5-4 ساعت وقتمو بگیره ...
کد زیر رو از یکی از کلاس هاش استخراج کردم که توسط اون میتونید یک شناسه منحصر به فرد بر اساس مشخصات پردازنده - برد اصلی و ... تولید کنید . فقط در هنگام استفاده توجه داشته باشید به ارجاعهای برنامه و اینکه باید System.Management رو به referenceهای برنامه اضافه بکنید حتما ...
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using Microsoft.Win32; using System.Management; namespace ConsoleApplication1 { class Program { private static string GetSystemCode_int1(byte[] byte_0) { if (byte_0 != null) { return Convert.ToBase64String((new MD5CryptoServiceProvider()).ComputeHash(byte_0)); } else { return string.Empty; } } private static string GetSystemCode_int0(string string_2) { if (!string.IsNullOrEmpty(string_2)) { return GetSystemCode_int1(Encoding.UTF8.GetBytes(string_2)); } else { return string.Empty; } } public static string GetSystemCode() { string key = null; if (key == null) { string empty = string.Empty; try { ManagementClass managementClass = new ManagementClass("win32_processor"); ManagementObjectCollection instances = managementClass.GetInstances(); foreach (ManagementBaseObject instance in instances) { try { empty = string.Concat(empty, instance.Properties["processorID"].Value.ToString()); break; } catch { } } } catch { try { ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher("Select * From Win32_BaseBoard"); foreach (ManagementBaseObject managementBaseObject in managementObjectSearcher.Get()) { empty = string.Concat(empty, managementBaseObject["SerialNumber"].ToString().Trim()); } } catch { } } try { ManagementObject managementObject = new ManagementObject("win32_logicaldisk.deviceid=\"C:\""); managementObject.Get(); empty = string.Concat(empty, managementObject["VolumeSerialNumber"].ToString()); } catch { } if (string.IsNullOrWhiteSpace(empty)) { empty = Environment.MachineName; } key = GetSystemCode_int0(empty); } return key; } static void Main(string[] args) { Console.WriteLine(GetSystemCode()); Console.ReadKey(); } } }