引言

获取设备信息

功能:将该代码生成的exe发送给使用的用户(也可以是做成带有界面的小程序,目前只是功能阶段)
用户运行后,在当前文件夹下,生成sysInfo_licence.lic文件
用户需要发送这个sysInfo_licence.lic给我们
代码实现:
(1)主函数

//设为1,执行读取硬件的程序,目的;生成exe,发送给用户,用户运行后,在当前文件夹下,生成sysInfo_licence.lic文件。用户需要发送给我们
#ifdef 1
/*
功能说明:执行读取硬件的程序,目的,生成exe,发送给用户,
用户运行后,在当前文件夹下,生成sysInfo_licence.lic文件。
用户需要发送给我们
*/
#define _CRT_SECURE_NO_WARNINGS
#include "GetSYSInfo.h"
//#include "CreateKeyLicence.h"
//#include "Run.h"
//#include "AddDll.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <windows.h>
#include  <fstream>
#include <ctime>
#include <cstdio>using namespace std;void  main()
{int GetHardwareInfo_flag =  GetSystemHardwareInfo();//读取硬件信息并写进licence中switch (GetHardwareInfo_flag) {case 0:cout << "系统信息获取成功!"<< endl;break;case 1:cout << "Mac获取失败..." << endl;       break;case 2:cout << "cpu获取失败..." << endl;       break;case 3:cout << "mac长度获取失败... " << endl;        break;case 4:cout << "CPU长度获取失败... " << endl;        break;case 5:cout << "time长度获取失败... " << endl;       break;case 6:cout << "文件创建失败... " << endl;       break;default:break;}
}
#endif

(2)#include "GetSYSInfo.h"

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <windows.h>
#include  <fstream>
#include <ctime>
#include <cstdio>#include "CpuID.h"using namespace std;
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif//--------------------------------------------------------------
//                      网卡MAC地址
//--------------------------------------------------------------
BOOL GetMacByCmd(char *lpszMac, int len/*=128*/)
{const long MAX_COMMAND_SIZE = 10000; //命令行输出缓冲大小    TCHAR szFetCmd[] = "ipconfig /all"; //获取MAC命令行  const string strEnSearch = "Physical Address. . . . . . . . . : "; //网卡MAC地址的前导信息const string strChSearch = "物理地址. . . . . . . . . . . . . : ";BOOL   bret = FALSE;HANDLE hReadPipe = NULL; //读取管道HANDLE hWritePipe = NULL; //写入管道    PROCESS_INFORMATION pi;   //进程信息    STARTUPINFO         si;   //控制命令行窗口信息SECURITY_ATTRIBUTES sa;   //安全属性char            szBuffer[MAX_COMMAND_SIZE + 1] = { 0 }; //放置命令行结果的输出缓冲区string          strBuffer;unsigned long   count = 0;long            ipos = 0;pi.hProcess = NULL;pi.hThread = NULL;si.cb = sizeof(STARTUPINFO);sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;//1.0 创建管道bret = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);if (!bret){goto END;}//2.0 设置命令行窗口的信息为指定的读写管道GetStartupInfo(&si);si.hStdError = hWritePipe;si.hStdOutput = hWritePipe;si.wShowWindow = SW_HIDE; //隐藏命令行窗口si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;//3.0 创建获取命令行的进程bret = CreateProcess(NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);if (!bret){goto END;}//4.0 读取返回的数据WaitForSingleObject(pi.hProcess, 2000/*INFINITE*/);bret = ReadFile(hReadPipe, szBuffer, MAX_COMMAND_SIZE, &count, 0);if (!bret){goto END;}//5.0 查找MAC地址,默认查找第一个,一般为以太网的MACstrBuffer = szBuffer;ipos = strBuffer.find(strEnSearch);if (ipos < 0)//区分中英文的系统{ipos = strBuffer.find(strChSearch);if (ipos < 1){goto END;}//提取MAC地址串strBuffer = strBuffer.substr(ipos + strChSearch.length());}else{//提取MAC地址串strBuffer = strBuffer.substr(ipos + strEnSearch.length());}ipos = strBuffer.find("\n");strBuffer = strBuffer.substr(0, ipos);memset(szBuffer, 0x00, sizeof(szBuffer));strcpy_s(szBuffer, strBuffer.c_str());//去掉中间的“00-50-EB-0F-27-82”中间的'-'得到0050EB0F2782int j = 0;for (int i = 0; i<strlen(szBuffer); i++){if (szBuffer[i] != '-'&&szBuffer[i] != ' ' && szBuffer[i] != '\n' && szBuffer[i] != '\r'){lpszMac[j] = szBuffer[i];j++;}}bret = TRUE;END://关闭所有的句柄CloseHandle(hWritePipe);CloseHandle(hReadPipe);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return(bret);
}static string  getCurrentTimeStr()
{time_t t = time(NULL);char ch[64] = { 0 };strftime(ch, sizeof(ch) - 1, "%Y$%m$%d", localtime(&t));     //年-月-日 时-分-秒return ch;
}int GetSystemHardwareInfo( )
{char lpszMac[128] = "";if (!GetMacByCmd(lpszMac, 128)){return 1;//Mac获取失败,返回1}string macs = lpszMac;char lpszCpu[128] = "";if (!GetCpuByCmd(lpszCpu, 128)){return 2;//cpu获取失败,返回1}string CpuId = lpszCpu;string TimeStr = getCurrentTimeStr();//获取系统当前时间的字符串:年$月$日格式int MacIDSize = macs.size();if (MacIDSize == 0){return 3;//mac长度有误失败,返回3}int CPUIDSize = CpuId.size();if (CPUIDSize == 0){return 4;//CPU长度有误失败,返回4}int timeSize = TimeStr.size();if (timeSize == 0){return 5;//time长度有误失败,返回5}ofstream OutFile("sysInfo_licence.lic");if (OutFile){OutFile << "SystemHardwareInfo:" << "\n" << MacIDSize << "\n" << CPUIDSize << "\n" << timeSize << "\n" << macs << "\n" << CpuId << "\n" << TimeStr;OutFile.close();                    //关闭文件return 0;//成功,返回0}else{return 6;//文件创建失败,或者打不开(创建时,默认是会判断是否存在,如果不存在,自动创建的)}
}

(3)#include "CpuID.h"

#if !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_)
#define AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#include <iostream>
#include <string>
#include <windows.h>
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
using namespace std;
//--------------------------------------------------------------
//                      CPU序列号
//--------------------------------------------------------------
BOOL GetCpuByCmd(char *lpszCpu, int len = 128);
#endif // !defined(AFX_14BEC153_17B9_47BE_845F_71A27BF26B59__INCLUDED_)

解析设备信息

(1)主函数

#ifdef 1//设为1,执行解析硬件的licence。目的:生成exe,用户运行后,读取当前文件夹下sysInfo_licence.lic,生成加密过的licence文件。连同试用版程序一起发送给用户
/*
功能说明:执行解析硬件的licence,该文件来源于用户处的生成结果
目的:生成exe,用户运行后,读取当前文件夹下sysInfo_licence.lic,
解析出用户电脑信息(不显示出来);生成加密过的licence文件。
连同试用版程序一起发送给用户
*/
#define _CRT_SECURE_NO_WARNINGS
#include "CreateKeyLicence.h"
//#include "Run.h"
//#include "AddDll.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <windows.h>
#include  <fstream>
#include <ctime>
#include <cstdio>using namespace std;void  main()
{ReCreateKeyLicenceToCustomer("dongkangle", 120);//分别为密钥和使用时间(天)
}#endif // 1

(2)#include "CreateKeyLicence.h"

#pragma once
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <windows.h>
#include  <fstream>
#include <ctime>
#include <cstdio>#include "Encode.h"using namespace std;
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endifvoid base64EncodeString(const char *textToEncode, char *buffer)
{base64_encodestate state;base64_init_encodestate(&state);int numberOfBytesEncoded = base64_encode_block(textToEncode, strlen(textToEncode), buffer, &state);numberOfBytesEncoded += base64_encode_blockend(buffer + numberOfBytesEncoded, &state);buffer[numberOfBytesEncoded] = '\0';
}int ReCreateKeyLicenceToCustomer(string strKey, int usingTime)//读取去掉所以换行符的硬件信息licence
{//读取用户发回的硬件信息licencechar readBuffer0[128] = "";char readBuffer1[128] = "";char readBuffer2[128] = "";char readBuffer3[128] = "";char readBuffer4[128] = "";char readBuffer5[128] = "";char readBuffer6[128] = "";char readBuffer7[128] = "";char readBuffer8[128] = "";char readBuffer9[128] = "";const char *inputFilename = "sysInfo_licence.lic";FILE *inputFile = fopen(inputFilename, "rb");if (inputFile){while (!feof(inputFile)){fgets(readBuffer0, 128, inputFile);         //读第1行KeyLicenceFile:fgets(readBuffer1, 128, inputFile);         //读第2行   fgets(readBuffer2, 128, inputFile);         //读第3行   mac的字符个数 (方便解析使用)fgets(readBuffer3, 128, inputFile);         //读第4行  cpuid的字符个数 (方便解析使用)fgets(readBuffer4, 128, inputFile);         //读第5行   time的字符个数 (方便解析使用)fgets(readBuffer5, 128, inputFile);         //读第6行   key的字符个数 (方便解析使用)、fgets(readBuffer6, 128, inputFile);         //读第7行//   空格(标志行)。}fclose(inputFile);}elseprintf("Cannot open file: %s\n", inputFilename);//进行加密工作char KeyreadBuffer1[128] = "";char KeyreadBuffer2[128] = "";char KeyreadBuffer3[128] = "";char KeyreadBuffer4[128] = "";char KeyreadBuffer5[128] = "";char KeyreadkeySize[128] = "";char KeyreadBuffer6[128] = "";char KeyreadBuffer7[128] = "";char KeyreadBuffer8[128] = "";char KeyreadBuffer9[128] = "";char KeyreadBuffer10[128] = "";char UseingTimeStr[128] = "";int keySizeNumb = strKey.size();string keySize = to_string(keySizeNumb);string UseingTime = to_string(usingTime);//使用时间的int转stringbase64EncodeString(readBuffer1, KeyreadBuffer1);//对mac的字符个数 加密base64EncodeString(readBuffer2, KeyreadBuffer2);//对mac的字符个数 加密base64EncodeString(readBuffer3, KeyreadBuffer3);//对cpu的字符个数 加密base64EncodeString(keySize.data(), KeyreadkeySize);//对key的字符个数 加密base64EncodeString(UseingTime.data(), UseingTimeStr);//对key的字符个数 加密base64EncodeString(readBuffer4, KeyreadBuffer4);//对time的字符个数 加密base64EncodeString(readBuffer5, KeyreadBuffer5);//对time的字符个数 加密base64EncodeString(readBuffer6, KeyreadBuffer6);//对mac 加密base64EncodeString((strKey).data(), KeyreadBuffer9); //对key 加密//返回新的keylicence.licofstream OutFile("key_licence_Key_out_V1.0.lic"/*,fstream::out*/); //利用构造函数创建txt文本,并且打开该文本if (OutFile){OutFile << "Key_V1.0:" << "\n" << KeyreadBuffer1 << KeyreadBuffer2 << KeyreadBuffer3 << KeyreadkeySize << UseingTimeStr << KeyreadBuffer4 << KeyreadBuffer5 << KeyreadBuffer6 << KeyreadBuffer9;OutFile.close();                    //关闭文件return 0;//成功,返回0}else{return 6;//文件创建失败,或者打不开(创建时,默认是会判断是否存在,如果不存在,自动创建的)}return 0;
}

(3)#include "Encode.h"

/*
cencode.h - c header for a base64 encoding algorithmThis is part of the libb64 project, and has been placed in the public domain.
For details, see http://sourceforge.net/projects/libb64
*/#ifndef BASE64_CENCODE_H
#define BASE64_CENCODE_Htypedef enum
{step_A, step_B, step_C
} base64_encodestep;typedef struct
{base64_encodestep step;char result;int stepcount;
} base64_encodestate;void base64_init_encodestate(base64_encodestate* state_in);char base64_encode_value(char value_in);int base64_encode_block(const char* plaintext_in, int length_in, char* code_out, base64_encodestate* state_in);int base64_encode_blockend(char* code_out, base64_encodestate* state_in);#endif /* BASE64_CENCODE_H */

代码附加验证机制

(1)主函数测试

#ifdef 1 //设为1;解析
/*
功能说明:在自己的软件系统中,加入以下代码,
此时,软件就在用户电脑上运行,因此,软件是可以读取该电脑信息,比对该信息和解析出来的是否一致,
如果一致,说明就是用户指定的电脑没
如果不一致,用户无法使用该软件
*/
#define _CRT_SECURE_NO_WARNINGS
//#include "GetSYSInfo.h"
//#include "CreateKeyLicence.h"
//#include "Run.h"
#include "AddDll.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <windows.h>
#include  <fstream>
#include <ctime>
#include <cstdio>using namespace std;void  main()
{/*licence文件读取失败,  返回1Mac获取失败,            返回2cpu获取失败,            返回3mac长度有误失败,      返回4CPU长度有误失败,      返回5time长度有误失败,     返回6mac比对失败 ,           返回7cpu比对失败 ,           返回8licence时间格式错误;   返回9,系统时间格式错误;       返回10,剩余时间充裕,         返回11,剩余时间不足; 剩余天数,返回负数:*/int isOk = DecodeKeyLicenceInMyCode();switch (isOk) {case 1:cout << "licence文件读取失败    " << endl;    break;case 2:cout << "Mac获取失败     " << endl;     break;case 3:cout << "cpu获取失败     " << endl;     break;case 4:cout << "mac长度有误失败     " << endl;       break;case 5:cout << "CPU长度有误失败    " << endl;        break;case 6:cout << "time长度有误失败       " << endl;        break;case 7:cout << "mac比对失败          " << endl;        break;case 8:cout << "cpu比对失败           " << endl;       break;case 9:cout << "licence时间格式错误    " << endl;        break;case 10:cout << "系统时间格式错误      " << endl;       break;case 11:cout << "剩余时间充裕        " << endl;       break;default:int RemainingTime = isOk; cout << RemainingTime << endl;break;}system("pause");}
#endif // 1

(2)#include "AddDll.h"

_declspec(dllimport) int DecodeKeyLicenceInMyCode();

总结

项目的源码:
链接:https://pan.baidu.com/s/1SsD0H7TR_chbUkkov4Sd8A
提取码:xv7b
复制这段内容后打开百度网盘手机App,操作更方便哦
使用代码如下:
链接:https://pan.baidu.com/s/1crly94aRtcBQKFjyQsFjEg
提取码:krl4
复制这段内容后打开百度网盘手机App,操作更方便哦


http://www.taodudu.cc/news/show-1639480.html

相关文章:

  • (1)鼠标单独移动两个actor
  • (6)通过输入参数(测量数据)构建三维体模型
  • (4)建立一个标准尺寸的平面,并对其进行着色贴图、拉伸一定的厚度
  • (5)通过输入参数(测量数据)构建二维体模型(01)
  • (3)通过输入参数(测量数据)构建三维体模型(02)
  • (8)VTK 鼠标左右键控制模型旋转
  • (2)通过输入参数(测量数据)构建三维体模型(01)
  • (01)VTK读取OBJ格式模型
  • (02)vtk 绘制模型的外轮廓线 模型轮廓线
  • (03)两个模型的交集、并集、差集
  • (04)VTK移动模型,判断是否相交
  • (05)vtk通过多边形构建矩形,并拉伸成立方体,两个立方体独立操作
  • (06)vtk修改默认鼠标操作,实现鼠标按键控制模型旋转
  • who i am !
  • (01)OpenGL es中只在指定区域渲染view
  • (01)C++之设计模式演变
  • C++设计模式(全网最通俗易懂的设计模式进阶)
  • c++工程模式+配置文件+动态调用类
  • 读书感悟之,从术到道
  • 因果否?
  • (01)数据库及相关
  • avg最多用多少列 mysql_40斤一桶水,最多用多少克磷酸二氢钾?打几次增产效果最好...
  • 用单片机测量流体流速的_旋进旋涡流量计的测量原理及优点
  • 文字加减前后缀lisp_日本搞笑艺人催泪讲授汉字课堂告诉你文字背后的意义!...
  • 幼儿园调查过程怎么写_幼儿园对孩子的重要性你真的清楚吗?
  • 三星oneui主屏幕费电_这或许是单手握持手感最佳的手机 三星Galaxy S20上手体验...
  • 麦克纳姆轮运动原理怎么安装_家用中央空调水系统原理是什么?怎么样安装比较好呢?...
  • redis 判断存在性_一口气说出四种幂等性解决方案,面试官露出了姨母笑~
  • python心跳包原理_Python 用心跳(UDP包)探测不活动主机
  • pin码计算器网页版_快对作业APP下载手机版电脑版官方正式上线

C++ Licence认证用于项目开发和设备认证相关推荐

  1. NB-IoT窄带物联网技术项目开发教程--设备端开发(三)

    设备端硬件架构: MCU  ---------串口------------NB模组 MCU根据需要选择,这里以STM32L系列为例 NB模组这里以上海移远,BC95/35为例 mcu通过串口与NB模组 ...

  2. 基于Next.js搭建基本可用于项目开发的过程

    简单介绍 要从头开始使用 React 构建一个完整的 Web 应用程序,需要考虑许多重要的细节: 必须使用打包程序(例如 webpack)打包代码,并使用 Babel 等编译器进行代码转换. 你需要针 ...

  3. 基于J2EE架构的项目开发团队中的角色与职责

    [声明] 1.2内容来源:<J2EE Architects Handbook>中文翻译<J2EE系统架构师参考手册>[翻译 Mellon] 1.角色 Technical arc ...

  4. micropython会商用吗_NSF商用食品设备认证解析

    想要在美国或加拿大销售您的食品设备相关产品吗?那您的产品需要符合美国或加拿大的食品法典规定,NSF International可以为所需要的测试及认证提供一系列服务. 可能您会有诸多疑问,比如: NS ...

  5. OpenHarmony分布式软总线与设备认证模块总结

    1 总结 此次OpenHarmony1.x源码分析涉及了分布式软总线(Lite版本).设备认证(Lite版本)两个较大模块. 分布式软总线模块的主要作用是为设备间提供通信能力,由于现有的通信方式差异很 ...

  6. PKI和设备认证的谬误

    根据Verizon发布的<2021年数据泄露调查报告>,弱用户身份验证和人机界面错误约占去年所有数据漏洞的85%.这些统计数据中,备受瞩目的数据泄露和在线欺诈成为新闻头条,进一步证实了该报 ...

  7. 【视频】认证测试第1期:鸿蒙智联设备认证整体介绍

    认证测试第1期:鸿蒙智联设备认证整体介绍 本课程主要介绍鸿蒙智联设备认证的范围和认证标准,包括HarmonyOS Connect 介绍.鸿蒙智联生态产品需要具备的体验特征.HarmonyOS Conn ...

  8. 华为认证hcia多少钱_华为认证hcia费用一览表

    ●△● 什么是华为ICT认证?HCIA.HCIP和HCIE的区别是什么?华为的认证级别是什么?其认证级别分别为工程师级别(HCIA).高级工程师级别(HCIP)和专家级别(HCIE)三个认证等级.四. ...

  9. 《用于物联网的Arduino项目开发:实用案例解析》—— 3.4 小结

    本节书摘来自华章出版社<用于物联网的Arduino项目开发:实用案例解析>一 书中的第3章,第3.4节,作者[美]安德尔·杰韦德(Adeel Javed),更多章节内容可以访问云栖社区&q ...

最新文章

  1. amd黑苹果万能显卡驱动_黑苹果系统安装之声卡驱动
  2. idea快速写出for循环
  3. BZOJ 2282 树的直径
  4. 巧用云计算 突围移动APP行业乱象
  5. Python学习13 异常处理机制
  6. java的web项目资源访问规则
  7. 飞鸽推广的由咪商务微博
  8. linux卸载交叉工具,linux-如何从crosstool-ng工具链名称中删除供应...
  9. Elasticsearch学习系列-ElasticSearch 核心概念
  10. 对老年人友好!滴滴开通打车400热线
  11. FFmpeg之视频/图片镜像旋转(十三)
  12. 微服务设计笔记——几种远程过程调用方法
  13. 谷歌浏览器安装Octotree插件
  14. linux桌面图标主题包,推荐 4 款漂亮的 Linux 图标主题
  15. 那些年我们一起犯二的青春--IGRSS--2015--1th
  16. ICommand和ITool命令操作地图
  17. 关于异业联盟和O2O商业模式的一些想法
  18. Gopher China 2019 讲师专访 -探探平台技术部软件工程师于乐
  19. 2021年烟花爆竹经营单位主要负责人最新解析及烟花爆竹经营单位主要负责人考试资料
  20. 成都跨境电商浅析印度跨境出口电商的机会和风险!

热门文章

  1. [高光谱] Hyperspectral-Classification Pytorch 数据集的读取、划分、加载
  2. (四)pscc学习笔记
  3. 电阻电导传输线的归一化转移矩阵[a](必背)
  4. 过程定义伪指令proc和宏命令伪指令macro
  5. AD16查看不同层并修改走线(一般也就两层
  6. [SQL]LeetCode180. 连续出现的数字 | Consecutive Numbers
  7. Android出现:java.lang.NoClassDefFoundError: android/os/PersistableBundle
  8. 2018大华软件大赛模拟赛第4题 (某股票操盘手账户里有N支股票,股价互不等)
  9. spring mvc 伪静态处理
  10. Codeforces Round #295 (Div. 1) C. Pluses everywhere