The date in the MSF file is not the end-of-month, but the last trading day of each month. To avoid errors, I always reset the date when I open crsp.msf:
set crsp.msf(keep=permno date ret);
date=intnx('month', date, 1)-1;
Closing prices in the MSF and DSF files are negative if the price is not the price from an actual trade, but the average of bid-ask spreads. I always set prc=abs(prc) before I do anything else with prices.