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