道高一尺,魔高一丈。

程序员想尽各种办法给软件加密,用户就想尽各种办法对软件破解。

现在做软件试用限制,那么就讨论下软件的试用限制。总体来说,限制的方法有这么几种:

1.时间限制。

2.次数限制。

以时间限制为例,主要是用户从安装之日起, 限制用户使用天数。n天之后,就无法使用。这种限制主要是安装的时候,将当前日期写入注册表(或者硬盘上某文件)。当然,写入的是加密过的乱码字符。运行软件时,首先读取注册表(或者文件),如找不到注册表(或者文件),则提示软件未注册。当正常读取后进行解密,得到注册日期,与当前日期进行比较,如果  当前日期 减去 注册日期 > n(允许试用天数),那么提示软件试用到期,直接退出软件。否则 提示可试用天数, 继续试用软件。  根据以上思路,那么用户可以很容易破解软件。比如更改系统日期、或者删除注册表,重新安装软件等 。

针对用户的破解,对软件限制进行修改。如果试用软件必须联网,或者需要服务器端(比如聊天软件等客户端软件),当前时间要从去服务器的时间,防止用户更改客户机系统时间。或者服务器上对客户机进行记录,如记录主板id,安装时间,等等。。。

以上为客户机可联网的做法,当客户机无法上网,切不存在服务器,或者服务器就在本机时。以上做法将无法使用。

那么对于单机运行的软件,如果需要数据库,我们可以将注册时间等信息写入数据库。或者,我们可以采用一明一暗的做法,注册表是明,在硬盘的某角落,存放隐藏文件。软件需读取两处,对两处进行比较,一致则通过,不一致就退出程序。当然,安装的时候对该文件不替换。 我想用户是不愿意为了使用你的软件而格式化整个硬盘的。

其实还有做法,就是每次运行软件,先将当前日期与注册表对比,看是否过期。如未过期,就对注册表进行一次更改,更改为当前日期,那么用户即使更改系统日期,他的试用期限也在逐渐缩小。为了防止用户重装,还是采用一明一暗的做法。

基本上就这些方法吧..  贴上测试代码:

加密解密类:

 using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Xml.Linq;
using System.IO;
using System.Text;
using System.Security.Cryptography;namespace Add_To_Regedit
{public class Encryption{public static string EncryPW(string Pass, string Key){return DesEncrypt(Pass, Key);}public static string DisEncryPW(string strPass, string Key){return DesDecrypt(strPass, Key);}/   /// <summary>/// DES加密/// </summary>/// <param name="encryptString"></param>/// <returns></returns>public static string DesEncrypt(string encryptString, string key){byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));byte[] keyIV = keyBytes;byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);DESCryptoServiceProvider provider = new DESCryptoServiceProvider();MemoryStream mStream = new MemoryStream();CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);cStream.Write(inputByteArray, 0, inputByteArray.Length);cStream.FlushFinalBlock();return Convert.ToBase64String(mStream.ToArray());}/// <summary>/// DES解密/// </summary>/// <param name="decryptString"></param>/// <returns></returns>public static string DesDecrypt(string decryptString, string key){byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));byte[] keyIV = keyBytes;byte[] inputByteArray = Convert.FromBase64String(decryptString);DESCryptoServiceProvider provider = new DESCryptoServiceProvider();MemoryStream mStream = new MemoryStream();CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);cStream.Write(inputByteArray, 0, inputByteArray.Length);cStream.FlushFinalBlock();return Encoding.UTF8.GetString(mStream.ToArray());}//}
}读写注册表类:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Security.Cryptography;
using Microsoft.Win32;namespace Test_Form_Time
{class TimeClass{public static int InitRegedit(){/*检查注册表*/string SericalNumber = ReadSetting("", "SerialNumber", "-1");    // 读取注册表, 检查是否注册 -1为未注册if (SericalNumber == "-1"){               return 1;}/* 比较CPUid */string CpuId = GetSoftEndDateAllCpuId(1, SericalNumber);   //从注册表读取CPUidstring CpuIdThis = GetCpuId();           //获取本机CPUId         if (CpuId != CpuIdThis){return 2;}/* 比较时间 */string NowDate = TimeClass.GetNowDate();string EndDate = TimeClass.GetSoftEndDateAllCpuId(0, SericalNumber);if (Convert.ToInt32(EndDate) - Convert.ToInt32(NowDate) < 0){return 3;}return 0;}/*CPUid*/public static string GetCpuId(){ManagementClass mc = new ManagementClass("Win32_Processor");ManagementObjectCollection moc = mc.GetInstances();string strCpuID = null;foreach (ManagementObject mo in moc){strCpuID = mo.Properties["ProcessorId"].Value.ToString();break;}return strCpuID;}/*当前时间*/public static string GetNowDate(){string NowDate = DateTime.Now.ToString("yyyyMMdd"); //.Year + DateTime.Now.Month + DateTime.Now.Day).ToString();//     DateTime date = Convert.ToDateTime(NowDate, "yyyy/MM/dd");return NowDate;}/* 生成序列号 */public static string CreatSerialNumber(){string SerialNumber = GetCpuId() + "-" + "20110915";return SerialNumber; }/* * i=1 得到 CUP 的id * i=0 得到上次或者 开始时间 */public static string GetSoftEndDateAllCpuId(int i, string SerialNumber){if (i == 1){string cupId = SerialNumber.Substring(0, SerialNumber.LastIndexOf("-")); // .LastIndexOf("-"));return cupId;}if (i == 0){string dateTime = SerialNumber.Substring(SerialNumber.LastIndexOf("-") + 1);//  dateTime = dateTime.Insert(4, "/").Insert(7, "/");//  DateTime date = Convert.ToDateTime(dateTime);return dateTime;}else{return string.Empty;}         }/*写入注册表*/public static void WriteSetting(string Section, string Key, string Setting)  // name = key  value=setting  Section= path{string text1 = Section;RegistryKey key1 = Registry.CurrentUser.CreateSubKey("Software\\MyTest_ChildPlat\\ChildPlat"); // .LocalMachine.CreateSubKey("Software\\mytest");if (key1 == null){return;}try{key1.SetValue(Key, Setting);}catch (Exception exception1){return;}finally{key1.Close();}}/*读取注册表*/public static string ReadSetting(string Section, string Key, string Default){if (Default == null){Default = "-1";}string text2 = Section;RegistryKey key1 = Registry.CurrentUser.OpenSubKey("Software\\MyTest_ChildPlat\\ChildPlat");if (key1 != null){object obj1 = key1.GetValue(Key, Default);key1.Close();if (obj1 != null){if (!(obj1 is string)){return "-1";}string obj2 = obj1.ToString();obj2 = Encryption.DisEncryPW(obj2, "ejiang11");return obj2;}return "-1";}return Default;}}
}

调用方式如下:

int res = TimeClass.InitRegedit();if (res == 0){Application.Run(new Form1());}else if(res == 1){MessageBox.Show("软件尚未注册,请注册软件!");}else if (res == 2){MessageBox.Show("注册机器与本机不一致,请联系管理员!");}else if (res == 3){MessageBox.Show("软件试用已到期!");}else{MessageBox.Show("软件运行出错,请重新启动!");}

C#软件加序列号激活、试用期限相关推荐

  1. 一种NET软件加壳技术的设计与实现

    1 引言     为了保护自己的软件的技术内核不被他人轻易盗用,软件开发人员使用了各种加密技术来保障软件的版权不被侵犯,壳便是我们常用的一种软件保护手段.对于Win32 中软件加壳技术已经有非常成熟的 ...

  2. 全能系统优化组合软件WinTools安装激活教程

    WinTools.net是一系列设计用于优化 Microsoft Windows 操作系统的应用程序.通过清洁卸载工具 (Clean Uninstaller),本工具能够清除硬盘中无用的软件,跟踪对硬 ...

  3. 软件加壳的简易实现方式

    软件加壳的实现方式 一 操作步骤: 未注册用户进入的界面为: 其中,机器码其实是用户电脑的MAC地址,它是唯一的且不可更改. 软件注册工具就是一个客户端小程序: 根据客户提供的MAC地址(如果是本机可 ...

  4. vmware NSX 6.3.3 企业版序列号激活码密钥永久使用

    vmware NSX 6.3.3 企业版序列号激活码密钥永久使用 点击获取 www.vmssd.com 1.网络虚拟化与NSX 1) 当前数据中心基础之上实现:物理网络.物理存储.物理计算资源 2) ...

  5. 彻底删除软件,无限期使用试用版软件

    当我们不想在使用某软件时,可以将它删除,但是有些软件仅仅点击软件本身提供的卸载按钮是不能彻底删除的,会有一些残留,这让我们很头疼.彻底删除软件一般会有两个用途,一是不再想使用该软件:二是继续使用未破解 ...

  6. Adobe 系列软件安装及激活异常解决方法

    很多小伙伴安装 Adobe 的软件出现这样那样的的异常,希望通过这篇文章,可以帮大家解决问题. 安装前需要做什么? 如果安装过其它版本的 Adobe 软件,请使用 Adobe 官网卸载工具Adobe ...

  7. 会声会影2019序列号激活码安装教程

    会声会影为Corel公司的一款视频编辑软件,目前最新版本为会声会影2019版本,会声会影2019序列号激活码目前网上很难找到了,会声会影安装教程有很多也不好用了,由于该公司不遗余力对正版的支持. . ...

  8. 技术扫盲 软件加壳(转)

    首先我想大家应该先明白"壳"的概念.在自然界中,我想大家对壳这东西应该都不会陌生了,植物用它来保护种子,动物用它来保护身体等等.同样,在一些计算机软件里也有一段专门负责保护软件不被 ...

  9. rearm 命令_windows7系统修复命令利用rearm命令延长Windows 7试用期限

    现在激活的方法除了购买正版系列号外,网络上也流传了很多方法,但是那些免费的方法首先侵犯了微软的使用协议.另外很多方法是采用替换法,或刷BIOS,这样的结果是带来计算机的损坏或系统的不稳定,实在是得不偿 ...

最新文章

  1. 被追捧为“圣杯”的深度强化学习已走进死胡同
  2. win7 php mysql apache 64_教你在64位win7体系中设备apache+mysql+php情况.doc
  3. 函数平移口诀_八年级数学下册:一次函数的图像,平移口诀是“上加下减,左加右减”...
  4. TNS-03505 oracle用户可以tnsping通,普通用户tnsping报错
  5. PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.11. 杂项函数
  6. system v共享内存
  7. JavaScript 函数(方法)的封装技巧要领及其重要性
  8. java header file_javah 生成header file 报错 问题解决
  9. MyBatis-Plus 分页查询以及自定义sql分页
  10. ubuntu20 scrt 连接ssh报错的解决方法
  11. Winform分页控件使用详细介绍
  12. Maven+Nexus私服搭建
  13. vCenter学习笔记
  14. 关于川大667和972自命题考试的心得
  15. Java编程思想笔记——并发3
  16. 融合多策略的黄金正弦黑猩猩优化算法
  17. 【THUWC2017】在美妙的数学王国中畅游(bzoj5020)
  18. mac工具-解析json
  19. 青牛融合cdn_详解七牛云存储以及融合CDN加速
  20. h3c s5500 ssh v5 配置_H3C交换机创建ssh用户登录和设置aux密码

热门文章

  1. 【硬件设备】CPU系列之基础知识
  2. STM32CubeIDE开发(十六),I2C协议采集传感器数据(SHTC1、LTR-553ALS、BMP280、LSM6DSL、MMC3680KJ)
  3. JSON入门(Understanding JSON)
  4. 百度定位实时获取位置android,通过百度定位sdk获取实时位置
  5. Visual Studio 2017安装使用方法
  6. Restful风格的URL请求
  7. Navicat Premium和Navicat for MySQL的区别
  8. 微信小程序 - 如何利用百度飞桨实现图像分类识别
  9. Windows 11 企业版新功能介绍
  10. Program received signal SIGSEGV, Segmentation fault.