做个计算器--实现一机一码

简介: 做个计算器--实现一机一码

上一篇文章我们讲解了实现注册码的原理,以及实现了注册机生成注册码。这篇文章我们将完成计算器注册代码的实现,和复制功能的实现。


零、实现注册

在实现代码前我先简单说一下注册的思路,当我们点击注册按钮时,会先拿到输入的注册码,然后程序会根据机器码生成注册码,接着用输入的注册码和生成的注册码进行对比,如果一样就跳转到计算器窗体,反之弹出提示框。代码实现如下:

private void Registered_button_Click(object sender, EventArgs e)
{
    //1.获取注册码
    string registrationCode = RegistrationCode_TextBox.Text;
    //2.根据机器码生成注册码
    string machineCode = MachineCode_TextBox.Text;
    machineCode = $"miao{machineCode}shu";
    string md5Str = MD5(machineCode);
    md5Str = MD5(md5Str);
    md5Str = md5Str.Replace("-", "");
    //3.对比填入的注册码和生成的注册码
    if (registrationCode == md5Str)
    {
        //3.1.如果注册码一样跳转到计算器窗体
        this.DialogResult = DialogResult.OK;
    }
    else
    {
        //3.2.如果注册码不一样则弹出提示框
        MessageBox.Show("注册码不正确!");
    }
}
private static string MD5(string str)
{
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
    byte[] bytes = Encoding.UTF8.GetBytes(str);
    string md5Str = BitConverter.ToString(md5.ComputeHash(bytes));
    return md5Str;
}

我们运行注册机程序和计算器程序,并生用生成的注册码注册我们的计算器程序,这时就可以正常进入到计算器窗体,但是当你关掉程序再次运行时还是会弹出注册窗体,这是因为我们的计算器程序并不知道我们已经注册了,那么我们应该如何让程序知道我们已经注册了呢?其实只需要把注册码保存在程序的运行目录下,然后每次运行时都会先读取保存的注册码,并对注册码进行校验,校验通过后就直接显示计算器窗体,反之显示注册窗体。

Registered_button_Click 事件里的代码修改如下:

private void Registered_button_Click(object sender, EventArgs e)
{
    //1.获取注册码
    string registrationCode = RegistrationCode_TextBox.Text;
    //2.根据机器码生成注册码
    string machineCode = MachineCode_TextBox.Text;
    machineCode = $"miao{machineCode}shu";
    string md5Str = MD5(machineCode);
    md5Str = MD5(md5Str);
    md5Str = md5Str.Replace("-", "");
    //3.对比填入的注册码和生成的注册码
    if (registrationCode == md5Str)
    {
        //3.1.如果注册码一样跳转到计算器界面
        //3.2.保存注册码
        File.WriteAllText("system.ini", registrationCode);
        this.DialogResult = DialogResult.OK;
    }
    else
    {
        //3.2.如果注册码不一样则弹出提示框
        MessageBox.Show("注册码不正确!");
    }
}

Program 修改如下:

static class Program
{
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        if (File.Exists("system.ini"))
        {
            //1.读取system.ini文件中的注册码
            string registrationCode = File.ReadAllText("system.ini");
            //2.生成注册码
            string machineCode = MachineCode();
            machineCode = $"miao{machineCode}shu";
            string md5Str = MD5(machineCode);
            md5Str = MD5(md5Str);
            md5Str = md5Str.Replace("-", "");
            //3.判断注册码是否一致
            if (registrationCode == md5Str)
            {
                Application.Run(new MainForm());
                return;
            }
        }
        //先显示窗体Registerd
        Registered r = new Registered();
        if (r.ShowDialog() == DialogResult.OK)//当窗体Registerd关闭时再打开MainForm船体
        {
            Application.Run(new MainForm());
        }
    }
    private static string MD5(string str)
    {
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        byte[] bytes = Encoding.UTF8.GetBytes(str);
        string md5Str = BitConverter.ToString(md5.ComputeHash(bytes));
        return md5Str;
    }
    private static string MachineCode()
    {
        //获取硬件信息
        string cpu = HardwareInformation.Get("Win32_Processor");
        string baseBoard = HardwareInformation.Get("Win32_BaseBoard");
        string bois = HardwareInformation.Get("Win32_BIOS");
        string diskDrive = HardwareInformation.Get("Win32_PhysicalMedia");
        //生成机器码
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        string inf = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(cpu + baseBoard + bois + diskDrive)), 4, 8);
        return inf;
    }
}

一、复制功能

到目前为止我们已经实现了注册功能和生成注册码的功能,下面我们来实现剩下的一个功能:复制。我们只需要在复制按钮的 click 事件中调用 Clipboard.SetText 即可。

注册机的复制按钮代码:

private void Copy_Button_Click(object sender, EventArgs e)
{
    Clipboard.SetText(RegistrationCode_TextBox.Text);
    MessageBox.Show("注册码复制完成");
}

计算器的复制按钮:

private void Copy_Button_Click(object sender, EventArgs e)
{
    Clipboard.SetText(MachineCode_TextBox.Text);
    MessageBox.Show("机器码复制完成");
}

二、总结

本篇文章是这个阶段的最后一篇文章,主要讲解了如何实现软件的注册功能,软件的注册功能是最简单的防破解功能。从下一篇文章开始我们正式进入防破解的阶段。


Tip:代码下载地址,

注册机代码:https://gitee.com/miaoshu_studio/RegisterMachine.git CopyTheRegistrationCode 分支

计算器代码:https://gitee.com/miaoshu_studio/calculator.git

RealizeRegistration 分支


目录
打赏
0
0
0
0
5
分享
相关文章
SaaS云his药房模块出入库支持扫码枪
云HIS系统采用SaaS软件应用服务模式,提供软件应用服务多租户机制,实现一中心部署多机构使用。相对传统HIS单机构应用模式,它可灵活应对区域医疗、医疗集团、医联体、连锁诊所、单体医院等应用场景,并提升区域内应用的标准化与规范化程度,大幅降低软件实施运维成本与实施周期。
112 0
IPP智能合约底池模式开发|IPPswap合约交易质押LP系统开发(详情说明)
区块链通过分布式网络、加密算法和共识机制三大核心技术 function onlyOwnerTransferOwnership
未来生物积分返现模式系统开发|步骤方案
实体门店商家通过信息技术对消费者、商品、营销、交易4个环节进行运营数据化
关于LP质押模式系统开发|LP交易兑换系统搭建
区块链的去中心化,数据的防篡改,决定了智能合约更加适合于在区块链上来实现
现货期权系统开发指南与方案|秒合约系统源码开发
Web3是一个正在快速发展的新型互联网技术,它基于区块链技术
LeToken钱包系统开发|LeToken钱包系统开发指南与方案
在一个分布有众多节点的系统中,每个节点都具有高度自治的特征。
微信商户平台转账到零钱功能接入实战
近期营销活动中需要商户转账到微信用户零钱,实战角度说下接入过程,期间用的时间也比较多,把遇到的问题以及如何处理问题过程记录一下,希望对有同样需求的同学有所帮助,尽量少用一些时间,更专注业务处理.本文仅以发起商家转账( /v3/transfer/batches)功能进行讲解.
微信商户平台转账到零钱功能接入实战
电商收付通可视化进件二级商户,多功能升级
服务商账号参数在成后台可配置,随时修改,立即生效。更换服务商账号相关参数无需修改代码再次打包部署,更便捷。参数包括本系统应用名称、服务商平台商户号、商户号绑定的appId、服务商平台商户API证书序列号、服务商平台商户API证书位置路径、微信支付平台证书位置路径、微信支付平台apiV3密钥、微信支付回调通知地址。
168 0
电商收付通可视化进件二级商户,多功能升级