在開發一項功能時,工程師通常會先在腦海中進行構思與設計,接著將這些想法撰寫成程式碼,當程式碼撰寫完成後,程式會先經過編譯器(Compiler)轉換為組合語言(Assembly Language),再透過組譯器(Assembler)進一步轉換為機器可以執行的機器語言(Machine Code),也就是一連串的二進位指令,最終由電腦的中央處理器(CPU)執行機器語言,運行工程師所設計的功能。
那麼,逆向工程(Reverse Engineering)又是在做什麼呢?正如上文所述,程式碼在開發完成後會被轉換為機器語言,而逆向工程的目的,就是從這最終的機器語言中,推敲出工程師原本的設計思路與邏輯,甚至還原出接近的原始程式碼。
從機器語言回推到原始的高階程式碼中,我們會先透過反組譯(Disassembly),將機器碼轉換為組合語言,這個轉換過程可以說是精準且可逆的,因為每一條機器指令幾乎都能對應至一條組合語言指令。
然而,從組合語言進一步轉換回高階語言,也就是反編譯(Decompilation),這個過程就不是精準且完全可逆的,原因在於:
由於無法精準地將機器碼完全還原為原始的高階程式碼,逆向工程師必須結合自身的經驗與邏輯推理能力,根據不完整的程式上下文來推測原始程式碼的意圖與邏輯,這也正是逆向工程的核心所在:在資訊殘缺的前提下,透過對程式行為的觀察與低階語言(組合語言與機器語言)的理解,重建出原本的結構與邏輯。
因此,學習逆向工程不僅需要掌握組合語言的語法與語意,還需要對作業系統運作原理、編譯器生成模式、程式執行流程等有深刻的知識,換句話說,逆向工程是一門融合了技術與邏輯思維的技藝,需要具備紮實的底層知識與豐富的分析經驗。