在计算机硬件设备中 CPU ID、BIOS、主板、内存、硬盘、卷SN,网卡MAC地址可作为机器特征码,通过硬件检测工具如everest可以看到这一点。
CPU ID
cpu id并不具备唯一性,同一批号的cpu其id可能相同
1、WMI
SELECT ProcessorId FROM Win32_Processor
2、API
貌似没有相关win32 api可以用于获取CPU ID的
3、ASM
http://devpinoy.org/blogs/cvega/archive/2006/04/07/2658.aspx
BIOS SN
1、WMI
SELECT SerialNumber FROM Win32_BIOS
基本上是返回“0000000000”
2、API
没有找到相关api
3、ASM
没有找到C#相关
主板 SN
1、WMI
SELECT SerialNumber FROM Win32_BaseBoard
基本上返回空
2、API
没有找到相关API
3、ASM
没有找到C#相关
内存 SN
1、WMI
SELECT SerialNumber FROM Win32_PhysicalMemory
基本上返回空
2、API
没有找到相关API
3、ASM
没有找到C#相关
硬盘 SN
SCSI硬盘据说是没有ID的
1、WMI
SELECT SerialNumber FROM Win32_PhysicalMedia
对SATA硬盘无效
2、API
DeviceIoControl 这是一个复杂的函数,以下是一个摘自网络可以直接调用的cs
3、使用DLL
提取硬盘ID动态链接库 V2.00
卷 ID
由Format命令生成,Ghost可复制,同时也存在卷ID修改软件
1、WMI
SELECT VolumeSerialNumber FROM Win32_LogicalDisk
2、API
GetVolumeInformation
网卡 MAC
获取MAC的方法有很多,常规方法如WMI、API、COM、NetWorkInterface类等,请参考“网卡MAC地址修改”一章,网卡的MAC地址是可以伪造的,要获取固件中的MAC地址,应使用DeviceIoControl API
以下是摘自网络的一个可以直接调用的css
可以以NetWorkInterface类的id属性调用GetNicAddress
注意:
硬件的ID也好SN也好,甚至包括网卡的MAC并不是绝对具备的或可读取的,不同的硬件产商可能有不同的作法,因此在处理硬件特征码时应作好空判断及异常捕获
DeviceIoConstrol是可以被Hook的
可以考虑用其它信息,如硬件的GUID、DeviceID等作为特征
推荐使用CPUID+硬盘SN+卷SN+网卡固件MAC作为机器特征码,并对组成作最底限制,如必须有某些特,否则生成的相应特征码是不安全的
参考资料:
C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编号)说明
http://blog.csdn.net/docflying/archive/2009/04/27/4128146.aspx
获取网卡MAC、硬盘序列号、CPU ID、BIOS编号
http://www.lihuasoft.net/article/show.php?id=2830
C#取机器码
http://www.cnblogs.com/easydata/archive/2007/09/10/888592.html
C#应用:读取指定盘符的硬盘序列号
http://www.wangchao.net.cn/bbsdetail_546503.html
C#读硬盘序列号的原代码
http://www.chenjiliang.com/Article/View.aspx?ArticleID=2058
C#代码获取网卡地址
http://www.cnblogs.com/osoft1983/archive/2008/12/10/1351678.html
C#实现启用、禁用本地网络的三种方式
http://blog.csdn.net/zjfei/archive/2009/04/23/4104660.aspx