I use EXECryptor to protect and compress ( http://www.strongbit.com ). It will prevent reverse engineering of an executable. According to the crackers over at http://forum.exetools.com, nobody has broken the encryption yet. I tried using the registration key feature of EXECryptor, but it was cracked pretty quickly. Now I just gut the demos by removing a lot of code, then encrypt them.
you are doing your customers such a disservice by releasing demos and then still using this cpu cycle eating monster. i mean if you truly remove key functions in your code then what's the point of using a protector compressor?
let me explain something about execryptor. first, it IS a very clever protection i have to admit. but for god sakes, don't you know it runs multiple threads watching for debuggers etc? not to mention how it creates, on demand, the import pointers it uses. and of course it doesn't really encrypt anything, it just obfuscates the hell out of the functions you want protected (which i guess is a form of encryption?). it does this by taking a normal small < 100 byte asm function and turns it into multiple thousands of bytes. when it's all done it then compresses the whole thing. if you were using this protector back in the old days you'd definintely see a difference in speed. i guess we all take advantage of the fact that new processor speeds all but hides these overactive protectors.
also, execryptor is not at all impervious to being cracked. believe me, i've seen it done
what do you gain from having yet another crackable protector/compressor that uses up more cpu cycles than your original app ever should have? not much i guess.
anyway, for these reasons i'd never use execryptor.
if you want good, solid compression, i'd stick with pecompact or upx.
if you want a step up for protection, then i'd go with asprotect (altho i don't like how it allocates so much memory to emulate api calls). but it's generally not that obtrusive, has quick decompression and solid function encryption.
armadillo is also a good protector, but too much overhead for my taste (actively debugging your app while running).
...there you go, my 2 cents