There is no real protection against illegal reverse engineering, aka 'cracking' & 'hacking' because at the end of the day, the CPU still has to acess the instructions. However, you can make life absolute hell for anyone that wants to make sense of your app without your permission, waste there time, and by the end of it, they will give up. To protect against simple dissasmbly, all you have to do is find an exe packer/encrypter, either will do, and use it. The above method will still leave your code open to dumping once it has been loaded into memory. To really annoy someone make your code unorganised with lots of random jumps in it. Another thing is to jump into the middle of opcodes, for example:
can be disguised as:
mov eax,12345 mov ecx,34567 mov edx,23942
how? add an extra byte into the instruction stream, and jump over it.
00401000 EB01 jmp loc_00401003 00401002 EAB839300000B9 jmp B900:3039B8h 00401009 07 pop es 0040100A 8700 xchg ,eax 0040100C 00BA865D0000 add ,bh
This will 'disguise' things, but anyone smart will notice the jump into nowhere. Also you can implement some sort of runtime encryption/decrytion routines.
jmp @F BYTE 0eah @@: mov eax,12345 mov ecx,34567 mov edx,23942