zoukankan      html  css  js  c++  java
  • 动手写C#注册码工具(提供源码)

    前几天在博客园里面看到有个人分享了一篇注册码的代码,密密麻麻的还不可以运行,于是自己根据他的思路,把这个工作完成了。这里也是抱着分享的态度和大家交流一下。希望各位高手手下留情。


    首先我们需要引入一下using System.Management;这个类库。

    然后我们定义一下字段并设置其属性为只读。

    具体代码如下:

     private string _CPU;                        //  CPU
     private string _DiskVolumeSerialNumber;     //  DiskVolumeSerialNumber
     private string _MachineNum;                 //  MachineNum
     private string _RegNum;                     //  RegNum
     private int[] intCode = new int[127];       //  存储密钥
     private int[] intNumber = new int[25];      //  存机器码的Ascii值
     private char[] Charcode = new char[25];     //  存储机器码字
     private int _Times;                         //  设置软件使用的次数
     private string _regKey;                     //  设置注册表的Key值
     private bool _isRegNum;                        //  判断是否需要注册
            /// <summary>
            /// CPU 字符串
            /// </summary>
            public string CPU
            {
                get { return _CPU; }
            }
    
            public string DiskVolumeSerialNumber
            {
                get { return _DiskVolumeSerialNumber; }
            }
    
            public string MachineNum
            {
                get { return _MachineNum; }
            }
    
            public string RegNum
            {
                get { return _RegNum; }
            }
    
            public int Times
            {
                get { return _Times; }
            }
    
            public string RegKey
            {
                set { _regKey = value; }
            }
    
            public bool IsRegNum
            {
                get { return _isRegNum; }
                set { _isRegNum = value; }
            }    

    这里我们可以通过两个构造函数去声明来构造我们的对象。其中一个是带参数的,另一个是不带参数的。其中不带参数的需要在创建完对象之后再去设置其属性。

     #region 构造函数
            public RegClass()
            {
                this._CPU = getCPU();
                this._DiskVolumeSerialNumber = GetDiskVolumeSerialNumber();
                this._MachineNum = getMNum();
                this._RegNum = getRNum();
            }
    
            public RegClass(int times,string regKey) {
                this._Times = times;
                this._regKey = regKey;
                this._CPU = getCPU();
                this._DiskVolumeSerialNumber = GetDiskVolumeSerialNumber();
                this._MachineNum = getMNum();
                this._RegNum = getRNum();
            }
    
            #endregion
    

      最后我们需要一步一步的写其中每一个方法。具体还是看代码吧:

     #region 函数
            /// <summary>
            /// 获取CPU
            /// </summary>
            /// <returns>CPU字符串</returns>
            public string getCPU()
            {
                string strCPU = null;
                ManagementClass myCPU = new ManagementClass("win32_Processor");
                ManagementObjectCollection myCPUConnection = myCPU.GetInstances();
                foreach (ManagementObject myObject in myCPUConnection)
                {
                    strCPU = myObject.Properties["Processorid"].Value.ToString();
                    break;
                }
                return strCPU;
            }
    
            /// <summary>
            /// 获取卷轴字符串
            /// </summary>
            /// <returns>卷轴字符串</returns>
            public string GetDiskVolumeSerialNumber()
            {
                ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"d:\"");
                disk.Get();
                return disk.GetPropertyValue("VolumeSerialNumber").ToString();
            }
    
            /// <summary>
            /// 得到机器码
            /// </summary>
            /// <returns>机器码</returns>
            public string getMNum()
            {
                string strNum = getCPU() + GetDiskVolumeSerialNumber();     //获得24位Cpu和硬盘序列号
                string strMNum = strNum.Substring(0, 24);                   //从生成的字符串中取出前24个字符做为机器码
                return strMNum;
            }
    
            /// <summary>
            /// 给数组赋值小于10的数
            /// </summary>
            public void setIntCode()
            {
                for (int i = 1; i < intCode.Length; i++)
                {
                    intCode[i] = i % 9;
                }
            }
    
            /// <summary>
            ///  获得注册码
            /// </summary>
            /// <returns>注册码字符串</returns>
            public string getRNum()
            {
                setIntCode();//初始化127位数组
                for (int i = 1; i < Charcode.Length; i++)//把机器码存入数组中
                {
                    Charcode[i] = Convert.ToChar(getMNum().Substring(i - 1, 1));
                }
                for (int j = 1; j < intNumber.Length; j++)//把字符的ASCII值存入一个整数组中。
                {
                    intNumber[j] = intCode[Convert.ToInt32(Charcode[j])] + Convert.ToInt32(Charcode[j]);
                }
    
                #region 此处代码 待优化
                string strAsciiName = "";//用于存储注册码
                for (int j = 1; j < intNumber.Length; j++)
                {
                    if (intNumber[j] >= 48 && intNumber[j] <= 57)//判断字符ASCII值是否0-9之间
                    {
                        strAsciiName += Convert.ToChar(intNumber[j]).ToString();
                    }
                    else if (intNumber[j] >= 65 && intNumber[j] <= 90)//判断字符ASCII值是否A-Z之间
                    {
                        strAsciiName += Convert.ToChar(intNumber[j]).ToString();
                    }
                    else if (intNumber[j] >= 97 && intNumber[j] <= 122)//判断字符ASCII值是否a-z之间
                    {
                        strAsciiName += Convert.ToChar(intNumber[j]).ToString();
                    }
                    else//判断字符ASCII值不在以上范围内
                    {
                        if (intNumber[j] > 122)//判断字符ASCII值是否大于z
                        {
                            strAsciiName += Convert.ToChar(intNumber[j] - 10).ToString();
                        }
                        else
                        {
                            strAsciiName += Convert.ToChar(intNumber[j] - 9).ToString();
                        }
                    }
                }
                #endregion
                return strAsciiName;
            }
    
            /// <summary>
            /// 是否需要注册
            /// </summary>
            /// <returns></returns>
            public bool IsReg() {
                _Times = LeftTimes();
                if (_Times == 0 || _Times == -1) { 
                    return false;
                }
                return true;
            }
    
            /// <summary>
            /// 升序的次数
            /// </summary>
            /// <returns>剩余的次数</returns>
            private int LeftTimes() {
                RegistryKey rootKey, regKey;
                rootKey = Registry.CurrentUser.OpenSubKey("Software",true);
    
                if ((regKey = rootKey.OpenSubKey(_regKey, true)) == null)
                {
                    rootKey.CreateSubKey(_regKey);
                    regKey = rootKey.OpenSubKey(_regKey,true);
                    _Times = _Times - 1;
                    regKey.SetValue("LeftTime",(object)(_Times));
                    return _Times;
                }
    
                object leftTime = regKey.GetValue("LeftTime");
                _Times = Int32.Parse(leftTime.ToString()) - 1;
    
                if (_Times <= 0) {
                    return -1;
                }
                else {
                    regKey.SetValue("LeftTime", (object)(_Times));
                    return _Times;
                }
            }
    
            #endregion

    这个是我写的简单类库,我们在自己程序的时候 只需要简单的调用这个类库,然后去生命这个类的对象就可以了。具体使用如下:

    RegClass reg = new JCodesRegLib.RegClass(5, "TestKey");      //其中前面的参数是代表你的应用程序可以被使用的次数,后面那个是注册码的名字

     private void Form1_Load(object sender, EventArgs e)
            {
                textBox1.Text = reg.CPU;
                textBox2.Text = reg.DiskVolumeSerialNumber;
                textBox3.Text = reg.MachineNum;
                textBox4.Text = reg.RegNum;
            }

    当我们程序一开始加载的时候,就去使用得到相应的注册码和别的信息。

    不足之处
      首先我觉得自己设计的时候还是比较简单的。没有从大众的软件注册码设计出发。其中我们的注册码设计的原理是根据你的硬件和磁盘信息得到的32位注册码。其中还有把一些信息保存的到了注册表中,但是安全性比较低。我自己也测试过了,如果你的电脑上装一个Regmon这个软件,就可以去动态的检查你的注册表修改信息。很容易破解。所以在开发的时候,这个只是给初学者了解一下 注册码大概的实现过程和c#如何去操作注册码这些知识。

    代码下载

    Stallman 先生认为最大的快乐是让自己发展的软件让大家来使用了!

  • 相关阅读:
    0806 c#总复习
    0804 递归
    0808 html基础
    0803结构体,枚举类型
    0801out传值
    0731函数
    0730特殊集合
    0728多维数组,ArrayList集合
    js 获取url链接的任意参数
    jq dom操作
  • 原文地址:https://www.cnblogs.com/Jimmy009/p/3096895.html
Copyright © 2011-2022 走看看