Se puede leer la memoria de programa aún si está protegida por los configuration bits (fuses) pero sólo puede ser leída por el mismo CPU del PIC y no por ningún programador externo (ICSP).
Esto hablando de PIC18 en adelante. Puedes poner una contraseña y si el usuario mediante alguna conexión externa (RS232, SPI, I2C, etc.) atina a la contraseña, entonces el PIC leerá su memoria de programa y la podrá enviar por el mismo medio.