People tend to only add in the protection at the last minute; rather than making it an integral part of the code.
I only ever came up against a few programs that I couldn't hack. It genuinely became easier when people would use an off-the-shelf "protect my program" toolkit; crack one and you'd cracked all programs using that family of protection.
It was rare that I couldn't register demo/eval copies of programs. Sure I know assembly, and used SoftIce, but we're talking about a random guy in his late teens/early twenties who mostly learned by trial and error with random hints from +fravia.
(ObRandom: I know it must be a pain as a developer, but the best way to stop people cracking your demo is literally to have two binaries. Genuinely don't compile "file:save" or whatever feature you're keeping for paid users, into your demo version. Sure this will stop instant registration, and it won't stop somebody from leaking a full version, but it will absolutely stop the majority of attacks.)