【实践】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()函数