Early EA games eg: Arctic Fox used a compiled decrypting loader that is very tough to crack. In fact, anything not written directly in assembly language is tricky as a rule.
The Zeewolf 1 & 2 manual protection was hard to remove properly. The menu and mission brief sequence is run by a scripting system so I had to understand that to remove the part of the script that went to the manual protection.
MegaTwins kept re-loading the code so I had to keep re-patching the trackloader and trainers every time something was loaded. More annoying than difficult I suppose
Manic Miner had something like 12 loadable sections that all had to be individually cracked and patched. Very annoying!