The Canadiens scored twice late in the second period, wiping out a 1-0 Canes lead.
David Desharnais scored off the rush with 2:08 left in the period and then Ryan White off a rebound with 42.7 seconds left as the Habs pushed ahead 2-1.
The Canes had taken a 1-0 lead on Drayson Bowman's score with 14:18 left in the second. Bowman rifled a shot from the top of the right circle as Tuomo Ruutu screened Habs goalie Carey Price.
The Habs suffered a key penalty in a scoreless first. Forward Max Pacioretty, who has been named to Team USA for Sochi, was hurt as he drove the net with 7:30 left in the first. Canes defenseman Brett Bellemore drove Pacioretty into the post and Pacioretty dislodged the net with a heavy collision, then fell to the ice in pain.
Sign Up and Save
Get six months of free digital access to The News & Observer
Pacioretty, who leads the Habs with 26 goals, was helped off the ice with a lower-body injury and did not return to the game.
Anton Khudobin started the game in net for the Canes and played his 17th consecutive game. Price, who shut out the Canes 3-0 on Jan. 28, was in net for the Habs.
The Canes nearly scored on a first-period power play as Eric Staal redirected a shot and the puck glanced off the post. Price also made a nice save on a shot by Drayson Bowman after the power play.
A shot by the Habs' Rene Bourque early in the game forced a review. Khudobin made the stop with his right pad, but the Habs kept poking at the puck.
The Canes killed off a Mike Komisarek boarding penalty late in the first. Komisarek was in the lineup replacing John-Michael Liles, who suffered a lower-body injury Friday against Florida.
After Bowman's goal in the second, his first since Dec. 27 against Pittsburgh, the Canes had a power play and chance to add to the lead. Andrej Sekera forced Price into a good stop with an outside shot and Elias Lindholm had an open shot in the slot but with high with his attempt.
Desharnais scored after the Habs caught the Canes out of position and countered quickly. White's goal, his second of the season, came after a shot by Andrei Markov that was weakly defending by Alex Semin and had White fight for position in front of the net.