Получение серийного номера материнской платы - C#
Формулировка задачи:
насколько это надежно работает? будет ли он ТОЧНО получен или скажем так- получен но не для всех моделей. Кто нибудь знает подробности? Или может рациональнее получать какую нибудь другую черту hardware(чтобы потом использовать как элемент защиты программы)
Решение задачи: «Получение серийного номера материнской платы»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Management; using System.Reflection; using System.Security.Cryptography; namespace MyNanespace { static class Protector { //Код машины где запущена программа public static string FullMachineInfo { get; private set; } //Путь к файлу ключа static string keyFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Filename.bin"); //Статический конструктор static Protector() { //Построение строки-кода string mcuID = new string(GetProcessor_ID().Select(ch => (char)(ch + 1)).ToArray()); string mbID=new string(GetMotherBoard_ID().Select(ch=>(char)(ch+1)).ToArray()); FullMachineInfo=string.Join("@",mcuID, mbID); } //Открытый метод проверки наличия и корректности ключа public static bool GetRegisterResult() { if (!File.Exists(keyFilePath)) { return false; } if (!Decrypt(keyFilePath)) { return false; } return true; } //Метод дешифрования-файла ключа static bool Decrypt(string path) { //Формирование ключа дешифровки с подгонкой под размер List<byte> providerKey = new List<byte>(Encoding.Default.GetBytes(FullMachineInfo)); if (providerKey.Count < 0x20) { providerKey.AddRange(new byte[0x20 - providerKey.Count]); } else { providerKey.RemoveRange(0x20, providerKey.Count - 0x20); } //Формирование вектора инициализации дешифровки byte[] providerIV = Enumerable.Range(0, 0x10).Select(i => (byte)i).ToArray(); //Текущая исполняемая сборка Assembly asm = Assembly.GetExecutingAssembly(); //Тело точки входа MethodBody mainMethodBody = asm.EntryPoint.GetMethodBody(); //CIL код оригинальной точки входа как массива байт byte[] entryPointOriginal = mainMethodBody.GetILAsByteArray(); //Массив байт файла-ключа(зашифрованная точка входа) byte[] entryPointEncrypted = File.ReadAllBytes(path); //Объект-шифровальщик using (Aes provider = Aes.Create()) { //Ключ и вектор инициализации шифровальщика provider.IV = providerIV; provider.Key = providerKey.ToArray(); //Дешифратор using (ICryptoTransform decryptor = provider.CreateDecryptor()) { //Блок обработки ошибок try { //Массив расшифрованной точки входа из файла ключа byte[] entryPointDecrypted = decryptor.TransformFinalBlock(entryPointEncrypted, 0, entryPointEncrypted.Length); //Сравнение по размеру if (entryPointOriginal.Length != entryPointDecrypted.Length) { return false; } //Сравнение по значениям for (int i = 0; i < entryPointDecrypted.Length; i++) { if (entryPointDecrypted[i] != entryPointOriginal[i]) { return false; } } } catch { //Возврат false при ошибке расшифровки return false; } } } return true; } #region NOT_USED //Метод получения информации о целевом ПК static void GetUserConfigurationInfo() { SelectQuery[] queries = new SelectQuery[3]{ new SelectQuery("Win32_Processor"), new SelectQuery("Win32_BaseBoard"), new SelectQuery("Win32_VideoController") }; string[] infoQueries = { "processorId", "SerialNumber", "AdapterRAM" }; string[] results = new string[3]; int index = 0; foreach (SelectQuery query in queries) { ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection.ManagementObjectEnumerator enumerator = searcher.Get().GetEnumerator(); while (enumerator.MoveNext()) { ManagementObject info = (ManagementObject)enumerator.Current; results[index] = info[infoQueries[index]].ToString().Trim(); } index++; } FullMachineInfo = new string(string.Join("@", results).Select(ch => (char)(ch + 1)).ToArray()); } #endregion #region USED //Метод для получения ProcessorID private static string GetProcessor_ID() { string ProcessorID = string.Empty; SelectQuery query = new SelectQuery("Win32_processor"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection.ManagementObjectEnumerator enumerator = searcher.Get().GetEnumerator(); while (enumerator.MoveNext()) { ManagementObject info = (ManagementObject)enumerator.Current; ProcessorID = info["processorId"].ToString().Trim(); } return ProcessorID; } //Метод для получения MotherBoardID private static string GetMotherBoard_ID() { string MotherBoardID = string.Empty; SelectQuery query = new SelectQuery("Win32_BaseBoard"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection.ManagementObjectEnumerator enumerator = searcher.Get().GetEnumerator(); while (enumerator.MoveNext()) { ManagementObject info = (ManagementObject)enumerator.Current; MotherBoardID = info["SerialNumber"].ToString().Trim(); } return MotherBoardID; } //Метод для получения VideoController_RAM private static string GetVideoAdapter_ID() { string MotherBoardID = string.Empty; SelectQuery query = new SelectQuery("Win32_VideoController"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); ManagementObjectCollection.ManagementObjectEnumerator enumerator = searcher.Get().GetEnumerator(); while (enumerator.MoveNext()) { ManagementObject info = (ManagementObject)enumerator.Current; MotherBoardID = info["AdapterRAM"].ToString().Trim(); } return MotherBoardID; } #endregion } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д