Click here to Skip to main content
15,867,330 members
Articles / Programming Languages / C#

Application Trial Maker

Rate me:
Please Sign up or sign in to vote.
4.39/5 (202 votes)
16 Feb 2009CPOL6 min read 835.9K   136.4K   464   263
A library to easily create a trial version of your application

Introduction

It's very common to want a trial version of your application. For example, you need your application to only run for 30 days, or the user can only run your application 200 times.

You can do this kind of task with this library.

If someone wants to buy your application, he must call you and read his computer ID. Then you will use the Serial Maker to make a serial key (password). After entering the password, the application always runs as the full version.

If the trial period is finished, reinstalling the application won't let user run it.

The computer ID is a 25 character string that came from hardware information. Processor ID, main board manufacturer, VGA name, hard disk serial number, etc. You can choose what hardware items you want to use to make the computer ID.

When you give the password to a customer, his password won't change until he changes his hardware.

Computer ID

To make a Computer ID, you must indicate the name of your application. That's because if you have used Trial Maker to make a trial for more than one application, each application will have it's own Computer ID. In the source, Computer ID = "BaseString"

Trial Maker uses management objects to get hardware information.

Serial

The password will be produced by changing the Computer ID. To make a password, you must have your own identifier. This identifier is a 3 character string. None of characters must be zero.

Files

There are two files to work with in this class.

The first file is used to save computer information and remaining days of the trial period. This file must be in a secure place, and the user must not find it (RegFile). It's not a bad idea to save this file in application startup directory

The second file will be used if the user registers the software. It will contain the serial that the user entered (HideFile). You can save HideFile in, for example, C:\Windows\system32\tmtst.dfg. I mean some obscure path.

Both files will be encrypted using Triple DES algorithm. The key of encryption is custom. It's better you choose your own key for encryption.

How it works

Getting System Information

SystemInfo class is for getting system information. It contains the GetSystemInfo function. This function takes the application name and appends to it the Processor ID, main board product, etc.

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();
}

Then it removes unused characters from the string. Any characters outside the range A to Z and 0 to 9 are unused characters. If the string isn't long enough, call GetSystemInfoAgain to make it longer.

RunQuery function takes object name (TableName) and method name and returns defined method of first object

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 "";
}

Once we have system information, we must make a Computer ID (BaseString) from it.

Making Computer ID (BaseString)

C#
private void MakeBaseString()
{
    _BaseString = 
        Encryption.Boring(Encryption.InverseByBase(
            SystemInfo.GetSystemInfo(_SoftName),10));
}

To make BaseString, first we get system information, and then use Encryption.InverseByBase and Encryption.Boring.

InverseByBase: Encryption.InverseByBase("ABCDEF",3) will return CBAFED; it's so simple - it's inversing every 3 characters

Boring: move every character in the string with the formula:

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

Making Serial key (Password)

We use Encryption.MakePassword. this function takes BaseString and Identifier. It uses InverseByBase 3 times and Boring once, and then use ChangeChar function to change characters

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();
}        

Check Password

After making BaseString and password, check if the user already registered the software. To do this, use CheckRegister Function. It will return true if registered before and false if not.

If CheckRegister returns false, open a registration dialog for the user to enter the password.

Show Dialog

Create new frmDialog and show it to the user. If the dialog result is <code>OK, it means software is registered successfully, and if it is Retry, it means it is in trial mode. Any other DialogResult means cancel. The Dialog class takes BaseString, Password, days to end and Run times to end as arguments.

Reading And Writing Files

There's a class named FileReadWrite. This class reads / writes files with Triple DES encryption algorithm.

FileReadWrite.WriteFile take a 2 strings. The first one is the file path and the second one is the data to write. After writing all data it write byte 0 as finish. It will use for reading

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();
}

The key for writing and reading is the same one, it's custom and you can change it.

How To Use

Where to use

The best place that you can check for registration is before showing the main dialog. When you have created a Windows application project, first you must add SoftwareLocker.dll as reference

Then in program.cs, find the main function. I think it's the best place for checking registration. You can check registration when your main dialog loads, but before loading is better.

Change Main Dialog

It's better to add one argument to your main dialog constructor. A Boolean value that indicates that this is a trial or a full version running. If it's a trial mode, disable some parts of your application as needed.

How to change main()

Add namespace

C#
using SoftwareLocker;
C#
[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));
    }
}

Don't move first two lines, after them, define TrialMaker class

Constructor

  • SoftwareName: Your software's name, this will be used to make ComputerID
  • RegFilePath: The file path that, if the user entered the registration code, will save it and check on every run.
  • HiddenFilePath: This file will be used to save system information, days to finish trial mode, how many other times user can run application and current date.
  • Text: It will show below the OK button on the Registration Dialog. Use this text for your phone number, etc.
  • DefaultDays: How many days the user can run in trial mode.
  • DefaultTimes: How many times user can run the application.
  • Identifier: Three character string for making password. It's the password making identifier

Optional and recommended

In the constructor, you can change the default Triple DES key. It's a 24 byte key, and then you can customize Management Objects used to make the Computer ID (BaseString):

C#
t.UseBiosVersion = false // = true;

You can do this with any t.UseXxx

Don't disable all of them or none of them, enabling 3 or 4 of them is the best choice. Or you can leave it as its default.

Serial Maker

Serial maker is another application that uses the Encryption class. It takes your identifier and generate a password (serial key)

Doesn't contain anything special.

Other Controls

In the registration dialog, I have used a SerialBox control. It's only 5 text boxes that you can write your serial in.

SerialBox uses FilterTextBox itself.

Both of these controls are available to download.

Notes

  • All codes are written in Visual Studio 2005
  • Serial Maker uses Encryption class from Trial Maker as a file link
  • Writing with one encryption key and reading with another will cause an exception
  • FilterTextBox Control is not the same that I wrote before in my articles
  • Always Secure your identifiers and don't lose them

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Iran (Islamic Republic of) Iran (Islamic Republic of)
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
Questionno encryption file in serial maker zip Pin
jagathks294-Jan-23 19:58
jagathks294-Jan-23 19:58 
QuestionReference to object not established as an instance of an object Pin
Member 1109714718-Jul-20 9:01
Member 1109714718-Jul-20 9:01 
QuestionIntegration Pin
Member 145959938-Jan-20 5:20
Member 145959938-Jan-20 5:20 
Questionhelp for using Pin
Member 1466734725-Nov-19 0:50
Member 1466734725-Nov-19 0:50 
QuestionThe debug EXE does not seem to run on Windows 10 Pin
Andrew Truckle10-Oct-19 6:47
professionalAndrew Truckle10-Oct-19 6:47 
AnswerRe: The debug EXE does not seem to run on Windows 10 Pin
Member 1468881413-Dec-19 7:23
Member 1468881413-Dec-19 7:23 
GeneralRe: The debug EXE does not seem to run on Windows 10 Pin
Member 26642467-Nov-21 21:34
Member 26642467-Nov-21 21:34 
QuestionReference to object not established as an instance of an object. Pin
Alberto_Ojeda21-Aug-19 7:47
Alberto_Ojeda21-Aug-19 7:47 
AnswerRe: Reference to object not established as an instance of an object. Pin
adnanetf28-Jan-20 10:29
adnanetf28-Jan-20 10:29 
QuestionNeed Class Files Pin
Madhu Chatterjee20-Aug-19 20:56
Madhu Chatterjee20-Aug-19 20:56 
QuestionVisual Basic 6.0 trial form Pin
Member 1454567630-Jul-19 9:46
Member 1454567630-Jul-19 9:46 
AnswerRe: Visual Basic 6.0 trial form Pin
OriginalGriff30-Jul-19 9:49
mveOriginalGriff30-Jul-19 9:49 
Questionhardware change issue.. Pin
mazin_alyousef14-Jul-19 20:17
mazin_alyousef14-Jul-19 20:17 
QuestionI need your help Pin
Xuân Anh Thái23-Jun-19 16:47
Xuân Anh Thái23-Jun-19 16:47 
SuggestionExelent. Thanks so much Pin
ATIF SEÇGİNLİ2-Apr-19 23:31
ATIF SEÇGİNLİ2-Apr-19 23:31 
QuestionExcelent! Pin
Member 1164059131-Dec-18 15:44
Member 1164059131-Dec-18 15:44 
QuestionTrialMaker Pin
Member 1032224625-Sep-18 22:04
Member 1032224625-Sep-18 22:04 
PraiseIt's works very well. Pin
TonyPerco19-Sep-18 4:50
TonyPerco19-Sep-18 4:50 
QuestionExcellent App!!! Pin
Member 1371609613-Aug-18 20:50
Member 1371609613-Aug-18 20:50 
Questionbug same license on each device Pin
Member 1311999927-May-18 2:24
Member 1311999927-May-18 2:24 
QuestionExcellent App Pin
Member 559312818-May-18 8:24
Member 559312818-May-18 8:24 
Questionthanks Pin
Member 1369148622-Feb-18 8:40
Member 1369148622-Feb-18 8:40 
PraiseThanks, Ferfect tool! Pin
Member 1295444814-Jun-17 4:19
Member 1295444814-Jun-17 4:19 
Questionencrypted log file Pin
kefalas_savvas@yahoo.com18-May-17 0:46
kefalas_savvas@yahoo.com18-May-17 0:46 
QuestionAdding an option for multiple license (features) Pin
Prakash12066-Jul-16 16:55
Prakash12066-Jul-16 16:55 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.