Road to Perdition

In 1931, during the Great Depression, Michael Sullivan Sr. (Hanks) is an enforcer for Irish mob boss John Rooney (Newman) in Rock Island, Illinois. Rooney raised the orphan Sullivan and loves him more than his own biological son, the unstable Connor (Craig). Connor snaps and kills disgruntled associate Finn McGovern when meeting him with Sullivan, resulting in Sullivan gunning down McGovern's men. Sullivan's twelve-year-old son Michael Sullivan Jr. (Tyler Hoechlin) had hidden in his father's car and witnesses the event. Despite Sullivan swearing his son to secrecy and Rooney pressuring Connor to apologize for the reckless action, Connor murders Sullivan's wife Annie and younger son Peter, mistaking him for Sullivan Jr. He then sends Sullivan to an ambush at a speakeasy but Sullivan realizes and escapes to Chicago with his son to seek Al Capone, for work and to discover the location of Connor, who has gone into hiding.
Capone's underboss Frank Nitti (Tucci) rejects Sullivan's proposals, before informing Rooney of the meeting. Rooney reluctantly allows Nitti to dispatch assassin Harlen Maguire (Law), who is also a crime scene photographer, to kill Sullivan. Maguire tracks him and his son to a roadside diner, but fails to kill Sullivan; realizing Maguire's intentions, Sullivan escapes through the bathroom and punctures Maguire's car tire before fleeing.
In reaction to the ordered hit, Sullivan begins robbing banks that hold Caponeâs laundered money, hoping to trade it for Connor while teaching Michael to drive their getaway car. Sullivan is impeded when the mob withdraws its money, so he visits Rooney's accountant Alexander Rance (Baker) at his hotel. The encounter is a set-up, with Rance stalling Sullivan until Maguire enters with a shotgun. In the ensuing crossfire, Rance is killed by the shot from Maguire's shotgun, Maguire is injured by flying glass shards, and Sullivan escapes with the ledgers; as Sullivan flees, Maguire shoots him in his left arm.
When his father collapses from his wound, Michael Jr. drives his father to a farm, where a childless elderly couple help him recover. Sullivan bonds with his son and discovers from the ledgers that Connor has been embezzling from his father for years, using the names of dead men. As the Sullivans depart, they give the couple much of the stolen money. Sullivan confronts Rooney with the information while they attend Mass. Rooney already knew about the embezzlement and that Connor was likely to die, if not by Sullivan's hand then by (the) Chicago (Outfit) once Rooney dies and they discover Connor had been stealing money; however, he refuses to give up his son. He encourages Sullivan to leave with his son while mourning his departure.
Later one night, cloaked by darkness and rain, Sullivan dispatches Rooney's entire entourage with his Thompson submachine gun and walks directly up to Rooney. As Rooney mutters that he is glad his killer is Sullivan, an emotionally reluctant Sullivan pulls the trigger. Seeing no further reason to protect Connor, Nitti reveals his location to Sullivan, after making the latter promise to end the feud. Sullivan goes to the hotel where Connor is hiding and kills him.
Sullivan drives his son to stay at his Aunt Sara's beach house in Perdition, a town on the shore of Lake Michigan. However, he is ambushed and shot by a disfigured Maguire. As Maguire prepares to photograph the dying Sullivan, Michael Jr. appears and points a gun at Maguire but cannot muster the will to fire. Sullivan pulls out his gun and kills Maguire, before dying in his son's arms. Mourning his father's death, Michael Jr. returns to the elderly farm couple to live with them. While growing up, Michael Jr. reflects that his father's only fear was that his son would become like him. Michael states he has never held a gun since the fatal encounter between Maguire and his father. When asked if Sullivan was a good or bad man, he replies "he was my father."

Question: Who shoots Sullivan?
Answer: Maguire