Lo mejor seria una vercion limitada de tu programa
En el underworld lejanamente se crackea a travez del registro, y eso e por que la forma de proteccion de tiempo es robusta, por lo normal se intruducen valores binarios con la fecha de instalacion o primera ejecucion, despues se evalua cada vez que el programa inicia y se compara con la fecha de sistema y cada vez que el programa inicia se actualiza la clave de registro con lo dias transcurridos, de esta forma si se adelanta o atrasa el relog de sistema las fechas no concordarian con la fecha grabada y esto se mantiene un record que deshabilita las funciones del programa o la ejecución.
Y si piensas poner nag's de advertencia o avisos es muy mala idea ya que es cosa de niños quitarlas, por el contrario si colocas un codigo de proteccion es muy facil encontrarlo usmeando en la memoria, y aún cuando cualquiera de estos metodos fuera descartado estan los loader's que cargan todo el programa omitiendo las resticciones.
Los programas que se usan comunmente para crackear a travez de registro son el filemon o regemon, win-eXpose registry etc.
La mejor proteccion es un buen empaquetado y encryptado a travez de assambler de alta calidad, de esta forma los debugs y los traceos se vuelven impocibles,(auque siempre hay un genio
)
Ademas de que editar el ejecutable es impocible mientras no se desempaquete, en algunos lenguajes solidos como delphi o c++ el crackeo no es para newis ya que por si solos ofrecen seguridad al ser un poco complejo el debug, por otro lado si usas basic o visual c de microsoft estas perdido estos lenguales son crackeables hasta por mi abuelita.
Existen compresores hechos por ""colegas"" que ofrecen mucha seguridad y que no tienen descompresion sencilla, se necesitan horas en el debug para el desempaquetado.
En conclusion usa ejecutables PE con una comrpecion y encrypción robusta en un leguaje macizo.
Usa claves de registro ubicadas en hkey classes root, no en tu aplicacion(Sotware) ya que el tracear esta ubicación es muy complejo ya que todo el tiempo esta enviando y recibiendo informacion.
Neutraliza tu aplicacion sin avisos (nag's) muy vistosos y coloca el codigo del aviso de preferencia como RCData para que sea aun mas complejo sacar las referencia de texto.