Dot-Net

為什麼反編譯 .NET IL 程式碼這麼容易?

  • March 22, 2009

與反編譯本機 x86 二進製文件相比,為什麼將 .NET IL 程式碼反編譯為原始碼如此容易?(Reflector 大部分時間都產生了相當不錯的原始碼,而反編譯 C++ 編譯器的輸出幾乎是不可能的。)

是因為 IL 包含很多元數據嗎?還是因為 IL 是比 x86 指令更高的抽象?我做了一些研究,發現了以下兩篇有用的文章,但它們都沒有回答我的問題。

我想你已經掌握了最重要的部分。

  • 正如您所說,還有更多可用的元數據。我不知道 C 或 C++ 編譯器發出的詳細資訊,但我懷疑IL中包含更多名稱和類似資訊。只需看看反編譯器對特定堆棧幀中的內容的了解,例如 - 就 x86 而言,您只知道堆棧是如何使用的;在 IL 中,您知道堆棧的內容代表什麼(或者至少是類型 - 而不是語義!)
  • 同樣,正如您已經提到的,IL 是比 x86 更高級別的抽象。x86 不知道方法或函式呼叫、事件或屬性等是什麼。IL 中仍然包含所有這些資訊。
  • 通常,C 和 C++ 編譯器的優化程度遠高於(例如)C# 編譯器。這是因為 C# 編譯器假定大部分優化仍然可以在以後執行 - 由 JIT。在某些方面,C# 編譯器不要嘗試做太多優化是有道理的,因為 JIT 可以使用各種資訊,但 C# 編譯器不能使用。優化後的程式碼更難反編譯,因為它遠離原始原始碼的自然表示。
  • IL 被設計為 JIT 編譯;x86 被設計為在本機執行(誠然通過微程式碼)。JIT 編譯器需要的資訊與反編譯器所需的資訊相似,因此反編譯器使用 IL 更容易。在某些方面,這實際上只是對第二點的重申。

引用自:https://stackoverflow.com/questions/671407