前段时间简单分析了一下中星睿典,后简称为zxrd,通过修改pcIsReg属性的方式来达到注册的目的,但是在使用中,由于不同的省份会出现一些问题。最开始的想法是能不能通过山寨服务器的方法来实现,但是没有成功注册的返回结果,不太好猜测。经过一段时间的分析,大致已经收集到部分返回结果的结构了,同时也为了解决单一的修改pcIsReg属性的缺点,才有了这篇笔记。这其中仍有一些疑惑的地方,大家一起来交流,同时这笔记主要是用来交流技术的。
大家在能力范围内还是要支持正版授权。
zxrd为64位程序,使用到的工具:
Dnspy 64位: Dnspy下载地址
zxrd计算工具 https://lmze2000.lanzoux.com/iHyrnp5cslg
计算验证工具.png (67.84 KB, 下载次数: 2)
下载附件
计算验证工具
2021-5-15 15:05 上传
一、注册方式与流程
1.1 在线注册、离线注册
ZXrd注册方式共分为两种,一种是线上注册,另一种是离线注册。
1.2 Zxrd注册流程及关键点
Zxrd注册流程及关键点.png (117.65 KB, 下载次数: 1)
下载附件
2021-5-15 10:24 上传
1.3 关键函数查找
注册错误提示.png (98.41 KB, 下载次数: 1)
下载附件
注册错误 提示
2021-5-15 11:50 上传
客户号有误.png (128.09 KB, 下载次数: 1)
下载附件
2021-5-15 11:36 上传
1.4 在线注册代码
private void btnReg_Click(object sender, EventArgs e)
{
if (!this.checkAgreement.Checked)
{
MessageBox.Show("请先阅读并同意许可协议!");
return;
}
string text = StringOper.GetSimpleString(this.txtRegKhh.Text);
string text2 = StringOper.GetSimpleString(this.txtRegSqm.Text);
text = StringOper.FullToHalf(text);
text2 = StringOper.FullToHalf(text2);
int zcmtype = new SysRegInfo().GetZCMType(text, text2);
if (zcmtype == 0)
{
MessageBox.Show("客户号或授权码有错误,请仔细认真检查后重新输入!");
return;
}
if (zcmtype != 2)
{
if (zcmtype == 1)
{
if (CommonData.curPC.pcIsReg == 0 && MessageBox.Show("在本机注册后,就不能在其它电脑注册了。\r\n也不能更换主机内硬件。\r\n有何疑问可以先阅读许可协议。\r\n\r\n确认要在本机注册码? ", "请谨慎注册", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
{
return;
}
CommonData.curPC.pcNumZcm = new SysRegInfo().GetNumZcmByKhh(text2, text);
this.RegOnline();
}
return;
}
SysRegInfo sysRegInfo = new SysRegInfo();
if (!sysRegInfo.isRightLetter(text) && !sysRegInfo.isRightLetter(text2))
{
MessageBox.Show("非法授权码!");
return;
}
new SysRegInfo().WriteRegCC(text, text2);
MessageBox.Show("已写入注册信息,请重新打开本考试软件!");
Environment.Exit(0);
}
二、客户号与授权码验证
2.1 客户号与授权码
GetZCMType返回1,表示客户号和授权码是符合验证要求的。
构造客户号与授权码.png (140.29 KB, 下载次数: 1)
下载附件
构造客户号授权码
2021-5-15 12:03 上传
2.2 GetZCMType调用BLL模块SysRegInfo类的isRightNumberZcm进行验证。
public bool isRightNumberZcm(string zcmNumber, string n1 = "0123456789", string n6 = "0123456789", string n13 = "0123456789")
{
string text = zcmNumber.Trim();
if (text.Length != 23)
{
return false;
}
text = this.GetPureNumber(text);
if (text.Length != 23)
{
return false;
}
if (n1.IndexOf(text[0])
客户号与授权码,只要满足上面的5个条件,即可通过。
2.3 Khh与Sqm的合体,ZCM
在我们构造Khh、Sqm的时候,一般是用Zcm逆推回去的,也就是将khh/sqm不同位置重新组合成23位长的字符串,khh/sqm与zcm的对应位置见下表。
[table]
[tr]
ZCM[/td]
0[/td]
1[/td]
2[/td]
3[/td]
4[/td]
5[/td]
6[/td]
7[/td]
8[/td]
9[/td]
10[/td]
11[/td]
12[/td]
13[/td]
14[/td]
15[/td]
16[/td]
17[/td]
18[/td]
19[/td]
20[/td]
21[/td]
22[/td]
[/tr]
[tr]
[td]Khh