65.9K
CodeProject 正在变化。 阅读更多。
Home

应用程序试用版制作器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.39/5 (202投票s)

2006年9月6日

CPOL

6分钟阅读

viewsIcon

912542

downloadIcon

137015

一个轻松创建应用程序试用版的库。

引言

为你的应用程序制作试用版是很常见的。例如,你希望你的应用程序只能运行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.InverseByBaseEncryption.Boring

InverseByBaseEncryption.InverseByBase("ABCDEF",3) 将返回 CBAFED;这很简单——它反转每3个字符。

Boring:使用公式移动字符串中的每个字符。

NewPlace = (CurrentPlace * ASCII(character)) % string.length

生成序列密钥(密码)

我们使用 Encryption.MakePassword。此函数接受 BaseStringIdentifier。它使用 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 控件与我之前在文章中编写的不是同一个。
  • 始终保护你的标识符,不要丢失它们。
© . All rights reserved.