Hola giulichari,
Yo aun estoy aprendiendo Builder C++, pero te diré lo que uso para proteger mis programas... como son programas muy muy pero muy especiales los debo proteger...
Lo que hago es tomar la Fecha de Bios de la PC, y la combino con las caracteristicas del procesador; La ventaja de usar estos datos es que si por algun motivo el usuario Final llegara formatear su disco duro o cambiarlo -cosa muy comun en estos dias, dada la cantidad de virus, gusanos que existen

-... el programa ejecutable aún funcionará luego del formateo... incluso cambiando el S.O., cosa que no sucedera con la serial del disco duro...
Eso si, en ninguna parte uso ningún IF o algo que haga comparaciones y menos le pongo ventanitas con "Usuario No Registrado" o algo así... en lugar de eso simplemente hago que el programa funcione relativamente bien hasta cierto punto... y luego desencadeno timmers, altero variables aleatoriamente hasta que el programa mismo caiga en error... algo así como "numero/0", Salirse de determinado array al recorrer el tamaño etc,etc...
Por otro lado, me di cuenta que "proteger un programa al máximo", no es la mejor solucion para proteger programas;(valga la redundancia) la mejor manera de proteger un programa.. a mi humilde modo de ver, es procurar actualizar lo más periodicamente posible el ejecutable del usuario final... Puesto que entendiendo la relacion "Programador-Usuario" en programación nunca hay un "Programa Terminado".. solo existen los "Programa Entregado" o "Programa Vendido" o "Programa Mejorado"... pero nunca uno "Terminado"..
Siguiendo esa linea, siempre incluyo información de contacto personal en mis programas, y con todo esto puedo conseguir dos cosas: Publicidad Gratuita y que el usuario le de una "mordida" a la crema antes de comprar la torta...(programa)...
(Quise contestar con 5 o 6 palabras, pero creo que me extendi un poco)
Un Saludo.