兩個少年
1991年,香港。三合會大佬韓琛在一群年輕的手下面前訓話,然後從中挑出幾個人,把他們送進了警校。韓琛需要自己人在警隊裡,他需要「鬼」。
十八歲的劉健明就是其中之一。他聰明、冷靜、善於偽裝,是天生的臥底材料。他剪掉了長髮,穿上了制服,從此開始了他的雙面人生。
與此同時,警校裡還有另一個年輕人——陳永仁。他成績優秀,性格剛烈,被警方高層黃志誠看中。黃志誠把永仁叫到辦公室,告訴他一個任務:假裝被退學,然後以問題少年的身份打入韓琛的黑幫組織。從今天起,你不再是警察,你是古惑仔。
兩個少年,一個從黑走向白,一個從白走向黑。他們不認識彼此,卻註定要在對方的鏡像中尋找自己。

十年後
2002年。劉健明已經升到了警隊高級督察的位置,西裝筆挺,前途光明。沒有人懷疑他。他在警隊裡如魚得水,甚至開始享受這個身份帶來的一切——權力、尊重、安全感。有時候他會忘記自己到底是誰。
陳永仁則在韓琛身邊蟄伏了十年。他留著長髮,說著粗話,打架、販毒、替韓琛辦髒事。十年的臥底生涯讓他幾乎忘記了自己曾經是個警察。他只和黃志誠單線聯絡,每次見面都在不同的天台上,黃志誠是他和「正常世界」之間唯一的連接。
永仁對黃志誠說:我想回去。我不想再做臥底了。
黃志誠說:再等等。

毒品交易
韓琛策劃了一筆大宗毒品交易。陳永仁通過摩爾斯電碼把情報傳給了黃志誠。黃志誠帶領重案組設下埋伏,劉健明則以CIB(刑事情報科)的身份協助行動,負責監控和通訊。
但劉健明同時在給韓琛傳遞資訊。他用手機簡訊通知韓琛警方的部署,韓琛據此調整計劃。最終,這次行動雙方都沒有成功——警方抓不到韓琛的把柄,韓琛的貨也全部沉入了大海。
黃志誠意識到了一個可怕的事實:警隊裡有內鬼。而韓琛也意識到:自己身邊有臥底。
雙方開始了一場互相尋找「鬼」的較量。
天台

黃志誠擔心陳永仁的安全,約他在一棟大廈的天台上見面,準備安排他撤出。但劉健明跟蹤了黃志誠,把密會的地點洩露給了韓琛。
韓琛帶著一群手下趕到現場。他質問黃志誠:臥底是誰?黃志誠不說。韓琛的人圍毆了他十分鐘。黃志誠一個字也沒有吐出來。
然後韓琛把他從天台上扔了下去。
陳永仁藏在附近,親眼看著自己唯一的聯絡人墜落。他的世界在那一刻徹底崩塌了——黃志誠死了,他的警察身份的唯一證明也隨之消失。他成了一個沒有人知道是誰的人:在黑幫裡他是臥底,但沒有人能證明這一點。
互相尋找
劉健明被任命負責調查黃志誠被殺案。諷刺的是,他要找的「黑幫內鬼」其實就是自己。而陳永仁也開始利用黃志誠留下的線索,試圖找出警隊裡的「鬼」。
兩個人在不知不覺中越來越接近彼此。劉健明通過分析通訊記錄發現了陳永仁的存在;陳永仁則通過反向追蹤情報洩露的渠道,逐漸鎖定了劉健明。

劉健明做出了一個出人意料的決定:他主動配合警方擊斃了韓琛。他不再需要韓琛了——他想徹底洗白自己,做一個真正的警察。在槍戰中,韓琛倒在了血泊中。劉健明看著韓琛的屍體,心裡鬆了一口氣:過去終於死了。
但陳永仁不會讓他如願。
「我想做個好人」
陳永仁打電話給劉健明,約他到當初黃志誠被殺的那個天台見面。永仁用槍指著健明,把他銬上了手銬。他要做的最後一件事,就是把劉健明的真實身份交給警方。
但他們不是這個故事裡僅有的「鬼」。
電梯門打開的瞬間,另一個韓琛當年安插在警隊的臥底——林國平——出現了。他舉槍射殺了陳永仁。
永仁倒在電梯裡,眼睛睜著,像是在看著什麼很遠的地方。

林國平對劉健明說:我也是韓琛的人。我們是一樣的。
劉健明看著他,沉默了幾秒。然後他拔出槍,打死了林國平。
他走出電梯,對趕到的警察出示了自己的證件。他說:我是警察。
陳永仁死了。唯一知道劉健明真實身份的人死了。劉健明站在陽光下,穿著西裝,胸前別著警徽。沒有人懷疑他。
但他自己知道。在佛教中,「無間」是最深層的地獄——不是烈火焚身,而是永遠無法解脫。劉健明將餘生活在一個無間地獄裡:他得到了他想要的一切,卻永遠無法成為他想成為的人。
影片最後,劉健明站在黃志誠的靈堂前,鞠了一躬。他輕聲說了一句話:「我想做個好人。」
沒有人回答他。