用 Claude 做 One-Shot Decompilation 之後,我開始重新思考逆向工程的邊界

最近看到一篇很怪但又讓人停不下來閱讀的實驗文章,作者做了一件在傳統資安與逆向領域聽起來有點異想天開的事,他直接把一份反組譯的輸出貼給 Claude,拜託模型「幫我還原成可讀的高階語言」。照理說這應該只會得到一堆語法正確但邏輯亂七八糟的偽代碼才對,但結果出乎大家意料之外。
Claude 給出的程式碼竟然乾淨、可讀,甚至邏輯完全能對回原本的二進位內容,那種感覺很像你把一塊拼圖碎片丟進模型,它卻給你還原出整張圖的感覺。更誇張的是,整個過程只有一次指令,不像逆向工程師一樣要在 Ghidra 裡慢慢 trace、切函式、猜變數等等,就只是把反組譯結果丟進去,然後它就…吐出一個 C 語言。

這件事讓我意識到模型並不是在做傳統意義上的解編譯,它其實是在做一種語意層級的重建(semantic reconstruction)。當我們人類在逆向工程時,我們會用經驗和模式認知去推測:「這段彙編應該是個迴圈」、「這個 mov 加 push 應該是 function call」。
其實模型也是做類似的事,只是它用的是它看過龐大程式碼語料後形成的語意分佈,因此它知道典型的程式碼長什麼樣子,知道常見邏輯怎麼表達,也知道最佳化後的彙編大多是從什麼模式生出來的,當你丟給它那串乾乾扁扁的反組譯指令時,它是在從語言模型的角度補完意圖。
這不是 deterministic 的逆向過程,而是一種 probabilistic 的語意猜測,可是讓人驚訝的是,效果好得離譜...
甚至接近可直接編譯的程度,如此就讓整件事情變得非常值得深思,因為逆向工程本來是一個極度仰賴人類專業知識的領域,尤其當符號表已經被剝掉、變數名稱全部消失時,邏輯的重建是一種高度依賴上下文推理的工作,沒想到這種推理能力剛好是 LLM 的主場。
讀完這篇文章後,我其實一直在想一個問題,如果模型能以這種方式重建程式邏輯,那逆向工程的典範是不是正在被悄悄改寫? 至少在語意層級的理解上,模型已經能提供一種「第三種工具」,不是 IDA/Ghidra 那種靠靜態分析的工具,也不是人類工程師靠經驗補洞的能力,而是一個能在高維語意空間推回原始意圖的推理引擎。
當然,它現在也不是萬靈丹,真正深入最佳化過的彙編、cryptic 的手寫 asm 還是會讓它破功,且它也不是逐行還原,而是在補一個合理版本的原始程式。但從工程角度來看,這種語意重建能力本身就已經足以改變我們看待程式碼審查、資安分析、legacy 系統現代化,甚至 compiler research 的方式,因為我們第一次有了一個能在抽象層級重組程式的模型。

對我自己來說,這篇實驗帶給我的感受有點像一個新的視野被打開,原來逆向工程並不只是在 byte 與寄存器之間做 mapping,它更是一個「重建意圖」的過程,而語意模型天生就在做這件事。
這也讓我開始重新看待 LLM 在低階世界的價值,也許我們過去都太習慣把模型當成高階語言的助手,但現在看起來,它對低階系統的理解方式,反而可能會讓它在未來扮演一個全新的角色。
這篇文章不是在說 Claude 有多強,而是在提醒我們抽象層級的重建,是 LLM 最值得被探索的能力之一,而逆向工程,只是它能施展這種能力的一個開始。
作者:芳