【实践】python 机器码 实现一机一码

原文链接:

python读取电脑识别码_三更雪的博客-CSDN博客_python获取机器码

机缘巧合下,看见了这篇文章。就copy下来,想运行一下。结果上班看了1,2天代码终于看懂了(我是新手),bug也解决好几天,就想着记录一下,顺便加点注释。总体代码在最后。

目录

一、注释

二、总体代码


一、注释

1、引入模块

import wmi
import json
import base64
from pyDes import *

 这里可能引入会报下面的错,我的原因是因为pywin32的版本不对,不在过多赘述,具体查看import win32api; ImportError: DLL load failed: 找不到指定的程序_TaiBai_435_的博客-CSDN博客

 ImportError: DLL load failed while importing win32api: 找不到指定的程序。

 2、定义函数:设置key和自定iv向量

    def __init__(self):
        self.Des_Key = "DESCRYPT"  # Key
        self.Des_IV = "\x15\13\x2a\3\1\x23\2\0"  # 自定IV向量

3、定义加密函数Encrypted():通过上面key和iv向量

    def Encrypted(self, tr):
        k = des(self.Des_Key, CBC, self.Des_IV, pad=None, padmode=PAD_PKCS5)
        EncryptStr = k.encrypt(tr)
        return base64.b64encode(EncryptStr)  # 返回base64编码的值

4、定义函数:获取cpu,硬盘,主板序列号和mac地址

# 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

5、定义拼接函数getCombinNumber():

    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, 31, 34, 39, 44, 48]
        macode = ""
        for i in selectindex: #根据字符串位数筛选部分字符
            macode = macode + machinecode_str[i]
        return macode

 首先先将上面的获取的字符串进行拼接 然后根据索引截取字符串进行拼接

74:4C:A1:9D:94:0A178BFBFF00A50F0000A0_7501_2D69_E09C.PF2ZDT23

               0               0   A   5    D   E

6、定义比较函数checkAuthored():

    # 打开程序先调用注册文件,比较注册文件中注册码与此时获取的硬件信息编码后是否一致
    def checkAuthored(self):
        ontent = self.getCombinNumber()  #获取上面拼接的字符串
        tent = bytes(ontent, encoding='utf-8') #对拼接的字符串ontent,按照指定的 utf-8编码 将字符串转换为字节序列tent
        content = self.Encrypted(tent) # 对tent使用Encrypted函数进行加密
        # 读写文件要加判断
        try:
            f = open('register.txt', 'r')
            if f: # 如果txt存在
                key = f.read()
                if key: # 如果读到txt里面的注册码
                    key_decrypted = bytes(key, encoding='utf-8')  # 将注册文件中注册码按照指定的 utf-8编码 将字符串转换为字节序列key_decrypted
                    if key_decrypted: # 如果key_decrypted 存在
                        if key_decrypted == content: # 如果key_decrypted 等于 content
                            print("register succeed.")
                        else: # 如果key_decrypted 不等于 content
                            print('未找到注册文件,', '请重新输入注册码,')
                            self.regist() # 执行函数regist()
                    else: # 如果key_decrypted 不能被解析
                        self.regist()
                        print('未找到注册文件,', '请重新输入注册码,')
                else: # 如果读不到txt里面的注册码
                    self.regist()
                    print('未找到注册文件,', '请重新输入注册码,')
            else: #如果txt不存在 运行regist
                self.regist()
        except: # 如果未找到注册文件
            print('请获取注册码')注册码登录
            self.regist()

7、定义注册函数regist():

    # 获取注册码,验证成功后生成注册文件
    def regist(self):
        key = input('please input your register code: ') #  输入注册码key
        if key: # 如果key存在
            ontent = self.getCombinNumber() # 获取getCombinNumber返回的macode,赋值给ontent
            tent = bytes(ontent, encoding='utf-8') # 对拼接的字符串ontent,按照指定的 utf-8编码 将字符串转换为字节序列tent
            content = self.Encrypted(tent) # 对tent使用Encrypted函数进行加密
            key_decrypted = bytes(key, encoding='utf-8') # 对注册码key,按照指定的 utf-8编码 将字符串转换为字节序列key_decrypted
            if content != 0 and key_decrypted != 0:
                if content != key_decrypted: # 如果 content 不等于 key_decrypted
                    print("wrong register code, please check and input your register code again:")
                    self.regist() # 重新运行regist()函数
                elif content == key_decrypted: # 如果 content 等于 key_decrypted
                    print("register succeed.")
                    # 读写文件要加判断
                    with open('register.txt', 'w') as f:
                        f.write(key) # 将注册码写入register.txt中
                        f.close()
                    return True
                else: 
                    return False
            else:
                return False
        else: # 如果key不存在
            self.regist()
            return False

 8、定义主函数main()

def second(): # 定义seceond的函数
    print("运行成功")
    print("输入任何键退出")


def main(): # 定义主函数
    reg = register()
    reg.checkAuthored() # 运行checkAuthored()函数
    second() # 运行second()函数

main() # 运行main()函数

9、当执行这个程序的时候,首先运行main()-checkAuthored(),如果没有注册码文件或者注册码错误,运行regist()函数,如果注册码正确,则运行second()函数

二、总体代码
 

import wmi
import json
import base64
from pyDes import *

class register:
    def __init__(self):
        self.Des_Key = "DESCRYPT"  # Key
        self.Des_IV = "\x15\13\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

    #  由于机器码太长,故选取机器码字符串部分字符

    #  74:4C:A1:9D:94:0A178BFBFF00A50F0000A0_7501_2D69_E09C.PF2ZDT23
    #                 0               0   A   5    D   E


    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, 31, 34, 39, 44, 48]
        macode = ""
        for i in selectindex: #根据字符串位数筛选部分字符
            macode = macode + machinecode_str[i]
        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)
        return base64.b64encode(EncryptStr)  # 返回base64编码的值

    # 获取注册码,验证成功后生成注册文件
    def regist(self):
        key = input('please input your register code: ') #  输入注册码key
        # 由于输入类似“12”这种不符合base64规则的字符串会引起异常,所以需要增加输入判断
        if key: # 如果key存在
            ontent = self.getCombinNumber() # 获取getCombinNumber返回的macode,赋值给ontent
            tent = bytes(ontent, encoding='utf-8') # 对拼接的字符串ontent,按照指定的 utf-8编码 将字符串转换为字节序列tent
            content = self.Encrypted(tent) # 对tent使用Encrypted函数进行加密
            # print('content :', content)
            # print(type(content))
            key_decrypted = bytes(key, encoding='utf-8') # 对注册码key,按照指定的 utf-8编码 将字符串转换为字节序列key_decrypted
            # print(key_decrypted)
            if content != 0 and key_decrypted != 0:
                if content != key_decrypted: # 如果 content 不等于 key_decrypted
                    print("wrong register code, please check and input your register code again:")
                    self.regist() # 重新运行regist()函数
                elif content == key_decrypted: # 如果 content 等于 key_decrypted
                    print("register succeed.")
                    # 读写文件要加判断
                    with open('register.txt', 'w') as f:
                        f.write(key) # 将注册码写入register.txt中
                        f.close()
                    return True
                else:
                    return False
            else:
                return False
        else: # 如果key不存在
            self.regist()
            return False

    # 打开程序先调用注册文件,比较注册文件中注册码与此时获取的硬件信息编码后是否一致
    def checkAuthored(self):
        ontent = self.getCombinNumber() # 获取getCombinNumber返回的macode,赋值给ontent
        tent = bytes(ontent, encoding='utf-8') # 对拼接的字符串ontent,按照指定的 utf-8编码 将字符串转换为字节序列tent
        content = self.Encrypted(tent) # 对tent使用Encrypted函数进行加密
        # 读写文件要加判断
        try:
            f = open('register.txt', 'r')
            if f: # 如果txt存在
                key = f.read()
                if key: # 如果读到txt里面的注册码
                    key_decrypted = bytes(key, encoding='utf-8')  # 将注册文件中注册码按照指定的 utf-8编码 将字符串转换为字节序列key_decrypted
                    # print('key_decrypted:',key_decrypted)
                    # print('content:',content)
                    if key_decrypted: # 如果key_decrypted 存在
                        if key_decrypted == content: # 如果key_decrypted 等于 content
                            print("register succeed.")
                            # checkAuthoredResult = 1  # 注册文件与机器码一致
                        else: # 如果key_decrypted 不等于 content
                            # checkAuthoredResult = -1 # 注册文件与机器码不一致
                            print('未找到注册文件,', '请重新输入注册码,')
                            self.regist() # 执行函数regist()
                    else: # 如果key_decrypted 不存在
                        # checkAuthoredResult = -2     # 注册文件的注册码不能被解析
                        self.regist()
                        print('未找到注册文件,', '请重新输入注册码,')
                else: # 如果没有读到txt里面的注册码
                    # checkAuthoredResult = -3         # 注册文件中不能被读取
                    self.regist()
                    print('未找到注册文件,', '请重新输入注册码,')
            else: #如果txt不存在 运行regist
                self.regist()
        except: # 如果发送了异常
            print('获取注册码')
            # checkAuthoredResult = 0                      # 未找到注册文件,请重新输入注册码登录
            self.regist()
    # print(checkAuthoredResult)
    # return checkAuthoredResult

def second(): # 定义注册码运行成功的函数
    print("运行成功")
    print("输入任何键退出")


def main(): # 定义主函数
    reg = register()
    reg.checkAuthored() # 运行checkAuthored()函数
    second() # 运行second()函数

main() # 运行main()函数