应用程序试用版制作器
一个轻松创建应用程序试用版的库。
- 下载源代码文件 - 72 Kb
- 下载 Example.zip
- 下载 Serial Maker 文件 - 46 Kb
- 下载 SerialBox Control 文件 - 34 Kb
- 下载 FilterTextBox Control 文件 - 19 Kb
引言
为你的应用程序制作试用版是很常见的。例如,你希望你的应用程序只能运行30天,或者用户最多只能运行你的应用程序200次。
你可以使用这个库来完成这类任务。
如果有人想购买你的应用程序,他必须联系你并提供他的计算机 ID。然后你将使用 Serial Maker 生成一个序列号(密码)。输入密码后,应用程序将永久运行完整版。
如果试用期结束,重新安装应用程序也无法让用户继续运行。
计算机 ID 是一个由硬件信息生成的25个字符的字符串。例如,处理器 ID、主板制造商、显卡名称、硬盘序列号等。你可以选择你想要用来生成计算机 ID 的硬件项目。
当你给客户提供密码时,在客户更改硬件之前,他的密码都不会改变。
计算机 ID
要生成计算机 ID,你必须指定你的应用程序名称。这是因为如果你使用 Trial Maker 为多个应用程序制作试用版,每个应用程序将拥有自己的计算机 ID。在源代码中,计算机 ID = "BaseString"
Trial Maker 使用管理对象来获取硬件信息。
串口
密码将通过更改计算机 ID 来生成。要生成密码,你必须拥有自己的标识符。这个标识符是一个3个字符的字符串。其中任何字符都不能是零。
文件
此类有两个文件用于处理。
第一个文件用于保存计算机信息和试用期的剩余天数。此文件必须放置在安全的位置,并且用户不得找到它(RegFile
)。将此文件保存在应用程序启动目录中是个不错的选择。
第二个文件将在用户注册软件时使用。它将包含用户输入的序列号(HideFile
)。你可以将 HideFile 保存在例如 C:\Windows\system32\tmtst.dfg。我的意思是某个不显眼的路径。
两个文件都将使用 Triple DES 算法进行加密。加密密钥是自定义的。最好选择你自己的加密密钥。
工作原理
获取系统信息
SystemInfo
类用于获取系统信息。它包含 GetSystemInfo
函数。此函数接受应用程序名称,并附加处理器 ID、主板产品等信息。
public static string GetSystemInfo(string SoftwareName) { if (UseProcessorID == true) SoftwareName += RunQuery("Processor", "ProcessorId"); if (UseBaseBoardProduct == true) SoftwareName += RunQuery("BaseBoard", "Product"); if (UseBaseBoardManufacturer == true) SoftwareName += RunQuery("BaseBoard", "Manufacturer"); // See more in source code SoftwareName = RemoveUseLess(SoftwareName); if (SoftwareName.Length < 25) return GetSystemInfo(SoftwareName); return SoftwareName.Substring(0, 25).ToUpper(); }
然后它会移除字符串中未使用的字符。A 到 Z 和 0 到 9 范围之外的任何字符都是未使用字符。如果字符串不够长,请调用 GetSystemInfoAgain
来使其更长。
RunQuery
函数接受对象名称(TableName
)和方法名称,并返回第一个对象的已定义方法。
private static string RunQuery(string TableName, string MethodName) { ManagementObjectSearcher MOS = new ManagementObjectSearcher("Select * from Win32_" + TableName); foreach (ManagementObject MO in MOS.Get()) { try { return MO[MethodName].ToString(); } catch (Exception e) { System.Windows.Forms.MessageBox.Show(e.Message); } } return ""; }
一旦我们获得了系统信息,我们就必须从中生成一个计算机 ID(BaseString
)。
生成计算机 ID(BaseString)
private void MakeBaseString()
{
_BaseString =
Encryption.Boring(Encryption.InverseByBase(
SystemInfo.GetSystemInfo(_SoftName),10));
}
要生成 BaseString
,我们首先获取系统信息,然后使用 Encryption.InverseByBase
和 Encryption.Boring
。
InverseByBase
:Encryption.InverseByBase("ABCDEF",3)
将返回 CBAFED;这很简单——它反转每3个字符。
Boring:使用公式移动字符串中的每个字符。
NewPlace = (CurrentPlace * ASCII(character)) % string.length
生成序列密钥(密码)
我们使用 Encryption.MakePassword
。此函数接受 BaseString
和 Identifier
。它使用 InverseByBase
3次和 Boring
1次,然后使用 ChangeChar
函数更改字符。
static public string MakePassword(string st, string Identifier) { if (Identifier.Length != 3) throw new ArgumentException("Identifier must be 3 character length"); int[] num = new int[3]; num[0] = Convert.ToInt32(Identifier[0].ToString(), 10); num[1] = Convert.ToInt32(Identifier[1].ToString(), 10); num[2] = Convert.ToInt32(Identifier[2].ToString(), 10); st = Boring(st); st = InverseByBase(st, num[0]); st = InverseByBase(st, num[1]); st = InverseByBase(st, num[2]); StringBuilder SB = new StringBuilder(); foreach (char ch in st) { SB.Append(ChangeChar(ch, num)); } return SB.ToString(); }
检查密码
生成 BaseString
和密码后,检查用户是否已注册软件。要做到这一点,请使用 CheckRegister
函数。如果之前已注册,它将返回 true,否则返回 false。
如果 CheckRegister
返回 false,则向用户显示注册对话框以输入密码。
显示对话框
创建一个新的 frmDialog
并将其显示给用户。如果对话框结果为 <code>OK
,则表示软件已成功注册;如果为 Retry
,则表示处于试用模式。任何其他 DialogResult
都表示取消。Dialog 类接受 BaseString、Password、剩余天数和剩余运行次数作为参数。
读写文件
有一个名为 FileReadWrite
的类。此类使用 Triple DES 加密算法读写文件。
FileReadWrite.WriteFile
接受两个字符串。第一个是文件路径,第二个是要写入的数据。写入所有数据后,它会写入字节 0 作为结束。这将用于读取。
public static void WriteFile(string FilePath, string Data) { FileStream fout = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write); TripleDES tdes = new TripleDESCryptoServiceProvider(); CryptoStream cs = new CryptoStream(fout, tdes.CreateEncryptor(key, iv), CryptoStreamMode.Write); byte[] d = Encoding.ASCII.GetBytes(Data); cs.Write(d, 0, d.Length); cs.WriteByte(0); cs.Close(); fout.Close(); }
读写密钥是相同的,它是自定义的,你可以更改它。
如何使用
使用场景
检查注册的最佳位置是在显示主对话框之前。当你创建一个 Windows 应用程序项目时,首先必须将 SoftwareLocker.dll 添加为引用。
然后在 program.cs 中找到 main 函数。我认为这是检查注册的最佳位置。你可以在主对话框加载时检查注册,但在此之前更好。
修改主对话框
最好为你的主对话框构造函数添加一个参数。一个布尔值,指示这是试用版还是完整版。如果是试用模式,根据需要禁用应用程序的某些部分。
如何修改 main()
添加命名空间
using SoftwareLocker;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
TrialMaker t = new TrialMaker("TMTest1",
Application.StartupPath + "\\RegFile.reg",
Environment.GetFolderPath(Environment.SpecialFolder.System) +
"\\TMSetp.dbf",
"Phone: +98 21 88281536\nMobile: +98 912 2881860",
5, 10, "745");
byte[] MyOwnKey = { 97, 250, 1, 5, 84, 21, 7, 63,
4, 54, 87, 56, 123, 10, 3, 62,
7, 9, 20, 36, 37, 21, 101, 57};
t.TripleDESKey = MyOwnKey;
// if you don't call this part the program will
//use default key to encryption
TrialMaker.RunTypes RT = t.ShowDialog();
bool is_trial;
if (RT != TrialMaker.RunTypes.Expired)
{
if (RT == TrialMaker.RunTypes.Full)
is_trial = false;
else
is_trial = true;
Application.Run(new Form1(is_trial));
}
}
不要移动前两行,在它们之后,定义 TrialMaker
类。
构造函数
SoftwareName
:你的软件名称,这将用于生成 ComputerID。RegFilePath
:如果用户输入了注册码,将保存注册码并每次运行时检查的文件路径。HiddenFilePath
:此文件将用于保存系统信息、试用期结束天数、用户还可以运行应用程序的次数以及当前日期。Text
:它将显示在注册对话框的“确定”按钮下方。使用此文本用于你的电话号码等。DefaultDays
:用户在试用模式下可以运行的天数。DefaultTimes
:用户可以运行应用程序的次数。Identifier
:用于生成密码的3个字符字符串。它是密码生成的标识符。
可选且推荐
在构造函数中,你可以更改默认的 Triple DES 密钥。它是一个24字节的密钥,然后你可以自定义用于生成计算机 ID(BaseString
)的管理对象。
t.UseBiosVersion = false // = true;
你可以通过任何 t.UseXxx
来做到这一点。
不要全部禁用或全不禁用,启用3或4个是最佳选择。或者你可以保留其默认设置。
Serial Maker
Serial maker 是另一个使用 Encryption 类的应用程序。它接受你的标识符并生成密码(序列密钥)。
不包含任何特殊内容。
其他控件
在注册对话框中,我使用了一个 SerialBox
控件。它只有5个文本框,你可以在其中输入你的序列号。
SerialBox
本身使用了 FilterTextBox
。
这两个控件都可以下载。
注释
- 所有代码均在 Visual Studio 2005 中编写。
- Serial Maker 作为文件链接使用 Trial Maker 中的 Encryption 类。
- 使用一个加密密钥写入并使用另一个密钥读取将导致异常。
- FilterTextBox 控件与我之前在文章中编写的不是同一个。
- 始终保护你的标识符,不要丢失它们。