На стойкость не претендую, решение из собственного опыта:
1) организовываем защищенное хранилище (напр, зашифрованный файл), который нельзя просто так прочесть и поменять - в нем мы будем хранить, сколько времени программе осталось работать, т.е. временной ресурс;
2) придумываем, как этот файл генерировать - создавать самой программой при отстутствии этого файла - плохая идея, т.к. юзер просто удалит его и триал сбросится. Неплохой вариант - генерить на сервере, сделать эдакий "запрос триальной лицензии"; после установки лицензия запрашивается, далее с этим файлом работает сама программа;
3) при каждом запуске файл читаем (с расшифровкой), смотрим сколько лицензированного времени осталось, ставим таймер (системное время использовать нельзя!), каждые N секунд вычитаем лицензированное время, обновляем файл. 30-60 секунд обычно вполне достаточно. Погрешность счета времени соотв. тоже будет до N секунд. Теоретически, каждые N-1 секунду прогу можно убивать и перезапускать, и тогда она не будет успевать вычитать счетчик времени, но я сомневаюсь, что в таких условиях программой вообще можно будет пользоваться.
Довольно нелохой вариант, если конечно на взлом вашего софта не претендует толпа людей, умеющих дебажить в Olly с закрытыми глазами.
А, ну да, и упаковщик какой-нибудь возьмите - еще немного усложните жизнь (хотя не сильно конечно).