Registration mechanism

zhaozj2021-02-08  210

Now, I have time to pay attention to the software piracy problem, I will describe my registration method, I hope to help you.

For a few years, I have had a lot of programs, some simple, some are complex, and their purpose is to prevent illegal use of software. These methods include two types: hardware methods and software methods. Hardware methods are generally used in pairing equipment (software dogs) or an inexpensive floppy disk (dial). But I still like the software method!

Of course, there are many ways to provide registration protection, such as purchasing third-party protection software, but I want to try to develop my own way, because I want to figure out this problem.

Before discussing, I slightly tent much about my previous methods.

The most secure and unsafe way is to provide two versions: trial and full version. When the user registers your software, they get a URL to download the full version. The full version is not restricted, so the software is illegally used in full dependence on the user's honesty, the only constraint is to use the registered user to get technical support. I don't use this method, because there are too many dishonest users around, it will cause too little registration.

The next method is to provide a registration code generated by the user name (optional). Now the software can be used for registered users. Users can use software to others, but usernames and company names cannot be modified.

Finally, it is the improvement of the previous method. The registration code is still based on the version number, and the user can continue to use the old registration code to make a small upgrade, but the big change in the version requires the user to register again. Of course, you can pay for the upgrade of the user, but this is a solution that can be selected.

My way is to print and display the last username and company name on the report. In the company's name, there is a company name printed on the invoice, so that even if the illegal user has my program, he cannot be used.

Now, the problem becomes: generates a unique value based on a string, as long as the string changes, it will cause the code to operate a different value.

The solution is to use the program name, username, company name, and version number as an arithmetic string. If you do not enter your company name, use the default value instead, the problem is to cause the program to be mixed.

I am an electronic engineer that requires a method in the communication industry to determine the transferred data is incorrect, and the general method is CRC. CRC has been used for 20 years, I don't know the exact time of CRC, but I know that it has been working very well. If you want to know more knowledge of the CRC, please refer to the 'A PAINLESS GUIDE TO CRC ERROR DETECTIONALGORITHMS', Author: Ross N. Williams, download address: http: //www.ross.net.

So I use 32-bit CRC algorithm to draw 8-bit registration code, there is a problem: if any encryption is not done, if it is used for arithmetic strings, it is too simple. So I encrypt the string using Delphi's encryption process, and then the string used for operation is sufficiently complex.

I didn't do a complete test, I only made a partial test, but I assured that the code is effective, especially to remind: the CRC structure is based on the Polynomial Modulo algorithm, do not modify it.

I may be very benzene, but I am not stupid :). The following code is not what I am using, but these codes are very good to demonstrate how my registration method works.

Let us look at the code.

Please note: I use the prefix (Camelcase (SiC)), the following is the definition:

C: Character type N: Digital D: Data T: Date / Time Y: Glow L: Logical

Parameter range: P: Parameter G: global variable

Others meet the above rules. All functions and processes are prefixed in 'ssl' to avoid reinasses with other functions and process. This prefix has been registered in Delphi Prefix Register.

Unit registration;

{------------------------------------- -----------------------------} Interface

Uses sysutils;

Function Mod95 (PNVAL: Integer): Integer; Forward;

Function sslencode (pccompany: string; pcApptitle: string; pcmajor: string): string; forward;

Function SSLGenerateKey (PcName, Pccompany, PcApplication, PCMAJOR: STRING): STRING; Forward;

Function SSLCrypt (PCString: PCHAR; PNSEED: Integer = 0): String; Forward

Function CRCEXECUTE (PCString: String): String; Forward;

VAR GNKEY: Integer; Gnsalt: integer;

{------------------------------------- ----------------------------} Implementation

Const null_string = '';

const CRCTable: array [0..255] of LongWord = ($ 00000000, $ 77073096, $ ee0e612c, $ 990951ba, $ 076dc419, $ 706af48f, $ e963a535, $ ​​9e6495a3, $ 0edb8832, $ 79dcb8a4, $ e0d5e91e, $ 97d2d988, $ 09b64c2b $ 7eb17cbd, $ E7B82D07, $ 90BF1D91,

$ 1db71064, $ 6ab020f2, $ f3b97148, $ 84be41de, $ 1adad47d, $ 6ddde4eb, $ f4d4b551, $ 83d385c7, $ 136c9856, $ 646ba8c0, $ fd62f97a, $ 8a65c9ec, $ 14015c4f, $ 63066cd9, $ fa0f3d63, $ 8d080df5,

$ 3b6e20c8, $ 4c69105e, $ d56041e4, $ a2677172, $ 3c03e4d1, $ 4b04d447, $ d20d85fd, $ a50ab56b, $ 35b5a8fa, $ 42b2986c, $ dbbbc9d6, $ acbcf940, $ 32d86ce3, $ 45df5c75, $ dcd60dcf, $ abd13d59,

$ 26d930ac, $ 51de003a, $ c8d75180, $ bfd06116, $ 21b4f4b5, $ 56b3c423, $ cfba9599, $ b8bda50f, $ 2802b89e, $ 5f058808, $ c60cd9b2, $ b10be924, $ 2f6f7c87, $ 58684c11, $ c1611dab, $ b6662d3d,

$ 76dc4190, $ 01db7106, $ 98d220bc, $ efd5102a, $ 71b18589, $ 06b6b51f, $ 9fbfe4a5, $ e8b8d433, $ 7807c9a2, $ 0f00f934, $ 9609a88e, $ e10e9818, $ 7f6a0dbb, $ 086d3d2d, $ 91646c97, $ e6635c01, $ 6b6b51f4 , $ 1c6c6162, $ 856530d8, $ f262004e, $ 6c0695ed, $ 1b01a57b, $ 8208f4c1, $ f50fc457, $ 65b0d9c6, $ 12b7e950, $ 8bbeb8ea, $ fcb9887c, $ 62dd1ddf, $ 15da2d49, $ 8cd37cf3, $ fbd44c65,

$ 4db26158, $ 3ab551ce, $ a3bc0074, $ d4bb30e2, $ 4adfa541, $ 3dd895d7, $ a4d1c46d, $ d3d6f4fb, $ 4369e96a, $ 346ed9fc, $ ad678846, $ da60b8d0, $ 44042d73, $ 33031de5, $ aa0a4c5f, $ dd0d7cc9,

$ 5005713c, $ 270241aa, $ be0b1010, $ c90c2086, $ 5768b525, $ 206f85b3, $ b966d409, $ ce61e49f, $ 5edef90e, $ 29d9c998, $ b0d09822, $ c7d7a8b4, $ 59b33d17, $ 2eb40d81, $ b7bd5c3b, $ c0ba6cad,

$ Edb88320, $ 9abfb3b6, $ 03b6e20c, $ 74b1d29a, $ ead54739, $ 9dd277af, $ 04db2615, $ 73dc1683, $ e3630b12, $ 94643b84, $ 0d6d6a3e, $ 7a6a5aa8, $ e40ecf0b, $ 9309ff9d, $ 0a00ae27, $ 7d079eb1,

$ F00f9344, $ 8708a3d2, $ 1e01f268, $ 6906c2fe, $ f762575d, $ 806567cb, $ 196c3671, $ 6e6b06e7, $ fed41b76, $ 89d32be0, $ 10da7a5a, $ 67dd4acc, $ f9b9df6f, $ 8ebeeff9, $ 17b7be43, $ 60b08ed5,

$ D6d6a3e8, $ a1d1937e, $ 38d8c2c4, $ 4fdff252, $ d1bb67f1, $ a6bc5767, $ 3fb506dd, $ 48b2364b, $ d80d2bda, $ af0a1b4c, $ 36034af6, $ 41047a60, $ df60efc3, $ a867df55, $ 316e8eef, $ 4669be79,

$ Cb61b38c, $ bc66831a, $ 256fd2a0, $ 5268e236, $ cc0c7795, $ bb0b4703, $ 220216b9, $ 5505262f, $ c5ba3bbe, $ b2bd0b28, $ 2bb45a92, $ 5cb36a04, $ c2d7ffa7, $ b5d0cf31, $ 2cd99e8b, $ 5bdeae1d,

$ 9b64c2b0, $ ec63f226, $ 756aa39c, $ 026d930a, $ 9c0906a9, $ eb0e363f, $ 72076785, $ 05005713, $ 95bf4a82, $ e2b87a14, $ 7bb12bae, $ 0cb61b38, $ 92d28e9b, $ e5d5be0d, $ 7cdcefb7, $ 0bdbdf21,

$ 86d3d2d4, $ f1d4e242, $ 68ddb3f8, $ 1fda836e, $ 81be16cd, $ f6b9265b, $ 6fb077e1, $ 18b74777, $ 88085ae6, $ ff0f6a70, $ 66063bca, $ 11010b5c, $ 8f659eff, $ f862ae69, $ 616bffd3, $ 166ccf45, $ a00ae278 , $ d70dd2ee, $ 4e048354, $ 3903b3c2, $ a7672661, $ d06016f7, $ 4969474d, $ 3e6e77db, $ aed16a4a, $ d9d65adc, $ 40df0b66, $ 37d83bf0, $ a9bcae53, $ debb9ec5, $ 47b2cf7f, $ 30b5ffe9,

$ Bdbdf21c, $ cabac28a, $ 53b39330, $ 24b4a3a6, $ bad03605, $ cdd70693, $ 54de5729, $ 23d967bf, $ b3667a2e, $ c4614ab8, $ 5d681b02, $ 2a6f2b94, $ b40bbe37, $ c30c8ea1, $ 5a05df1b, $ 2d02ef8d);

{------------------------------------- -----------------------------} Function Sslencode (PcName, Pccompany, PcApptitle, Pcmajor: String): string; begin {encrypt the data using the major version number to seed the encryption routine} SSLCrypt (NULL_STRING, StrToIntDef (pcMajor, 0)); SSLCrypt (PChar (pcAppTitle)); SSLCrypt (PChar (pcName)); Result: = SSLCrypt (PChar (pcCompany)) ;

{------------------------------------- -----------------------------} Function SSLCrypt (pcstring: pchar; pnseed: integer = 0): String; var nstringlen, ncharcount : INTEGER; NCHER: BYTE; CCHAR: CHAR; Begin NStringlen: = Length (pcstring); if nstringl; = 0 The begin gnkey: = PNSEED; gnsalt: = pnsEed * 100; Else Begin Result: = '; for ncharcount: = 0 to nstringlen - 1 do begin cchar: = pcstring [ncharcount]; {online ")} = ((cchar> = ') and (cchar <=' ~ ')) THEN BEGIN GNKEY: = (GNKey And $ 1fffffff) XOR ((GNKEY SHR 29) and $ 31); nchar: = byte (cchar); NCHERIM: = Mod95 ((GNKEY DIV 95) - (Nchar - 32)) 32; Inc (gnsalt); IF Gnsalt> = 20857) THEN GNSALT: = 0; gnkey: = gnkey gnkey (ninter nchar) gnsalt; result: = Result char (ninterim); end; end; end; end; { -------------------------------------------------- -------------------------} function mod95 (pnval: integer): integer; begin result: = pnval; while (result> = 9500) DO RESULT: = Result - 9500;

While (result> = 950) Do Result: = Result - 950;

While (result> = 95) Do Result: = Result - 95;

While (Result <0) Do Result: = Result 95; End;

{------------------------------------- -----------------------------} Function SSLGenerateKey (PcName, Pccompany, PcApplication, PCMAJOR: STRING): String; Var CKey: String Begin ckey: = PcName Pccompany PcApplication PcMajor SSLENCODE (PcName, Pccompany, PcApplication, Pcmajor); Result: = CRCEXECUTE (CKEY); End; {--------------- -------------------------------------------------- -------------} function crcexecute (pcstring: string): string; var nx: integer; ncrcval: longword; begin ncrcval: = 0; for nx: = 1 to length (pcstring) DO Ncrcval: = crctable [Byte (pcrcval xor byte)] XOR (Ncrcval SHR 8) and $ 00ffff); Result: = LowerCase (INTTOHEX (Ncrcval, 8));

{------------------------------------- -----------------------------} end.

I wrote a registration machine to demonstrate how to work, of course, you should modify it to suit your needs.

To use my registration mechanism in your software, you need to include Registration.Pas Unit and all needs in the project. My check method is to read into the username, company name, and registration code from an ini file. If it is empty, the software prompts a dialog to prompt the user to register, then calculate the registration code and compare the registration code entered by the user. If the user confirms, save the information into the INI file and proceed. Thereafter, all places involving the username and the company name are re-acquired. If INI file is not empty, I will calculate it to confirm that it is correct.

转载请注明原文地址:https://www.9cbs.com/read-3229.html

New Post(0)