`
duchq044
  • 浏览: 29599 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

C#下一机一码注册方式的实现

    博客分类:
  • C#
阅读更多
对于做共享软件开发的程序员来说,最让大家头痛的就是辛辛苦苦写出的软件,本想拿来换口饭吃,可刚刚发布到网上就被那些共享主义者(其实业没什么不好或不对,本人就属于这类人,嘿嘿)将序列号和注册机免费发放到网上,最终导致开发者只能眼睁睁看着束手无策。但与此同时部分软件开发者也开始了反任意爆破等方法的研究,于是现在网上就出现了各种各样的注册方式,但目前看最有效的就属于一机一码这种方式了。

可能因为这种方式最有效,所以微软就在它新推出的编程平台上提供了一些简单实用的方法,今天本人就借助.NET平台下的公共类库来实现一机一码注册算法。在此之前先来介绍一下一机一码的注册原理及与一码一序列号的比较。

之所以是一机指的就是通过获取机器硬件(主要是硬盘和CPU)的一些信息作为注册序列号的一部分,因为目前世界上所有厂家生产的每个硬盘和每个CPU都有自己独有的一些ID号等硬件信息(理论上是如此但实际上也许有一样的,不过那种几率很低,予以忽略不计了),通过一定算法将这些硬件信息读取出来作为注册码,这样就免除了不同机器可以使用相同注册序列号的问题,一码一序列号就是因为这样才造成了只要一个有注册码和序列号被发布到网上别人就可以正常使用软件这种一码通用的现象。

由于.NET提供了相关的类库,本人又稍微借鉴下网上的资料及本人只从事C#方面开发,所以在此本人只写了C# 的代码,下面就把代码写在下面了:

         private string CpuId()

         {

              try

              {

ManagementObjectCollection collection1 = new ManagementClass("Win32_Processor").GetInstances();

                   string strCpuID = null;

                   foreach (ManagementObject obj1 in collection1)

                   {

                       strCpuID = obj1.Properties["ProcessorId"].Value.ToString();

                       break;

                   }

                   return strCpuID;

              }

              catch

              {

                   return "strCpuID";

              }

         }



         //硬盘序列号读取函数

         private string DiskId()

         {

              try

              {

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");

                   String strHardDiskID = null ;

                   foreach(ManagementObject mo in searcher.Get())

                   {   

                       strHardDiskID = mo["SerialNumber"].ToString().Trim();

                       break;         

                   }

                   return strHardDiskID;

              }

              catch

              {

                   return "strHardDiskID";

              }

     }

以上只完成了全部算法的一部分,接下来就是记录注册信息,这个一般都是记录在系统注册表中,这就涉及到注册表的读写,实际并不复杂,这里将读写注册表的代码也写下来了:

//读取注册表注册信息

RegistryKey softwareKey = Registry.LocalMachine.OpenSubKey("SOFTWARE");

RegistryKey choseKey = softwareKey.OpenSubKey("SOW");

RegistryKey SowKey = choseKey.OpenSubKey("Regexample");

this.textBox2.Text = SowKey.GetValue("SerialId").ToString();

this.textBox1.Text = SowKey.GetValue("RegisterCode").ToString();

//写入注册表注册信息

RegistryKey softwareKey = Registry.LocalMachine.OpenSubKey("SOFTWARE",true);

RegistryKey choseKey = softwareKey.CreateSubKey("SOW");

RegistryKey ValueKey = choseKey.CreateSubKey("Regexample");

ValueKey.SetValue("SerialId", SerialId().ToString());

ValueKey.SetValue("RegisterCode", this.textBox1.Text);

注:实际注册表读写信息:

[HKEY_LOCAL_MACHINE\SOFTWARE\SOW\Regexample]

"SerialId"="-1587187206"

"RegisterCode"="-1587187206"

  通过以上两个步骤基本的实现代码就基本完成了,接下来是具体实现顺序,当软件运行时,将先从注册表获取注册信息,来比较经过某种算法处理过的注册码和序列号是否相同,如注册表不存在所要信息就在注册表中写入未注册信息,之后获取机器硬件(硬盘和CPU)信息,将其哈希代码作为注册序列号返回并写入注册表。这样一来在软件下次启动时,就可以直接从注册表获取注册信息来比较而不必重新读取硬件ID信息了(因为偶发现.NET读取硬件信息的速度是很慢的。。。。。。。)。

  大体的实现方式就是这样,本人以将一个完整的演示程序(含源码)放到本人共享空间的.NET相关目录下,有兴趣的可以去看看,但这里还要提醒大家一下,这个方法还存在3个问题:其一,由于.NET自身的可反编译性(阴谋啊,阴谋,绝对是微软的阴谋,刚刚看完《欢迎加入NHK》的某人飘过),致使所有在.NET噢那个框架开发出来的程序都可以被反编译成源代码,即使做怎样复杂的注册算法都将失去实际意义(即使利用混淆起到的作用也不大,毕竟不是研究密码学的,注册算法不可能复杂到那种地步);其二,即使不被反编译但由于采用常规IF判断方式,给破解者留下了可设跳转断点的弱点,导致软件易被爆破掉;其三,由于最初想让软件启动速度变快,导致获取硬件信息仅在注册表没有相关信息的情况下才执行,造成可以伪造注册信息,这里实际应改动下的。不过,目前这些问题本人已基本解决了,并且有些还有进一步改进。希望大家在使用这种方法时自己再改动下(当然,由于微软下一代软件的理念是WEB与WINFORM的合二为一,所以这种注册方式是可以用在WEB项目的注册上的),这里就权当抛砖引玉了,由于偶是程序开发新手加之写的都是些没啥技术含量的东西所以就不在这里卖弄了,还望高手来指点,谢谢。
分享到:
评论

相关推荐

    C#一机一码注册方式演示样例

    C#一机一码注册方式演示样例

    C# 自动开发一机一码加密

    1.C#生成私钥和公钥 2.获取安装主机PC主板、硬盘、CPU信息进行加密 3.使用公钥对机器组合信息加密得到产品注册KEY 4.使用私钥对注册KEY解密正确才能进入系统

    C# 一码一机

    C#简单软件加密源码,一码一机,示例demo ,有效期限值

    C# 软件 机器码生成注册码

    综上所述,C#中实现机器码生成注册码的过程包括获取硬件信息、生成机器码、创建注册码以及验证注册码。这个过程中,安全性是关键,开发者需要不断调整加密策略以应对破解手段的升级。在项目"zhuceTest"中,你可以...

    .net注册机与解密源码,基于C# 程序加密与解密DEMO程序示例 - 实现权限加密,可适用于设备催付款,限制试用日期

    net注册机与解密源码,基于C# 程序加密与解密DEMO程序示例 --- 实现权限加密,可适用于设备催付款,限制试用日期,一机一码,加密过程中客户尝试修改电脑时间、或更换电脑均无效!可作为程序参考,将程序源码适当...

    encryptdll3.8

    获取的硬盘序列号不随硬盘分区及格式化改变,支持IDE、SCSI接口硬盘,获取主板序列号的功能支持各类BIOS芯片,这两个功能可方便的用来实现一机一码的注册方式。算法库集成的算法有:BlowFish,MD5,Secret16,AES、SHA...

    共享软件加密算法库 企业版2.51

    获取的硬盘序列号不随硬盘分区及格式化改变,支持IDE、SCSI接口硬盘,获取主板序列号的功能支持各类BIOS芯片,这两个功能可方便的用来实现一机一码的注册方式。算法库集成的算法有:BlowFish,MD5,Secret16,AES、SHA...

    VMProtect UltimateV3.5 中文版是一款高级版的程序加壳工具.rar

    视频加密一机一码,图片加密U盘加密软件,软件加密软件,压缩包加密软件

    通达信DLL开发视频教程.zip

    通达信DLL开发视频教程,目前只出了几个章节,后续慢慢加上。 基础教程 1。讲解搭建开发环境 1_开发工具选择及安装 2_VS2005软件介绍 3_新建项目介绍 4_文件结构介绍 5_项目属性介绍 6_编译生成调试...讲解一机一码的

    Eziriz NET Reactor v5.9.8.0.rar

    无与伦比的.NET代码保护系统,可完全停止任何反编译。以安全,简单的方式保护您的软件,而不必担心如何保护您的知识产权 此工具可以保护您的NET程序以及给程序添加一机一码授权许可

    .NET Reactor 6.3

    .NET Reactor 6.3 无与伦比的.NET代码保护系统,可完全停止任何反编译。以安全,简单的方式保护您的软件,而不必担心如何保护您的知识产权 此工具可以保护您的NET程序以及给程序添加一机一码授权许可

    皮带秤称重软件需求.docx

    皮带秤称重软件作为一款专门针对工业称重领域设计的应用程序,主要应用于Windows桌面环境,采用C#编程语言进行开发。该软件利用MySQL或Access作为数据库管理系统,旨在提供高效、准确的数据采集与处理能力。软件的...

Global site tag (gtag.js) - Google Analytics