The win was the third straight for the Canadiens (32-21-6), who lost leading goal scorer Max Pacioretty in the first period.
Pacioretty, who is slated to represent the United States at the 2014 Sochi Olympics, left the game with 7:30 remaining in the first period after being checked into the goal post. Hurricanes defenseman Brett Bellemore hit Pacioretty as he tried to cut from the goal line to the front of the net.
The 25-year-old forward appeared to hit his leg and forearm on the post. He immediately grabbed his arm and remained face-down on the ice for a couple minutes before slowly making his way to the dressing room under his own power.
The Canadiens announced in the second period that Pacioretty sustained a lower-body injury, and he did not return. He has 26 goals and 37 points in 50 games.
Carolina struck first at 5:42 of the second period when Drayson Bowman one-timed a shot from above the right circle past Price.
Montreal countered with two goals 85 seconds apart to take the lead. Desharnais drove to the net before starting a give-and-go with Rene Borque, who found Desharnais on the back door at 17:52.
Desharnais extended the lead to 3-1 at 6:15 of the third period. Brendan Gallagher skated up the left wing and feathered a pass to Desharnais, who beat Khudobin over the glove. Gallagher finished with two assists.
Brian Gionta finished the scoring with a wraparound goal into an empty net with 2:17 remaining.
Price was sharp throughout. With 7:32 remaining in regulation, he stopped Bowman with the glove on a point-blank shot from the slot. Two minutes later, Price came across the crease to rob Bowman on a wrist shot.
Khudobin stopped 20 of 23 shots in the loss.