现在我们采用VC编写生成密钥的代码,VC靠近底层,所有可以很方便的读取硬件的一些底层信息,然后C/C++可以直接进行位操作,因此可以编写出很高效的密钥运算代码,先给出完整代码然后一一解读。
#pragma once
#pragma comment(lib,"Setupapi.lib")
#pragma comment(lib,"shlwapi.lib")
#include "stdafx.h"
//#include <WinSock2.h>//如果要加上这个文件,那么必须放在windows.h的前面,并且放在很前面,因为它会包含windows.h
#include <Windows.h>
#include <Setupapi.h>
#include <winioctl.h>
#include <initguid.h>
#include <Iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>// 生成随机数
#include <tchar.h>
DEFINE_GUID(UsbClassGuid, 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
#define MAXSIZE 1024// usb设备信息最大长度
TCHAR ID[] = { TEXT("usb") };
TCHAR ErrorMsg[100];// 错误信息提示
//#define MAXLEN 104// 104/4=21表示最多允许21个盘符
#define FILESIZE 111110// 100KB
#define FAIL "1" //失败标志,传递给界面程序
VOID TransError()// 不判断函数成功与否,因为这个函数只起一个进程间通信的作用,失败影响不大
{
if (!OpenClipboard(NULL))
{
return;
}
TCHAR *data = TEXT(FAIL);
HGLOBAL hGClip = GlobalAlloc(GHND, 2);// 申请切剪内存堆,hGClip是句柄
TCHAR *ClipBuff = (TCHAR *)GlobalLock(hGClip);// ClipBuff 堆的地址
strcpy(ClipBuff, data);
GlobalUnlock(hGClip);
EmptyClipboard();// 清空剪切内存并得到控制权
HANDLE Clib = SetClipboardData(CF_TEXT, hGClip);
CloseClipboard();
}
BOOL CreateKey(TCHAR *msg)// 写入硬件信息,标志PC已经唯一加密,防止人利用本程序重新加密而破解保护
{
HKEY hCompanyKey = NULL;
DWORD dw;
LONG ret = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("USBLOCK"), 0, REG_NONE, REG_OPTION_NON_VOLATILE,
KEY_WRITE | KEY_READ, NULL,
&hCompanyKey, &dw);
if (ret != ERROR_SUCCESS)
{
//MessageBox(0, "错误1", "", 0);
TransError();// 传递出错信息
return FALSE;
}
RegSetValueExA(hCompanyKey, "LOCK", NULL, REG_SZ, (const BYTE *)msg, _tcslen(msg));
return TRUE;
}
BOOL SetSecret(TCHAR *Disk, int Key[], int KeyLen)// 创建Key文件
{
// 检测PC是否被加密过
HKEY hKey = NULL;
LONG ret = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("USBLOCK"), NULL, KEY_ALL_ACCESS, &hKey);
if (ret == ERROR_SUCCESS)
{
//MessageBox(0, "错误2", "", 0);
TransError();// 传递出错信息
return FALSE;// 判断PC是否已经加密
}
TCHAR uPath[20]; //tKey.sys,