mikejmoffitt wrote:
Scramble opcodes in your game, and also the emulator. Maybe give it an iNES header that is invalid, knowingly substituting correct mapper behavior later. Change the addresses used to interact with the PPU. Make it run on a "screwed up NES!"
I had a similar idea for a project I did a while back. Though I stripped the emulator down to only be able to support my ROM and XOR encoded all memory (because any kind of strong encryption would be a waste of time, as you'd have to leave the key in the executable anyway), both the ROM and in-use memory. I also considered recompiling parts of the ROM into native code, but I figured the task would then be quite large for relatively little benefit. My ROM relied upon some "system calls" implemented in the emulator anyway, so it'd be rather difficult to extract the ROM and use it anywhere else anyway. I also scrambled the opcodes by modifying the assembler, and I worked on having a different set of scrambled opcodes per instance of the executable as a kind of a watermark. Needless to say, I eventually grew bored and the project now rests in procrastination hell.
What I'm getting at is, my recommendations are pretty much the same: Modify the ROM and emulator to rely on one another. Scramble opcodes. XOR encode all memory.
With that said, the bigger issue here is probably that most well known emulators are released under GPL, which makes all of this effort to obfuscate the ROM and inner workings of the emulator a waste. You'd have to find an emulator with a more permissive license and modify that, which may require reworking the interface of the emulator and adding support for more platforms and input devices. I'm not too familiar with how well the permissive licensed emulators are implemented.