python读取电脑识别码

多努力就会有多特殊(neverforever)——仌

目标

用python语言,识别电脑机器码,通过授权码,只允许软件运行在唯一电脑上,实现“一机一码”。
:程序识别的机器码包括:
1.CPU***(ID)
2.本地连接 无线局域网 以太网的MAC
3.硬盘***(唯一)
4.主板***(唯一)

实现方法

软件安装后,运行软件时,通过电脑机器码的唯一性实现授权码的唯一性。

实现过程

  1. 运行软件,检测注册文件,若未检测到注册文件或者注册文件中的***与DES+base64加密的***不一致,则提醒用户输入***或重新获取***。重新获取***会将程序运行后显示的机器组合码 比如161k8Z 发送给指定管理员,管理员经过编码生成***给回用户,用户输入,生成注册文件,进入软件。
  2. 注册文件中的***和DES+base64加密的***比较,若一致,则通过认证,进入软件。2.注册文件中的***和DES+base64加密的***比较,若一致,则通过认证,进入软件。

流程图

python读取电脑识别码

python代码函数功能简介

python读取电脑识别码

程序代码

#功能说明: 用户运行程序后自动检测认证状态:
#  1. 检测到有注册文件时,注册文件中的***和DES+base64加密的***比较,若一致,则通过认证,进入主程序。
#  2. 未检测到注册文件或者注册文件中的***与DES+base64加密的***不一致,则提醒用户输入***或重新获取***。
#     重新获取***会将程序运行后显示的机器码 161k8Z  发送给指定管理员,管理员经过编码生成***给回用户,同时生成注册文件。
import wmi
import json
#import win32com

import base64
#import pyDes
from pyDes import *
class register:
    def __init__(self):
        self.Des_Key = "DESCRYPT" # Key
        self.Des_IV = "\x15\1\x2a\3\1\x23\2\0" # 自定IV向量

        
############ 1. 获取硬件信息,输出 macode
#   1.CPU***(ID) 2.本地连接 无线局域网 以太网的MAC 3.硬盘***(唯一) 4.主板***(唯一)

    global s
    s = wmi.WMI()
#cpu ***
    def get_CPU_info(self):
        cpu = []
        cp = s.Win32_Processor()
        for u in cp:
            cpu.append(
                {
                    "Name": u.Name,
                    "Serial Number": u.ProcessorId,
                    "CoreNum": u.NumberOfCores
                }
            )
     #   print(":::CPU info:", json.dumps(cpu))
        return cpu
#硬盘***  
    def get_disk_info(self):
        disk = []
        for pd in s.Win32_DiskDrive():
            disk.append(
                { 
                    "Serial": s.Win32_PhysicalMedia()[0].SerialNumber.lstrip().rstrip(), # 获取硬盘***,调用另外一个win32 API
                    "ID": pd.deviceid,
                    "Caption": pd.Caption,
                    "size": str(int(float(pd.Size)/1024/1024/1024))+"G"
                }
            )
     #   print(":::Disk info:", json.dumps(disk))
        return disk
#mac 地址(包括虚拟机的)
    def get_network_info(self):
        network = []
        for nw in s.Win32_NetworkAdapterConfiguration ():  # IPEnabled=0
            if nw.MACAddress != None:
                network.append(
                    {
                        "MAC": nw.MACAddress,  # 无线局域网适配器 WLAN 物理地址
                        "ip": nw.IPAddress
                    }
                )
    #    print(":::Network info:", json.dumps(network))
        return network
#主板***
    def get_mainboard_info(self):
        mainboard=[]
        for board_id in s.Win32_BaseBoard ():
            mainboard.append(board_id.SerialNumber.strip().strip('.'))
        return mainboard    
    
    #  由于机器码太长,故选取机器码字符串部分字符   
#  E0:DB:55:B5:9C:16BFEBFBFF00040651W3P0VKEL6W8T1Z1.CN762063BN00A8
#  1 61 k 8Z   
#     machinecode_str = ""
#     machinecode_str = machinecode_str+a[0]['MAC']+b[0]['Serial Number']+c[0]['Serial']+d[0]
    def getCombinNumber(self):
        a=self.get_network_info()
        b=self.get_CPU_info()
        c=self.get_disk_info()
        d=self.get_mainboard_info()
        machinecode_str = ""
        machinecode_str = machinecode_str+a[0]['MAC']+b[0]['Serial Number']+c[0]['Serial']+d[0]
        selectindex=[15,30,32,38,43,46]
        macode=""
        for i in selectindex:
            macode=macode+machinecode_str[i]
     ###   print(macode)
        return macode


############ 2. 注册登录    
    
#DES+base64加密
    def Encrypted(self,tr):
        k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
        EncryptStr = k.encrypt(tr)
        #EncryptStr = binascii.unhexlify(k.encrypt(str))
      ###  print('***:',base64.b64encode(EncryptStr))
        return base64.b64encode(EncryptStr) #转base64编码返回
    
# #des+base64解码
#     def DesDecrypt(self,tr):
#         k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
#         DecryptStr = k.decrypt(tr)
#         return base64.b64decode(DecryptStr) #转base64解码返回
    
#获取***,验证成功后生成注册文件
    def regist(self):
        key = input('please input your register code: ')
        #由于输入类似“12”这种不符合base64规则的字符串会引起异常,所以需要增加输入判断
        if key:
            ontent = self.getCombinNumber() 
            tent=bytes(ontent, encoding='utf-8')
            content=self.Encrypted(tent)
###            print('content :',content)
###            print(type(content)) 
            key_decrypted=bytes(key, encoding='utf-8')
            if content!=0 and key_decrypted!=0:
                if content != key_decrypted:
                    print("wrong register code, please check and input your register code again:") 
                    self.regist()
                elif content==key_decrypted:
                    print("register succeed.") 
                    #读写文件要加判断
                    with open('register.txt','w') as f:
                        f.write(key)
                        f.close()
                    return True
                else:
                    return False
            else:
                return False
        else:
            self.regist()
            return False
# 打开程序先调用注册文件,比较注册文件中***与此时获取的硬件信息编码后是否一致
    def checkAuthored(self):
        ontent = self.getCombinNumber() 
        tent=bytes(ontent, encoding='utf-8')
        content=self.Encrypted(tent)
        #读写文件要加判断
        try:
            f=open('register.txt','r')
            if f:
                    key=f.read()
                    if key:
                        key_decrypted=bytes(key, encoding='utf-8')   # 注册文件中***
          ###              print('key_decrypted:',key_decrypted)
          ###              print('content:',content)
                        if key_decrypted:
                            if key_decrypted == content:
                                print("register succeed.") 
                          ##      checkAuthoredResult = 1  # 注册文件与机器码一致
                            else:
                        ##        checkAuthoredResult = -1 # 注册文件与机器码不一致
                                print('未找到注册文件,','请重新输入***,','或发送',ontent,'至17695797270','重新获取***')
                                self.regist()
                        else:
                     ##       checkAuthoredResult = -2     # 注册文件的***不能被解析
                            self.regist()
                            print('未找到注册文件,','请重新输入***,','或发送',ontent,'至17695797270','重新获取***')
                    else:
               ##         checkAuthoredResult = -3         # 注册文件中不能被读取
                        self.regist()
                        print('未找到注册文件,','请重新输入***,','或发送',ontent,'至17695797270','重新获取***')
            else:
                self.regist()                            
        except:
            print('请发送',ontent,'至17695797270','获取***')
          ##  checkAuthoredResult = 0                      # 未找到注册文件,请重新输入***登录
            self.regist()
    ##    print(checkAuthoredResult) 
     ##   return checkAuthoredResult
    

reg=register()
#    reg.regist()
reg.checkAuthored()

总结

  • 自己电脑的机器码获取方法自行百度,重要的是每次努力的结果,更重要的是你获取知识的过程,乐在其中。
  • 程序调通很不容易,可以将程序分部分调试出结果,要有耐心,当出现 *register succeed.*恭喜你。
  • 程序遇到什么问题,可以加我微信863110979,空闲必回。