It looked like it could be a long afternoon for Thomas Tuchel's side as they were punished for a sluggish start by Artur Sobiech, who poked home on the slide after Leon Andreasen had sprinted clear and squared the ball to his teammate.
Pierre-Emerick Aubameyang ignored the complaints to continue his fine form with a calm penalty to cancel out the home side's opener.
Dortmund quickly took control of the match after equalising, and they earned the lead just before the break when Matthias Ginter picked out Henrikh Mkhitaryan, who left Zieler helpless with a half-volley.
However, Hannover bounced back impressively to get back on level terms early in the second half when Sobiech capitalised on a mistake from Mats Hummels to score his second of the afternoon.
Tuchel sent on Adnan Jauzaj for his Bundesliga debut in an attempt to regain the lead, but it was a Hannover player who handed them the advantage again as Felipe continued his disappointing match by inadvertently sending the ball into his own net after good work from Ginter and Shinji Kagawa.
Hannover struggled to produce a response after the setback and Ilkay Gundogan started to become more influential in the Dortmund midfield as the visitors dominated proceedings.
There was more bad news to come for Felipe as he gave away a second penalty for a handball, which allowed Aubameyang to wrap up the win with an emphatic penalty late on.