When programming I would suggest using the dotfuscator. which I believe is to stop the program from being disassembled. That way no one can browse your code and use a hex editor to alter your program. Now if you want no one at all to crack your program it will be very difficult.

I have the following suggestions:

1. Add values to the registry for registration (this can be cracked if the user is smart and uses a program to monitor the registry)

2. Use a web service and control registration remotely.

3. Make a registration code based off of the computer name

4. Make a registration code based off of multiple hardware configurations

5. have your program compare the .exe to a remote .exe and lock it out if it comes back false.