Identifying a Unique Hardware based on Disk Signature
I am developing a software which employs product activation. We need to bind our software to only one machine, i.e. the user must not be able to activate his copy on more than one computer.
After a lot of searching I found out that using the MAC address of the NIC we can generate a unique hardware ID. But there are various ways to spoof the MAC easily.
There are other serial numbers too like the Motherboard serial, CPU Id, etc. but I found that many hardware manufactures leave them blank, they just print the serial on the physical hardware.
Another way is to use the Hard Disk signature generated by Windows when it is installed on that disk for the first time. The Disk signature seems to good for our purposes, but I have several queries:
For programmer's reference, here's how I get the signature using C++/CLI and WMI classes.
After a lot of searching I found out that using the MAC address of the NIC we can generate a unique hardware ID. But there are various ways to spoof the MAC easily.
There are other serial numbers too like the Motherboard serial, CPU Id, etc. but I found that many hardware manufactures leave them blank, they just print the serial on the physical hardware.
Another way is to use the Hard Disk signature generated by Windows when it is installed on that disk for the first time. The Disk signature seems to good for our purposes, but I have several queries:
- Is the Disk Signature unique across all disks?
- Will the signature change when the user installs a new copy of Windows?
- Can the Disk Signature be changed easily by users?
- Is it advised to rely on the Disk Signature for generating a Unique hardware ID for a system?
For programmer's reference, here's how I get the signature using C++/CLI and WMI classes.
ManagementClass ^mc = gcnew ManagementClass("Win32_DiskDrive"); ManagementObjectCollection ^moc = mc->GetInstances(); Console::WriteLine("Signature of Hard Disk"); for each (ManagementObject ^mo in moc) { try { Console::WriteLine("Signature = " + mo["Signature"]); } catch (Exception ^e) { Console::WriteLine( "Exception : " + e->Message ); } }
0