
我意識到我們可以使用許多調試器等從 C++ 程式碼中轉儲等效的程序集。
但是二進位代碼呢?構成實際機器指令的每個位元組中的位元的格式,這些指令(可能)構成微程式(如果微體系結構有的話)。
如果每行 C++ 程式碼都必須以某種方式在程式的某個時刻轉換為機器程式碼(例如,可以在 C++ 中定義浮點數,但在壓入堆疊之前沒有用處,因此它可能不會轉換為 1: 1到所有機器碼,逐行,但不管怎樣都會使用),每條語句等,都可以追蹤。但是調試器不會輸出佔用每個單獨指令的位元的結構。
如果每個程式都成為 CPU 的格式化位元組/位元模式指令,那麼(我假設)必須能夠追蹤您寫入電路級實際位元的所有程式碼。
但為了盡可能保證,是否可以做到我在這裡描述的程度?現代偵錯器/軟體不提供此功能,即使是那些似乎也沒有向開發人員提供清楚的每條指令的完整二進位表示形式。
PS:當然,這是假設編譯後的程式碼可以使用預期架構的指令輕鬆執行(而不是某種解釋性語言,或需要另一個程式進一步翻譯的字節碼)。
答案1
您可以使用反組譯器將編譯後的二進位代碼轉換回組譯語言。這將允許您「閱讀」(有困難)僅以二進位形式分發的軟體。
對於問題的另一部分,您似乎需要某種硬體反編譯器,它提供有關 cpu 如何執行特定二進位指令的更詳細資訊。我不知道有什麼工具可以做到這一點。您可能必須閱讀硬體手冊並在腦海中進行此類分析。
答案2
不。
好吧,也許吧,但不能保證,因為進入編譯器的程式碼很少與編譯出來的程式碼相同,原因有兩個:人類不擅長編寫高效的程式碼,人類不會以相同的方式思考程式碼CPU 需要在其中處理它。這可能會導致語句被重新排序,無用的語句被刪除,整個函數被內聯。
例如,給出以下偽代碼:
int x = 3;
x = 3*3;
x = 4;
function mult4(number) { return number * 4; }
x = mult4(x);
可以完全簡化為
int x = 16;
透過一個好的最佳化編譯器,它與原始碼根本不對應。這就是為什麼在偵錯時,您經常必須停用編譯器最佳化。停用所有編譯器最佳化後,編譯器將嘗試輸出與原始碼 1-for-1 相符的組件。