My "solution" is founded on the idea of keeping some extra numbers in the database: SerialNo, UseCount and UseMax. Every time the customer uses the program, UseCount is incremented. When UseCount reaches UseMax, then the program won't run. But whenever the customer pays the monthly fee, the UseMax is incremented so that if the customer pays properly, the program runs forever.
The only technical problems are 1) How to ensure the customer does not tamper with the database, for example manually updating UseMax and 2) How to generate a monthly password for the customer to apply to increment the password.
1) Create a checksum of the database and encrypt it and append it to the database. On startup, the program will refuse to run if the encrypted checksum is incorrect. So the customer cannot change anything in the database without stopping the program.
2) The customer selects a "make payment now" option. The program generates an encrypted version of the SerialNo, UseCount and UseMax which the customer transmits along with payment. The vendor cashes the payment and then runs a companion program which will generate data to be transmitted back to the customer. The customer selects an option to enter this data and the program updates UseMax.
I just realized that although this solution will work perfectly well for the challenge, the person who had the original need was referring to a program that does NOT have a database. So, unfortunately, it is a waste of time to code up the solution unless someone else is interested. Until and unless someone expresses such an interest, I quit because I cannot think of any other way that is foolproof. Your analysis of methods depending on the date/time is pretty convincing. As you said, the only hope is that the criminal user would goof sooner or later. :-(