Уникальный ID материнской платы или компьютера (04.07.2014). |
![]() |
2014 - Июль | |
04.07.2014 14:52 | |
Сколько копий было сломано, форумов перелажено, кода понаписано, информации перелопачено, людей зае... задействовано. А казалось бы, такая простая проблема: получить уникальный ID материнской платы, чтобы в случае ее замены сказать пользователю: "да иди ты на...". Исходные данные: добавить в программу посыл пользователя в случае, если он ее перенес на другой компьютер. При этом он должен сохранить право переносить ее на другие жесткие диски (в случае их отказа, подыхают чаще всего). При этом нельзя использовать инсталляторы с уникальными серийными номерами как средства интеграции программы внутрь одной конкретной ОС. Используемое ПО: Материнская плата: нужно забыть об уникальном ID материнской платы (свойства SerialNumber, SKU класса Win32_BaseBoard). Беда России: очень много "левака", в том числе и материнских плат. Такие левые материнские платы (и прочее железо) не имеют ни уникального идентификатора, ни времени изготовления - становится не к чему привязаться. В итоге либо заполняются исправно (в легальном железе), либо пустотой или "To be filled by O.E.M" (что означает "будет заполнено производителем". Ага, конечно). Максимум, что можно сделать - стопроцентную защиту от плат другой модели (свойство Product класса Win32_BaseBoard) и/или другой версии BIOS (свойства ReleaseDate, SMBIOSBIOSVersion, SMBIOSMajorVersion, SMBIOSMinorVersion класса Win32_BIOS). Не рекомендуется свойство Manufacturer класса Win32_BaseBoard: может оказаться пустым. Рассматривая USB-ключи (типа eToken) и им подобные - пришел к выводу, что стопроцентной защиты ими создать не удастся (присутствуют программы, которые вообще убиваются через диспетчер задач и становятся деактивированными). Плюс в процесс взлома защиты вовлекутся как продвинутые пользователи с сисадминами, так и великая программа Acronis, копирующая информацию с любого накопителя байт в байт. Из этого следует: привязка должна быть именно к внутреннему железу, а не к виртуальным вещам (вроде пароля на учетную запись). Привязка к серийному номеру Windows также несерьезна (хотя и доступна в свойстве SerialNumber класса Win32_OperatingSystem). Можно между учетными записями привязать программу к одной из них (свойство SID класса Win32_UserAccount или свойство Setting класса Win32_AccountSID). Самая простая привязка - к MAC-адресам сетевых карт (свойство MACAddress класса Win32_NetworkAdapter). И все было бы прекрасно, если бы не тот факт, что много лет назад его научились менять и подделывать. Защита уникальная - но слабенько. Пытался привязаться к процессору - выяснилось, что со времен Pentium-4 уникальный идентификатор процессора не уникален. Защита не уникальная и слабая (свойство ProcessorId класса Win32_Processor). Однако можно привязаться к наименованию процессора (свойства Caption, Name класса Win32_Processor), а также (для примера) поменять в BIOS параметр CPU Host Frequency на 1 (чтобы обеспечить неравенство при новом процессоре свойства ExtClock класса Win32_Processor). Жесткий диск и CD-ROM имеют название модели и код экземпляра (свойства Name, DeviceID, PNPDeviceID классов Win32_DiskDrive, Win32_CDROMDrive). В левой части кода экземпляра этих устройств присутствуют параметры VEN, DEV, SubSys и Rev, необходимые для получения в интернете названия устройства и успешного скачивания драйверов. В правой же части присутствует ещё ряд неизвестных мне цифр. Есть вероятность, что эти числа уникальны для каждого устройства, нужно проверять. Кстати, предпринял попытку поменять SerialNumber (огромный риск!) при помощи сторонней утилиты DMI Tools (не универсальная). Очень опасная работа: ПК после этого может просто не включиться. В моем случае утилита просто не сработала, и я свободно вздохнул. Комплексная защита средней силы: Усиление КЗСС, увеличивающее вероятность ложного срабатывания защиты: |
|
Обновлено ( 18.06.2020 18:02 ) |