You can define cron schedule attributes using an overload that takes lambda expression:
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.WithCronSchedule("0 0 4 1 * ?", x => x.WithMisfireHandlingInstructionFireAndProceed())
.Build();
Quartz detects misfires by checking whether next scheduled time in database is in the past. For the scenario to work you need to use the persistent storage like you already are doing.
The fire times are stored in table QRTZ_TRIGGERS in columns NEXT_FIRE_TIME and PREV_FIRE_TIME. These values are .NET DateTime tics.