Luciano Spalletti's table-topping side have raided Portugal for two of the league's most sought-after players
The 26-year-old Hulk will wear the No.29 shirt for Luciano Spalletti's side, who currently sit top of the Russian Premier League after seven games.
Hours after announcing a deal for the Brazilian, Zenit also confirmed the signing of Belgian midfielder Witsel, who will take the No.28 jersey.
"It's now official. Both players had signed five-year deals," Zenit spokesman Dmitry Tsimmerman was reported as saying by Rueters.
"We were trying to sign them before the September 3 deadline for the Champions League so they can play for us in that competition as well as the Russian league."
Having cut his teeth in Japanese football with Kawasaki Fontale, Consadole Sapporo and Tokyo Verdy, Hulk moved to Os Dragoes in 2008 and helped the club to three league titles, three Tacas de Portugal and the Uefa Cup.
He has won 13 Brazil caps since making his debut in 2009, and was part of the Selecao's Olympic team that claimed silver in London.
Witsel, meanwhile, had been heavily linked with a summer move to Real Madrid, but the former Standard Liege man, who has represented Belgium at every age group, has now made the move to Zenit.
Benfica confirmed on their official website that the fee paid for their prized asset was the contractual release clause of €40m.
The St Petersburg club have been drawn against AC Milan, Anderlecht and Malaga in the Champions League.