Можно использовать аналог DRM. Например, при установке программы генерировать пару открытый-закрытый ключ, шифровать закрытым ключом ключевые файлы программы (например, библиотеку, ответственную за вызов платных функций или основное приложение, если используется лаунчер для его запуска). После установки юзер должен соединиться с сервером, предъявить свой открытый ключ и зарегистрировать его (это можно и автоматически делать используя, например, фингерпринт устройства). Ввод кода лицензии на стороне клиента говорит серверу, что этот код сопоставляется этому открытому ключу.
Стоимость реверса такой защиты - оверпрайс почти для любого приложения. Однако и с разработкой тоже намучаешься. Особенно с обновами. Если твой проект уровнем ниже, чем игра, которую ждут миллионы, за взлом которой много платят и собирают даже донаты на взлом - вряд ли за ее реверс возьмётся грамотный инженер, которому по силам выудить ключ из оперативы после использования, сопоставить его, и выложить точную копию ПО (конкретно эту копию с его ПК) и лицензионный ключ. И даже при такой схеме все это перекроет фингерпринт. Однако при использовании фингерпринта если есть юзер, который меняет ПК со своей лицензией, то уже не выйдет самостоятельно без техподдержки это сделать даже при копировании со старого всех файлов и ключей реестра, т.к. у тебя на сервере нужно отвязать лицензию от фингерпринта
P.S. забыл добавить. При таких раскладах все вычислительные мощности возложены на юзера, а проверка лицензии - жалкие килобайты трафика