Antes que nada, quiero dejar claro que lo que dice Diego es bastante cierto. Pero por supuesto se han intentado varios métodos.
Uno de los más sencillos consiste en hacer que tu programa dependa, en una u otra forma, de un archivo con información funcional del programa. Este archivo debe ser distinto del ejecutable.
Una vez que lo tienes así, la protección consiste en marcar en la FAT uno o más sectores (casi siempre el final del archivo) como dañado.
De esta manera, el sistema no tendrá inconvenientes al cargar tu archivo en memoria (no hay sectores dañados en él), pero al intentar copiar el archivo de datos, se obtiene un mensaje de error porque el sistema no chequea que la información en la FAT sea válida.
Después es fácil pensar que el usuario vaya a corregir ese "error" con el Scandisk o algún software por el estilo, pero si haces que tu ejecutable chequee si el sector número nn esté roto, se acabó el problema.
Espero te sirva y mucha suerte!!!