Both players sign on five-year deals, for a reported fee of €80-million.
Zenit did not disclose the transfer fees it paid to Portuguese rivals Porto and Benfica, but Reuters, citing a team source, reported that the Russian club paid 40 million euros for each player.
Hulk (26), who was linked with a move to Chelsea, will wear the No. 29, while Witsel takes No. 28.
Zenit are top of the Russian Premier League after seven games.
"It's now official. Both players had signed five-year deals," Zenit spokesman Dmitry Tsimmerman was reported as saying by Reuters.
"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."
After starting out professionally in Japan, Hulk played for several seasons in Portugal with Porto, winning 10 major titles – including the 2011 Europa League and three national championships – and was the League's top scorer once in 2011.
Hulk has 13 caps for Brazil, since making his debut in 2009, and represented the Selecao' at the 2012 Summer Olympics as an overaged player, claiming silver.
Witsel, a 23-year-old midfielder who made his name at Standard Liège before moving to Benfica, had been linked with a move to Real Madrid.
Benfica confirmed on their official website that the fee paid for their prized asset was the contractual release clause of €40-million.