C语言调用python,读取电脑识别码

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

关于 python读取电脑识别码 的程序请参考文章:
https://blog.csdn.net/weixin_44204327/article/details/85162826

目标

python实现c语言运行 用python语言,识别电脑机器码,通过授权码,只允许软件运行在唯一电脑上,实现“一机一码”。
然后通过C语言调用python程序,在C语言基础上完成软件授权码程序的编写。
:程序识别的机器码包括:

  1. CPU***(ID)
  2. 本地连接 无线局域网 以太网的MAC
  3. 硬盘***(唯一)
  4. 主板***(唯一)

C语言授权码程序运行分析

C语言调用python,读取电脑识别码C语言调用python,读取电脑识别码

程序代码

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***(ID2.本地连接 无线局域网 以太网的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 = "\x15\1\x2a\3\1\x23\2\0" # 自定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注意事项:

  1. 项目setting附加库include和链接库libs
  2. 程序中sys.path.append python脚本中引入的第三方库的路径
  3. python脚本放置在c文件同目录中和Debug目录下
    python注意事项:
  4. 想好程序布局。先想好程序要实现的功能,写出实现步骤,划分为一个个小功能用函数实现。
  • 运行C语言使用的是Visual Studio 2017,C语言部分调用python时的路径设置需要耐心,注意细节,小问题出错请百度。
  • 程序遇到什么问题,可以加我微信863110979,空闲必回。