Independientemente de lo que haga, deberá almacenar una clave de cifrado en algún lugar, que luego podrá recuperar. Si necesita un servidor de licencias, esto podría solucionarse conectando o parcheando la aplicación. Puede hacer cosas como esta para ralentizar a un adversario, pero no será una protección completa. Si realmente no quiere entregar su software, use una arquitectura cliente-servidor con la mayor parte de la lógica en el lado del servidor y solicite la autenticación de un usuario pagado/autorizado (aunque entonces no puede evitar que el software del cliente ser copiado o modificado, pero eso es generalmente un riesgo aceptado).
Supongamos que quiero darle una computadora a alguien que ejecuta una aplicación. Quiero evitar que el programa pueda ser copiado a otra computadora o manipulado.
Hay herramientas disponibles comercialmente que harán esto por usted. Como ha sospechado, no existe una solución a prueba de balas que un adversario dedicado no pueda romper. Pero, en la práctica, hay ofuscadores disponibles comercialmente que pueden ser "suficientemente buenos" para sus propósitos.
Las herramientas disponibles comercialmente también pueden vincular el software a un hardware dado tomando una "huella digital" del hardware. Una vez más, esto es probablemente falsificable con suficiente trabajo, pero podría ser "lo suficientemente bueno" para sus propósitos.
Un ejemplo de una herramienta comercialmente disponible es ".NET Reactor" (https://www.eziriz.com/dotnet_reactor.htm) que se usa con el software Windows .NET. Puede ofuscar el software para frustrar la ingeniería inversa y puede vincular el software a un hardware específico mediante un método de huellas dactilares de hardware.
He visto una estrategia que no es infalible, pero si lees ID de hardware únicos y los usas como clave para descifrar el software, si se mueve a otra máquina, no se descifrará.
El único problema con esto es que la mayoría de esos valores se pueden sobrescribir y si el atacante sabe de qué hardware se derivan estos valores, y reproducirlos para 'desbloquear'/descifrar el software de manera efectiva.
Además, tiene un problema si parte de ese hardware falla y se reemplaza, ahora debe cortar el software nuevo, encriptado con la nueva combinación de ID de hardware para el hardware nuevo/reemplazado.