原文:http://www.jiamisoft.com/blog/index.php/3469-yingpanhaocpuruanjianjiami.html

计算机软件是一种特殊的产品,为了防止软件的非法复制、盗版,保护软件开发商的利益,就必须对软件进行加密保护。下面我就给大家介绍一个利用硬盘号和CPU序列号为软件加密的方法。

一、基于硬盘号和CPU序列号的软件加密技术的原理

软件会根据微机硬件参数给出该软件的序列号;用户需要把这一序列号用E-mail、电话或邮寄等方法寄给软件提供商或开发商,软件开发商利用注册机(软件)产生该软件的注册号寄给用户即可。它的注册信息与机器的硬件信息有关,不同于以前的序列号的注册方法,提高了软件的安全性。

二、硬盘号与CPU序列号

1、硬盘序列号

硬盘想序列号是出厂时生产厂家为区别产品而设置的,是唯一的,是只读的,利用硬盘序列号的加密往往是利用其唯一和只读的特性。在有的加密软件中采用的是硬盘卷的序列号:以指硬盘的逻辑盘,如:“C:”、“D:”等,是高级格式化时随机产生的,是可以修改的,由于其可修改,所以利用其进行加密,对于安全而言就大打折扣了。硬盘的卷号通过WINAPI函数,GetVolmeIn-formation即可获得。就IDEHDD而言,对于没有序列号或SCSIHDD硬盘则无能为力,这也是利用它进行加密的局限性。

2、CPU序列号

CPU序列号是一个建立在处理器内部的、唯一的、不能被修改的编号。它由96位数字组成。高32位是CPUID,用来识别CPU类型。低64位每个处理器都不同,唯一地代表了该处理器。CPU号可以用来识别每一个处理器。为了适应这一新特征,Intel在处理中增加了两条指令(“读取”和“禁止”)和一个寄存器位。读取指令扩展了CPUID读取指令。当执行读取指令时可以得到96位的处理器序列号。禁止指令可以禁止对处理器序列号的读取。为了配合CPU序列号的读取和禁止,设置了MSR位。当MSR位为“0”时可以读取CPU序列号;当MSR为“1”时只能读取高32位(即CPUID)而低64位全为零。

三、如何利用硬盘号和CPU序列号为软件加密

1、加密方法

通过应用程序取得机器硬盘号和CPU号通过加密程序形成一个注册序列号,用户将这个注册序列号发送到软件注册者,软件注册者按照预定的算法生成注册码,然后将其发给用户,通过注册形成合法用户。软件每次启动时都到注册表或注册文件的相应位置读取注册码并与软件生成的注册码比较,一致则是合法用户,否则是非法用户。由于注册码与用户计算机的硬盘号和CPU号相关联,故其是唯一的,非法用户即使知道注册序列号与注册码也无法使用。

2、实现过程

(1)CPU号的读取

硬盘的序列号只能采用对硬盘控制器直接操作的方式进行读取,也就是说只能采用CPU的I/O指令操作硬盘控制器,对于CPU号的读取采用了在DELPHI嵌入汇编的方法读取。

其读取方法如下:MOVEAX,01H

如果返回的EDX中,低18位为1,那么这个CPU就是支持序列号的。此时EAX就是序列号的高32位。这32位对同一型号的CPU是一样的。再执行:

MOVEAX,03H

此时的EDX:ECX就是序列号的第64位。

(2)硬盘号的读取

硬盘号的读取通过CreateFile函数,CreateFile可以打开物理设备和串口等,使用CreateFile(”\\\\.\\PHYSICALDRIVEI”,…)打开硬盘,其中的I为0-255,其为需要读取的硬盘。命令如下:

hDevice:=CreateFile(”\\.\PhysicalDrive0″,GENERIC_READorGENER-IC_WRITE,FILE_SHARE_READorFILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0)

使用DeviceIoContro函数对打开的设备进行通信,发送指定命令,根据返回的PSENDCMDOUTPARAMS结构,得到物理序列号和模型号,把物理序列号和模型号格式化为一定的格式输出。

(3)对注册表的操作

Delphi程序中可利用TRegisty对象来存取注册表文件中的信息。

①创建和释放TRegisty对象通过Create和Destroy来创建对象和释放内存。

②读取注册表中写入信息对于注册表数据的读取可采用Read-String、ReadInteger、ReadBinaryData等函数来读取字符串、数值、二进制值。

③向注册表中写入信息Write系列方法将信息转化为指定的类型,并写入注册表。对于注册表数据的写入可采用Read-String、ReadInteger、ReadBinaryData来写入字符串、整数值、二进制值。

基于硬盘号和CPU序列号的软件加密技术对于读取的硬盘号、CPU号可以通过MD5加密算法产生一个注册号,保证软件加密的可靠性,可有效地防止非法用户破解软注册码,保护软件的知识产权。

小知识之MD5加密算法:

MD5就是采用单向加密的加密算法,对于MD5而言,有两个特性是很重要的,第一是任意两段明文数据,加密以后的密文不能是相同的;第二是任意一段明文数据,经过加密以后,其结果必须永远是不变的。前者的意思是不可能有任意两段明文加密以后得到相同的密文,后者的意思是如果我们加密特定的数据,得到的密文一定是相同的。

【miscellaneous】如何利用硬盘号和CPU序列号为软件加密相关推荐

  1. c#中如何获取本机用户名、MAC地址、IP地址、硬盘ID、CPU序列号、系统名称、物理内存...

    我们在利用C#开发桌面程序(Winform)程序的时候, 经常需要获取一些跟系统相关的信息, 以下这些代码获取能有些用处. c#中如何获取本机用户名.MAC地址.IP地址.硬盘ID.CPU序列号.系统 ...

  2. LabVIEW获取主板序列号和硬盘序列号用于软件加密

    LabVIEW获取主板序列号和硬盘序列号用于软件加密* 1,通过系统命令获取,快速便捷,无32bit和64bit顾虑 2,利用硬盘ID和主板ID联合加密,安全性更高,且都是硬件唯一标识码 3,labv ...

  3. 获得服务器硬件信息(CPUID、硬盘号、主板序列号、IP地址等)

    1 // 注意:首先要在项目中添加引用 System.Management 2 3 using System; 4 using System.Collections.Generic; 5 using ...

  4. python获取主板序列号_LabVIEW获取主板序列号和硬盘序列号以进行软件加密

    04-12阅读85 CPU序列号是唯一的编号,只能在处理器内部进行修改. 它由96位数字组成. 高32位是用于标识CPU类型的CPU ID. 每个处理器的低64位不同,并且唯一表示该处理器. 该CPU ...

  5. python获取本机 ip地址、mac地址(物理地址)、计算机名、硬盘序列号、CPU序列号、主板序列号、bios序列号、bios uuid号

    文章目录 python获取本机IP地址.mac地址(物理地址).计算机名 物理地址 计算机名.ip地址 硬盘序列号 CPU序列号 主板序列号 bios序列号 bios uuid号 python获取本机 ...

  6. C/C++ 获取硬件唯一标识 (CPU序列号/硬盘号)

    调用控制台来获取CPU序列号/硬盘号 不同PC的硬盘数量可能不同 若有多个硬盘,此处的输出将多个硬盘号拼接到了一起 若需拆分可自行修改. 注:插拔硬盘U盘等会造成获取到的硬盘号不同,如果想以此为机器码 ...

  7. 用C#获取硬盘序列号,CPU序列号,网卡MAC地址

    这个问题首先得考虑的就是你的硬盘是不是SCSI硬盘 如果是,那么根本不存在"物理序列号",只可能取得卷标的序列号 如果是卷标序列号,要注意的是每次格式化硬盘的时候这个序列号都会变 ...

  8. python wmi读取网卡MAC地址、CPU序列号、硬盘序列号、主板序列号、BIOS序列号

    序列号相当于电脑的身份证号,是硬件出厂时,厂商写在硬件里的唯一识别码,具有唯一性和不可修改性.很多正版软件以此来识别用户电脑,限制安装. import uuid import wmi def get_ ...

  9. C语言获取硬件信息(CPU序列号,硬盘序列号,网卡IP、MAC地址、是否插入网线)

    目录 一.前言 二.代码实现 2.1 获取CPU序列号 2.2 获取硬盘序列号 2.3 获取网卡信息 附:源代码下载 一.前言   本文主要介绍Linux和Windows下使用C语言获取各种硬件信息, ...

  10. Python获取电脑硬件配置的封装类,可以获取CPU序列号、主板序列号、BIOS序列号、硬盘序列号和网卡MAC地址

    Python获取电脑硬件配置的封装类,可以获取CPU序列号.主板序列号.BIOS序列号.硬盘序列号和网卡MAC地址. myPyHardware.py # -*- coding: utf-8 -*- i ...

最新文章

  1. Java-Frame
  2. Java Stringbuilder简单介绍
  3. android中的shape资源,Android Drawable资源讲解之shape篇
  4. ant-design table 分页(tableProps)
  5. simulink 分析达芬方程
  6. oracle imp导入库到指定表空间
  7. 怎么快速了解自己的MySQL服务器
  8. 2019.04.14_16.1 - 17.5
  9. 硬件WAF的制作!linux系统制作硬件WAF,实现透明代理,具备断电、故障Bypass功能。...
  10. 机器学习和深度学习资源汇总(陆续更新)
  11. 百度火星WGS84坐标转换
  12. 如何1秒内快速判断一个函数的凹凸性?还看不懂我给你赔钱
  13. camx框架-Camera初始化
  14. 电子商务网站测试总结
  15. 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
  16. 超级记忆法(4)——第二小时
  17. 软件测试工程师职业发展漫谈
  18. APAP多图拼接代码配置运行总结
  19. 【小猫爪】AUTOSAR学习笔记12-功能安全之E2E模块
  20. 2、maven案例idexXML调模板maven运Tomcat报错org.apache.jasper.JasperException: Unable to compile class forJSP

热门文章

  1. 车型代号对照表_上海大众车型与VIN代号对照表
  2. workbench动力学周炬_ANSYS Workbench有限元分析实例详解 动力学 周炬 苏金英 ANSYS Workbench动力学数值模拟模态分析教程 有限元理论和工程实践书...
  3. coco2017数据集百度网盘链接
  4. 智能混音插件 – iZotope Neutron Advanced 3.11 win-mac
  5. 构建自己的Aleax查询服务
  6. Face photo recognition using sketch (人脸画像合成)
  7. DHCP报文分析及C/C++代码实现
  8. 使用ffmpeg打开ts格式视频文件
  9. 随机划分训练集和测试集
  10. mysql怎么设主键和外键_MySQL基础之 主键外键设置