我是靠谱客的博主 听话蜜粉,最近开发中收集的这篇文章主要介绍C语言调用python,读取电脑识别码多努力就会有多特殊(neverforever)——仌,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
多努力就会有多特殊(neverforever)——仌
关于 python读取电脑识别码 的程序请参考文章:
https://blog.csdn.net/weixin_44204327/article/details/85162826
目标
python实现c语言运行 用python语言,识别电脑机器码,通过授权码,只允许软件运行在唯一电脑上,实现“一机一码”。
然后通过C语言调用python程序,在C语言基础上完成软件授权码程序的编写。
注:程序识别的机器码包括:
- CPU序列号(ID)
- 本地连接 无线局域网 以太网的MAC
- 硬盘序列号(唯一)
- 主板序列号(唯一)
C语言授权码程序运行分析
程序代码
C语言代码部分
#include<Python.h>
int main()
{
Py_Initialize();//初始化python
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('../\pythonbases\site-packages')");
PyRun_SimpleString("sys.path.append('../\pythonbases\site-packages\win32')");
PyRun_SimpleString("sys.path.append('../\pythonbases\site-packages\win32\lib')");
PyObject * pModule = NULL; //声明变量
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("author");
pFunc = PyObject_GetAttrString(pModule, "checkAuthored");
PyEval_CallObject(pFunc, NULL);
Py_Finalize(); //释放python
return 0;
}
python语言代码部分
import wmi
import json
import win32com
import base64
from pyDes import *
############ 1. 获取硬件信息,输出 macode
# 1.CPU序列号(ID) 2.本地连接 无线局域网 以太网的MAC 3.硬盘序列号(唯一) 4.主板序列号(唯一)
global s
s = wmi.WMI()
#cpu 序列号
def get_CPU_info():
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():
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():
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():
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():
a=get_network_info()
b=get_CPU_info()
c=get_disk_info()
d=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(tr):
Des_Key = "DESCRYPT" # Key
Des_IV = "x151x2a31x232 " # 自定IV向量
k = des(Des_Key, CBC, 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():
key = input('please input your register code: ')
#增加输入判断
if key:
ontent = getCombinNumber()
tent=bytes(ontent, encoding='utf-8')
content=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:")
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:
regist()
return False
# 打开程序先调用注册文件,比较注册文件中注册码与此时获取的硬件信息编码后是否一致
def checkAuthored():
ontent = getCombinNumber()
tent=bytes(ontent, encoding='utf-8')
content=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.")
else:
print('未找到注册文件,','请重新输入注册码,','或发送',ontent,'至17695797270','重新获取注册码')
regist()
else:
regist()
print('未找到注册文件,','请重新输入注册码,','或发送',ontent,'至17695797270','重新获取注册码')
else:
regist()
print('未找到注册文件,','请重新输入注册码,','或发送',ontent,'至17695797270','重新获取注册码')
else:
regist()
except:
print('请发送',ontent,'至17695797270','获取注册码')
regist()
checkAuthored()
# 运行结果:注册码:PABAeS/BYXs=
总结
C调用python注意事项:
- 项目setting附加库include和链接库libs
- 程序中sys.path.append python脚本中引入的第三方库的路径
- python脚本放置在c文件同目录中和Debug目录下
python注意事项: - 想好程序布局。先想好程序要实现的功能,写出实现步骤,划分为一个个小功能用函数实现。
- 运行C语言使用的是Visual Studio 2017,C语言部分调用python时的路径设置需要耐心,注意细节,小问题出错请百度。
最后
以上就是听话蜜粉为你收集整理的C语言调用python,读取电脑识别码多努力就会有多特殊(neverforever)——仌的全部内容,希望文章能够帮你解决C语言调用python,读取电脑识别码多努力就会有多特殊(neverforever)——仌所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复