`
alibabamon
  • 浏览: 7694 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

为自己的软件制作注册码

阅读更多
 "翻身做主"--给自己的软件制作注册码

  从今天起, 您开发的的任何软件如果您愿意都可以为之加密 --为您的软件制作一款注册机!

  当您看完这篇文章时, 您就可以理直气壮的告诉您的用户 : "喂, 想用我的软件是吧 ? 掏钱!".

  呵呵, 这当然只是给自己壮胆的话, 现在连万能注册机都有了, 人家还怕啥 ? 不过只要您想想微软, 人家再牛B的加密技术都会被国人"鄙视"? 但人家不也在中国大把大把的捞钱吗?

  OK, 不扯了, 我们进入正题.

  同一般的软件注册一样, 我们这里的注册是这样进行的:

  1. 首先根据用户的硬件信息生成24位的机器码

  -- 相当于种子,用于生成随机数

  2. 采用注册机根据特征数字生成一个24位注册码

  -- 相当于伪随机数生成器, 输出长度自己定, 最后用一个格式化函数,将随机数映射到ASCII字符集合

  3. 用户输入注册码注册成功

  假设客户很喜欢您的软件, 也假设他没有破解, 他需要通过以下方式向您取得注册码:

  (1).如果他能上网, 他需要把机器码用Email发给您;

  (2).如果他不能上网, 他可以把机器码用手机短信的方式发给您.

  (3).如果他没有手机, 他可以带着机器码然后坐火车到您的办公室想您要一个注册码.

  --第3条只是为了让您看帖子的时候别太枯燥了, 抱歉.

  现在, 您拿到了客户的机器码后, 如果您同时也收到了他汇的钱, 呵呵, 好像给软件加密就是为了要钱吧? 那么您就可以用客户的机器码生成一个唯一的注册码再用同样的方式给用户, 最后, 用户输入注册码即可!

  需要强调的是客户机器的硬件信息获取方式是有很多种选择的. 这里我们选择最放心的两个硬件: CUP的序列号和硬盘的卷标号. 好了, 下面您就可以一步一步制作一款软件注册机了.

  步骤一: 获得CUP序列号和硬盘序列号的实现代码如下:


view plaincopy to clipboardprint?
  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;
  }
  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;
  }
  view plaincopy to clipboardprint?
  // 取得设备硬盘的卷标号
  public string GetDiskVolumeSerialNumber()
  {
  ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
  ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"d:\"");
  disk.Get();
  return disk.GetPropertyValue("VolumeSerialNumber").ToString();
  }
  // 取得设备硬盘的卷标号
  public string GetDiskVolumeSerialNumber()
  {
  ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
  ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"d:\"");
  disk.Get();
  return disk.GetPropertyValue("VolumeSerialNumber").ToString();
  }


  步骤二: 收集硬件信息生成机器码, 代码如下:


 view plaincopy to clipboardprint?
  //生成机器码
  private void button1_Click(object sender, EventArgs e)
  {
  label2.Text = getCpu() + GetDiskVolumeSerialNumber();//获得24位Cpu和硬盘序列号
  string[] strid = new string[24];
  for (int i = 0; i < 24; i++)//把字符赋给数组
  {
  strid[i] = label2.Text.Substring(i, 1);
  } label2.Text = "";
  Random rdid = new Random();
  for (int i = 0; i < 24; i++)//从数组随机抽取24个字符组成新的字符生成机器三
  {
  label2.Text += strid[rdid.Next(0, 24)];
  }
  }
  //生成机器码
  private void button1_Click(object sender, EventArgs e)
  {
  label2.Text = getCpu() + GetDiskVolumeSerialNumber();//获得24位Cpu和硬盘序列号
  string[] strid = new string[24];
  for (int i = 0; i < 24; i++)//把字符赋给数组
  {
  strid[i] = label2.Text.Substring(i, 1);
  } label2.Text = "";
  Random rdid = new Random();
  for (int i = 0; i < 24; i++)//从数组随机抽取24个字符组成新的字符生成机器三
  {
  label2.Text += strid[rdid.Next(0, 24)];
  }
  }


  步骤三: 使用机器码生成软件注册码, 代码如下:


 view plaincopy to clipboardprint?
  public int[] intCode = new int[127];//用于存密钥
  public void setIntCode()//给数组赋值个小于10的随机数
  {
  Random ra = new Random();
  for (int i = 1; i < intCode.Length; i++)
  {
  intCode[i] = ra.Next(0, 9);
  }
  }
  public int[] intNumber = new int[25];//用于存机器码的Ascii值
  public char[] Charcode = new char[25];//存储机器码字
  //生成注册码
  private void button2_Click(object sender, EventArgs e)
  {
  if (label2.Text != "")
  { //把机器码存入数组中
  setIntCode();//初始化127位数组
  for (int i = 1; i < Charcode.Length; i++)//把机器码存入数组中
  {
  Charcode[i] = Convert.ToChar(label2.Text.Substring(i - 1, 1));
  }//
  for (int j = 1; j < intNumber.Length; j++)//把字符的ASCII值存入一个整数组中。
  {
  intNumber[j] = intCode[Convert.ToInt32(Charcode[j])] + Convert.ToInt32(Charcode[j]);
  }
  string strAsciiName = null;//用于存储机器码
  for (int j = 1; j < intNumber.Length; j++)
  {
  //MessageBox.Show((Convert.ToChar(intNumber[j])).ToString());
  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();
  }
  }
  label3.Text = strAsciiName;//得到注册码
  }
  }
  else
  {
  MessageBox.Show("请选生成机器码", "注册提示");
  }
  }
  public int[] intCode = new int[127];//用于存密钥
  public void setIntCode()//给数组赋值个小于10的随机数
  {
  Random ra = new Random();
  for (int i = 1; i < intCode.Length; i++)
  {
  intCode[i] = ra.Next(0, 9);
  }
  }
  public int[] intNumber = new int[25];//用于存机器码的Ascii值
  public char[] Charcode = new char[25];//存储机器码字
  //生成注册码
  private void button2_Click(object sender, EventArgs e)
  {
  if (label2.Text != "")
  { //把机器码存入数组中
  setIntCode();//初始化127位数组
  for (int i = 1; i < Charcode.Length; i++)//把机器码存入数组中
  {
  Charcode[i] = Convert.ToChar(label2.Text.Substring(i - 1, 1));
  }//
  for (int j = 1; j < intNumber.Length; j++)//把字符的ASCII值存入一个整数组中。
  {
  intNumber[j] = intCode[Convert.ToInt32(Charcode[j])] + Convert.ToInt32(Charcode[j]);
  }
  string strAsciiName = null;//用于存储机器码
  for (int j = 1; j < intNumber.Length; j++)
  {
  //MessageBox.Show((Convert.ToChar(intNumber[j])).ToString());
  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();
  }
  }
  label3.Text = strAsciiName;//得到注册码
  }
  }
  else
  {
  MessageBox.Show("请选生成机器码", "注册提示");
  }
  }


  步骤四: 用户输入注册码注册软件, 演示代码如下:

  
view plaincopy to clipboardprint?
  private void btnRegist_Click(object sender, EventArgs e)
  {
  if (label3.Text != "")
  {
  if (textBox1.Text.TrimEnd().Equals(label3.Text.TrimEnd()))
  {
  Microsoft.Win32.RegistryKey retkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("software", true).CreateSubKey("ZHY").CreateSubKey("ZHY.INI").CreateSubKey(textBox1.Text.TrimEnd());
  retkey.SetValue("UserName", "MySoft");
  MessageBox.Show("注册成功");
  }
  else { MessageBox.Show("注册码输入错误"); }
  }
  else
  {
  MessageBox.Show("请生成注册码", "注册提示");
  }
  }
  private void btnRegist_Click(object sender, EventArgs e)
  {
  if (label3.Text != "")
  {
  if (textBox1.Text.TrimEnd().Equals(label3.Text.TrimEnd()))
  {
  Microsoft.Win32.RegistryKey retkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("software", true).CreateSubKey("ZHY").CreateSubKey("ZHY.INI").CreateSubKey(textBox1.Text.TrimEnd());
  retkey.SetValue("UserName", "MySoft");
  MessageBox.Show("注册成功");
  }
  else { MessageBox.Show("注册码输入错误"); }
  }
  else
  {
  MessageBox.Show("请生成注册码", "注册提示");
  }
  }

分享到:
评论

相关推荐

    毕设项目:C++ Qt 基于数据库Mysql学生信息管理系统.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    洛雪音乐助手自定义音源v1.2.0下载.zip

    洛雪音乐助手自定义音源v1.2.0下载.zip

    125.0.6422.142 -chromedriver-win64

    版本为125.0.6422.142的chromedriver,供对应版本的谷歌浏览器进行爬虫的驱动

    160-微信小程序-信息科技公司展示小程序.zip

    源代码+截图

    aiohttp-3.7.0-cp37-cp37m-manylinux1_i686.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    带外设的51单片机,集成了0.96英寸的屏幕和外接的引脚.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    cryptography-2.4.1-cp35-cp35m-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    上市公司企业短期并购绩效和长期并购绩效数据集合(2008-2022).txt

    因文件较多,数据存放网盘,txt文件内包含下载链接及提取码,永久有效。 样例数据及详细介绍参见文章:https://blog.csdn.net/li514006030/article/details/139608790

    《低成本开放式架构跌倒检测系统作为无线传感器网络实现》matlab代码.rar

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    牛顿环仿真matlab.rar

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于555定时器的占空比可调电路单稳态延时电路积分电路multisim仿真电路.zip

    基于555定时器的占空比可调电路单稳态延时电路积分电路multisim仿真电路: 单稳态延时电路.ms10 单稳态延时电路.ms10 (Security copy) 占空比可调电路设计.ms10 占空比可调电路设计.ms10 (Security copy) 积分电路.ms10 积分电路.ms10 (Security copy)

    087-微信小程序-课程预约.zip

    源代码+截图

    EnviroSkyandWeather v2.1.1(u2017.1.2)真实动态天气系统包

    unity真实动态天气系统包

    openHarmony的编码规范

    openHarmony的编码规范

    小程序-32-基于微信小程序的新生报到系统--LW-源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    cryptography-1.4-cp33-cp33m-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    计算机专业毕设课设-JAVA班主任管理系统(源代码+论文).zip

    计算机专业毕设课设-JAVA班主任管理系统(源代码+论文).zip

    私人云盘(自动云同步)

    1、实现功能:模仿小米的云服务,实现一个通过TCP实现的私人云盘,因为能力有限,所以只实现自动云同步这一个功能,具体可以分为三个小功能,即保持云端和终端数据一致、实现文件的上传与下载以及手动同步。 2、涉及知识点:涉及到的知识点主要有文件的打开与关闭,文件的发送与接收,文件的写入及socket通信,为了项目整体的间接性,还使用到的枚举类型的结构体以及链表对部分功能进行了封装。 3、通过项目进一步强化自己学习到的知识,并将其融会贯通,提升自己的编程能力

    atcoder ABC 354-ABC题详解

    难度划分: A题:ABC比赛中最简单的一道题目,通常是基础的输入输出题或简单的数学运算。解决A题所需思维和编程能力相对较低,通常可在10分钟内完成。 B题:中等难度的题目,可能涉及一些较为复杂的算法,需要一定的逻辑思维和编程技巧。解决B题可能需要20分钟到半个小时的时间。 C题及以上:难度逐渐增加,可能需要更深入的专业知识和算法能力。

    基于springboot的驾校管理系统

    开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有!

Global site tag (gtag.js) - Google Analytics