📄 regpage.cpp
字号:
// RegPage.cpp : implementation file
//
#include "stdafx.h"
#include "minica.h"
#include "RegPage.h"
#include "MiniMainDlg.h"
#include "mapi.h"
#include "Evp.h"
#include ".\GenericClass\Language.h"
#include "minicT.h"
#include ".\Control\Smtp\Smtp.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRegPage property page
IMPLEMENT_DYNCREATE(CRegPage, CPropertyPage)
CRegPage::CRegPage() : CPropertyPage(CRegPage::IDD)
{
//{{AFX_DATA_INIT(CRegPage)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CRegPage::~CRegPage()
{
}
void CRegPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRegPage)
// DDX_Control(pDX, IDC_EDIT_USER, m_XpEditUser);
// DDX_Control(pDX, IDC_EDIT_REGCODE, m_XpEditReg);
DDX_Control(pDX, IDC_STATICTHANK, m_ThankStatic);
DDX_Control(pDX, IDC_BREG, m_Breg);
DDX_Control(pDX, IDC_BGET_REG, m_Bgetreg);
DDX_Control(pDX, IDC_BGET_CHECK, m_Bgetcheck);
DDX_Control(pDX, IDC_B_SELECT, m_Bselect);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRegPage, CPropertyPage)
//{{AFX_MSG_MAP(CRegPage)
ON_BN_CLICKED(IDC_BGET_CHECK, OnBgetCheck)
ON_BN_CLICKED(IDC_BGET_REG, OnBgetReg)
ON_BN_CLICKED(IDC_BREG, OnBreg)
ON_BN_CLICKED(IDC_B_SELECT, OnBSelect)
ON_BN_CLICKED(IDC_REG_RADIO1, OnRadio1)
ON_BN_CLICKED(IDC_REG_RADIO2, OnRadio2)
ON_BN_CLICKED(IDC_BPOST, OnBpost)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRegPage message handlers
BOOL CRegPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
if(!((CMiniCaApp *)AfxGetApp())->IsXpStyle())
{
ClassXP(GetDlgItem(IDC_REG_RADIO1)->m_hWnd,TRUE);
ClassXP(GetDlgItem(IDC_REG_RADIO2)->m_hWnd,TRUE);
}
CXPStyleButtonST::SetAllThemeHelper(this, ((CMiniCaApp *)AfxGetApp())->GetThemeHelperST());
m_Breg.SetIcon(IDI_ICON10);
m_Breg.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Bgetreg.SetIcon(IDI_ICON10);
m_Bgetreg.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Bgetcheck.SetIcon(IDI_ICON_SELECTDIR);
m_Bgetcheck.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Bselect.SetIcon(IDI_ICON_SELECTDIR);
m_Bselect.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
// m_ThankStatic.SetTextColor(RGB(128,87,28));
((CButton * )GetDlgItem(IDC_REG_RADIO1))->SetCheck(1); //是否注册
((CButton * )GetDlgItem(IDC_RADIO_E))->SetCheck(1); //企业版
if(((CMiniCaApp * )AfxGetApp())->IsHpxs())//后门
{
GetDlgItem(IDC_BGET_CHECK)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BGET_REG)->ShowWindow(SW_SHOW);
// GetDlgItem(IDC_STATIC11)->EnableWindow(1);
GetDlgItem(IDC_EDIT_REGCODE)->EnableWindow(1);
GetDlgItem(IDC_B_SELECT)->EnableWindow(1);
}
else
{
GetDlgItem(IDC_BGET_CHECK)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BGET_REG)->ShowWindow(SW_HIDE);
}
// TODO: Add extra initialization here
// CG: The following block was added by the ToolTips component. { // Create the ToolTip control. m_toolTip.Create(this); m_toolTip.AddTool(GetDlgItem(IDC_REG_RADIO1), "生成注册请求");
m_toolTip.AddTool(GetDlgItem(IDC_REG_RADIO2), "注册系统\r必须持有注册应答");
m_toolTip.AddTool(GetDlgItem(IDC_EDIT_REGCODE), "注册应答存储路径");
m_toolTip.AddTool(GetDlgItem(IDC_B_SELECT), "选择注册应答文件");
m_toolTip.AddTool(GetDlgItem(IDC_EDIT_USER), "要注册的用户名");
m_toolTip.AddTool(GetDlgItem(IDC_BREG), "生成注册请求");
m_toolTip.AddTool(GetDlgItem(IDC_EDIT_USER2), "用户邮箱\rMiniCA通过此邮箱向用户发送注册应答");
m_toolTip.AddTool(GetDlgItem(IDC_BPOST), "发送邮件进行注册\r用户邮箱必须真实\n 否则收不到答复");
// TODO: Use one of the following forms to add controls: // m_toolTip.AddTool(GetDlgItem(IDC_<name>), <string-table-id>); // m_toolTip.AddTool(GetDlgItem(IDC_<name>), "<text>"); }
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
CString CRegPage::GetMachineCode()//得到机器码
{
return ((CMiniCaApp *)AfxGetApp())->GetMachineCode();
}
CString CRegPage::GetSelfCode(CString filePath)//计算文件验证吗
{
//首先对文件摘要,然后用私钥签名
CString mdname("sha1");
char outMsg[100]="";
unsigned char md_value[MAX_MD_SIZE]="";
char buf[1024*2]="";
unsigned int md_len;
UCHAR bufsign[1024]={0};
UINT lensign=0;
if(!CEvp::Digest(mdname.GetBuffer(0),filePath.GetBuffer(0),0,//文件
md_value,&md_len, outMsg))//消息摘要
{
AddMsg(outMsg,M_ERROR);
return "Error";
}
/*私钥*/
HRSRC hRsrc = NULL;
DWORD lenKey = 0;
HGLOBAL hgKey = NULL;
LPSTR lpKey;
hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_VERIFY_KEY),"CERT");
if(hRsrc)
{
lenKey = SizeofResource(NULL, hRsrc);
hgKey=LoadResource(NULL,hRsrc);
if(hgKey)
lpKey=(LPSTR)LockResource(hgKey);
}
else
{
AddMsg("生成验证码错误",M_ERROR);
return "Error";
}
if(!CEvp::Sign(lpKey,lenKey,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//表示内存
(char *)bufsign,lensign,/*表示内存*/outMsg))
{
AddMsg(outMsg,M_ERROR);
return "Error";
}
for(UINT i=0;i<lensign;i++)
{
sprintf((char *)&buf[i*2],"%02X",bufsign[i]);//02x标示1个16进制变为2个字符,空补零
}
CString str(buf);
return str;
}
BOOL CRegPage::CheckRegCode(CString username,CString regcode,BOOL type)//检验注册码
{
//首先根据用户名sha1
CString mdname("sha1");
char outMsg[100]="";
unsigned char md_value[MAX_MD_SIZE]="";
char buf[1024*2]="";
unsigned int md_len;
UCHAR bufsign[1024]={0};
int lensign=0;
char lm[257]={0};//保存乱码
char temp[3]={0};//临时变量
username += GetMachineCode();
CString strADD = "父景存&&母桂珍&&雪松&&妻会平&&儿子健";//附加信息
// strADD.LoadString(IDS_STR_MINICA);
username += strADD;
if(!CEvp::Digest(mdname.GetBuffer(0),username.GetBuffer(0),username.GetLength(),
md_value,&md_len, outMsg))//消息摘要
{
// AddMsg(outMsg,M_ERROR);
return FALSE;
}
char * Cert = 0;
if(type)
{
Cert = MAKEINTRESOURCE(IDR_REGE_CERT);//企业
}
else
Cert = MAKEINTRESOURCE(IDR_REGI_CERT);//个人
HRSRC hRsrc=FindResource(NULL,Cert,"CERT");
DWORD lenCert = SizeofResource(NULL, hRsrc);
HGLOBAL hgCert=LoadResource(NULL,hRsrc);
LPSTR lpCert=(LPSTR)LockResource(hgCert);
//regcode 保存16进制数据 类似B5C3 D6F8->对应2个乱码汉字
//取出B5转换成10进制,存入乱码的一个位置
for(int j=0;j<regcode.GetLength();j+=2)
{
strncpy(temp,regcode.GetBuffer(0)+j,2);
lm[j/2] = CMiniCaApp::HexToTen(temp);
}
if(CEvp::VerifySign(lpCert,lenCert,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//内存区域
lm/*签名结果,注册表->转换*/,outMsg))
{
return TRUE;
}
else
return FALSE;
}
void CRegPage::OnBgetCheck() //得到验证码
{
// TODO: Add your control notification handler code here
CString file;
GetDlgItemText(IDC_EDIT_REGCODE,file);
file.TrimLeft();
file.TrimRight();
if(file.IsEmpty())
{
AddMsg("文件名不能为空",M_ERROR);
return;
}
//拷贝到注册表
CString code = GetSelfCode(file);
SetDlgItemText(IDC_EDIT_USER,code);
//put your text in source
if(OpenClipboard())
{
HGLOBAL clipbuffer;
char * buffer;
EmptyClipboard();
clipbuffer = GlobalAlloc(GMEM_DDESHARE, code.GetLength()+1);
buffer = (char*)GlobalLock(clipbuffer);
strcpy(buffer, LPCSTR(code.GetBuffer(0)));
GlobalUnlock(clipbuffer);
SetClipboardData(CF_TEXT,clipbuffer);
CloseClipboard();
}
}
CString CRegPage::GetRegCode(CString username,BOOL bRegE)//得到注册码
{
//首先根据用户名sha1
CString mdname("sha1");
char outMsg[100]="";
unsigned char md_value[MAX_MD_SIZE]="";
char buf[1024*2]="";
unsigned int md_len;
UCHAR bufsign[1024]={0};
UINT lensign=0;
CString strADD = "父景存&&母桂珍&&雪松&&妻会平&&儿子健";//附加信息
// strADD.LoadString(IDS_STR_MINICA);
username += strADD;
if(!CEvp::Digest(mdname.GetBuffer(0),username.GetBuffer(0),username.GetLength(),
md_value,&md_len, outMsg))//消息摘要
{
AddMsg(outMsg,M_ERROR);
return "";
}
char * Key = 0;
if(bRegE)
{
Key = MAKEINTRESOURCE(IDR_REGE_KEY);//企业
}
else
Key = MAKEINTRESOURCE(IDR_REGI_KEY);//个人
/*私钥*/
HRSRC hRsrc = FindResource(NULL,Key,"CERT");
DWORD lenKey = SizeofResource(NULL, hRsrc);
HGLOBAL hgKey = LoadResource(NULL,hRsrc);
LPSTR lpKey = (LPSTR)LockResource(hgKey);
if(!CEvp::Sign(lpKey,lenKey,NULL,mdname.GetBuffer(0),(char *)md_value,md_len,//表示内存
(char *)bufsign,lensign,/*表示内存*/outMsg))
{
AddMsg(outMsg,M_ERROR);
return "";
}
for(UINT i=0;i<lensign;i++)
{
sprintf((char *)&buf[i*2],"%02X",bufsign[i]);//02x标示1个16进制变为2个字符,空补零
}
CString str512(buf);
return str512;
}
void CRegPage::OnBgetReg() //生成mres文件
{
// TODO: Add your control notification handler code here
CString mci;
GetDlgItemText(IDC_EDIT_REGCODE,mci);
if(mci.IsEmpty())
{
AddMsg("请选择*.mreq文件",M_ERROR);
return;
}
CFile MciFile;
MciFile.Open(mci,CFile::typeBinary|CFile::modeRead);
DWORD len = MciFile.GetLength();
char * info = new char[len+1];
memset(info,0,len+1);
MciFile.Read(info,len);
MciFile.Close();
//16 -> LM
char strLm[2048] = {0};
char outMsg[100];
UINT uLm = CMiniCaApp::HTextToLm(info,strLm);
delete [] info;
/*私钥*/
HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_REGI_KEY),"CERT");
DWORD dlenKey = SizeofResource(NULL, hRsrc);
HGLOBAL hgKey=LoadResource(NULL,hRsrc);
LPSTR Key=(LPSTR)LockResource(hgKey);
RegReq regReq;
//私钥解密注册请求
len = sizeof(RegReq);
if(CEvp::RSAPrivDec((BYTE *)Key,dlenKey,"",(BYTE *)strLm,uLm,
(BYTE *)®Req,len ,outMsg))
{
//通过用户名和机器码生成序列号
//把类别,用户名,机器码,注册码,通过私钥加密写入MCR文件中
//用户方面 通过公钥解密 ,验证 机器吗,写入注册表
RegRes regRes;
regRes.UserInfo = regReq;
CString sName,
sMac,
sVer,
sTemp;
sName.Format("%s",regReq.UserName);
sTemp.Format("UserName: %s",sName);
AddMsg(sTemp,M_WARING);
sMac.Format("%s",regReq.Mac);
sTemp.Format("HardCode: %s",sMac);
AddMsg(sTemp,M_WARING);
sVer = sName + sMac;
strcpy(regRes.RegCode,GetRegCode(sVer,regReq.RegType));
//私钥加密
char McR[20480] = {0};
len = 20480;
if(!CEvp::RSAPrivEnc((BYTE *)Key,dlenKey,"",
(BYTE *)®Res,sizeof(regRes),(BYTE *)McR,len,outMsg))
{
AddMsg(outMsg,M_ERROR);
}
else
{
CString strReg = CMiniCaApp::LmToHText((UCHAR *)McR,len);
CFile McrFile;
CString strFielName = sName + ".mres";
strFielName = "\\" + strFielName;
CString strRes = ((CMiniCaApp *)AfxGetApp())->GetAppPath() + strFielName;
McrFile.Open(strRes,CFile::modeCreate|CFile::typeBinary|CFile::modeWrite);
McrFile.Write(strReg.GetBuffer(0),strReg.GetLength());
McrFile.Close();
strRes += MiniCT_1900;//" 生成成功"
AddMsg(strRes);
}
}
else
{
AddMsg(MiniCT_1901, M_ERROR); //应答文件生成错误
}
// SetDlgItemText(IDC_EDIT_REGCODE,);
}
void CRegPage::OnBreg() //注册
{
// TODO: Add your control notification handler code here
CString username,regcode,resfile;
int iStateM = ((CButton * )GetDlgItem(IDC_REG_RADIO1))->GetCheck(); //是否生成请求
int iStateR = ((CButton * )GetDlgItem(IDC_REG_RADIO2))->GetCheck(); //是否注册
/*公钥*/
HRSRC hRsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_REGI_CERT),"CERT");
DWORD dlenKey = SizeofResource(NULL, hRsrc);
HGLOBAL hgKey=LoadResource(NULL,hRsrc);
LPSTR Key=(LPSTR)LockResource(hgKey);
BOOL bE = TRUE;//指定为企业版本FALSE;//是否为企业版用户
if(iStateM)//生成注册文件
{
GetDlgItemText(IDC_EDIT_USER,username);
if(username.IsEmpty())
{
AddMsg(MiniCT_1902, M_ERROR); //请输入用户名
return;
}
int iStateE = ((CButton * )GetDlgItem(IDC_RADIO_E))->GetCheck();
int iStateI = ((CButton * )GetDlgItem(IDC_RADIO_I))->GetCheck();
/* if(iStateE == 0 && iStateI == 0)
{
AddMsg("请选择一种注册方式",M_ERROR);
return;
}
CString sInfo;
if(iStateE == 1)
{
sInfo.Format("您确信要注册为企业版用户吗?");
bE = TRUE;
}
else if(iStateI == 1)
{
sInfo.Format("您确信要注册为个人版用户吗?");
bE = FALSE;
}
*/
if(MessageBox(MiniCT_1903, //您确信要注册吗?
MiniCT_1904,MB_ICONQUESTION | MB_YESNO) == IDYES ) //注册提示
{
//生成注册文件
RegReq regReq;
regReq.RegType = bE;
strncpy(regReq.UserName,username,18);
CString strHard = GetMachineCode();
strncpy(regReq.Mac, strHard, 42);
// strHard = "机器码:" + strHard;
// AddMsg(strHard);
//加载公要(个人版)
char outMsg[100] = {0};
char McR[2048] ={0};
DWORD len = 2048;
if(!CEvp::RSAPubEnc((BYTE *)Key,dlenKey,"",
(BYTE *)®Req,sizeof(regReq),(BYTE *)McR,len,outMsg))
{
AddMsg(outMsg,M_ERROR);
}
else
{
CString strReg = CMiniCaApp::LmToHText((UCHAR *)McR,len);
CFile MciFile; //注册请求 *.mci
CString strReq;
strReq.Format("%s\\%s.mreq", ((CMiniCaApp *)AfxGetApp())->GetAppPath(), username);
if(MciFile.Open(strReq,CFile::modeCreate|CFile::typeBinary|CFile::modeWrite))
{
MciFile.Write(strReg.GetBuffer(0),strReg.GetLength());
MciFile.Close();
}
else
AddMsg("保存文件失败");
//保存注册文件,在邮寄时候检测是否有此文件
m_ReqFile = strReq;
strReq += MiniCT_1900;
AddMsg(strReq);
//发送
// SendMail();
}
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -