Как вариант, сделать лаунчер и DLL, в которой и будет сама программа. Лаунчер отправляет запрос на сервер, где происходит проверка подлинности ключа и сроков лицензии и в случае, если всё корректно, на клиент отсылается зашифрованная библиотека (DLL), которая посредством manual map injection встраивается в память (если библиотека была зашифрована, не забудьте расшифровать), создаётся поток и производится выполнение кода.
Плюсы:
- Обновляя библиотеку на сервере, она также будет обновляться у всех юзверей после перезапуска;
- Взломать лицензию будет не так просто, поскольку предоставление доступа к функционалу происходит не на клиенте, а на сервере.
Минусы:
- Постоянная загрузка с сервера;
- Возможно, для вас будет немного сложно реализовать этот алгоритм;
- Даже несмотря на эти ухищрения, всё равно будет возможность сдампить всё, только на это уйдёт некоторое время и силы.