Hmm.. interesting post.
Since you are absolutely fine with the hidden file approach, why not make it as part of the config file, if you have any. That is, put in an encrypted (perhaps XOR encryption) form of the initial date when the app ran for the first time. Everytime you start the app, you will look at that date and then decide on the expiration message. Likewise with the number of trials. In this case, you will update it accordingly.
Or embed the whole source code in your application and then when you are about to exit, recompile the code with the relevant information i.e. number of tries left or the remaining time for the app to run. This is easier said than done