- Laser off the part marking. Not knowing what a part is makes the job much more difficult
- One time programmable chips: can't modify or read off firmware if the JTAG bus is disabled
- Encrypted firmware: helps if someone is able to fuzz the chip to dump the firmware
- BGA parts: hide the pins, bury the traces. It makes the job harder but not impossible
- Programming before soldering: you can leave the programming pins disconnected so someone would have to remove the chip before attempting anything on it
- Use more advanced features of the chip: some chips offer secure memory locations that can contain decryption keys, magic numbers, whatever you want. You could have a magic number that you XOR with every literal. It would certainly make things more difficult to determine what is what in the assembly code if you could decrypt it
- Pour some epoxy over the chip or board: makes repairs impossible but also can screw over the reverse engineer.
- Work with a manufacturer to build a custom chip. You could do crazy things like move the programming pins around and hide them as other things. Like the JTAG test points would be random decoupling caps hidden in the board.
- Finally, threaten to sue anyone that publishes anything