Yes, all such systems can be circumvented, but the pragmatic approach used by most vendors is to make it complex enough for honest, honest people. A popular approach is a license key with a name, license type, and date. A common way of doing this is to check the partial key:
http://www.brandonstaggs.com/2007/07/26/implementing-a-partial-serial-number-verification-system-in-delphi/
(quick google will find other implementations and patterns, but Brandon is well known)
Using the PKV approach, you can change tests in new software versions without canceling old keys. You will want to do this when your system is hacked (and it will be hacked!). Likewise, it is a good idea to keep a list of hacked keys so that they can automatically expire in future versions of your program.
winwaed
source share