Получение серийного номера материнской платы - 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
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.571 из 5