Well the short answer is, you can't prevent it at all.
At some point, the protection code will essentially boil down to
All your enterprising cracker has to do is turn this into
if generatekey(MAC) equals registrationkey then doTheGoodStuff();
At the machine level, this is simply a matter of replacing say "BEQ" (branch if equal) with "BNE" (branch if not equal).
if generatekey(MAC) does not equal registrationkey then doTheGoodStuff();
What you really need to watch out for is creating a $1000 lock for a $10 item. All the time you're spending on improving the protection is time NOT spent on improving the product (so that more people might be more inclined to buy it to begin with).
Consider some alternatives where registration brings some additional benefits which are not solely dependent on just having the software.