2011-11-01 102 views
1

有誰知道如何將C++代碼轉換爲彙編代碼,然後做相反的操作? 前進的道路是很容易的:將C++代碼編譯爲彙編,然後解組

g++ -S 

我要分析的輸出,看看它是否已正確編譯(現在只是出於好奇,但它可以有一些應用程序)。但是,我的彙編知識非常有限,輸出很難理解(如果我使用優化(-O)或使用調試信息(-g)進行編譯,則尤其如此)。

是否有C++(GCC)生成C++代碼的反彙編程序?如果沒有,是否有任何中間表示,我可以編譯C++代碼,然後從中返回?

似乎是將C++到C here一些方法。海灣合作委員會有這個嗎?

+3

您編譯C++程序後,沒有辦法從組件取回源逐字爲所有,但最瑣碎的程序(除非你的編譯器做一些奇怪的像包括二進制或什麼的源代碼)。你可以得到一個非常粗略的近似值,但就是這樣。 –

+4

對於PC,您可以使用'-masm = intel'選項來獲取更多可讀(常規)語法 –

+0

我希望有一些工具可以生成可以輕鬆拆卸的Java字節碼的C++版本。如果Java有可能,那麼C++ –

回答

4

德編譯彙編語言回C++是可能的(例如,用HexRays),一些約束條件 - 主要是,雖然++你出去會正確地反映基本的算法C,它可能不會看起來很像原始的源代碼(儘管C++名稱的修改確實有助於保持與原來相比更接近於原始語言的東西,而不是使用其他許多語言)。

+0

HexRays似乎是一個合理的解決方案,但成本從600美元起。 –

+0

@Shayan:是的,與免費工具相比,成本相當陡峭。OTOH,如果你專業地使用它(或者付錢給其他人),它可以很快*付出自己的代價。 –

0

使用objdump -d拆解編譯對象。除此之外,您無法從中獲得更多信息(並且絕對不是原始來源)。如果我是你,我會相信編譯器。

2

後一個問題(「是有可以從它編譯的C++代碼到,然後返回任何中間表示?」)聽起來像是由鐺產生的AST。

1

也許你可能有興趣瞭解更多有關GCC使用的內部表示,特別是GIMPLE(和樹-S)。如果您想利用GCC圍繞GIMPLE進行的大量處理,您應該考慮編寫一個GCC pluginGCC MELT extension(MELT是一種高級別域特定語言,以便輕鬆擴展GCC)。

但我所瞭解的C++編譯器的所有中間內部表示與C++源代碼相差甚遠,因爲C++前端已經完成了大量工作,並且沒有簡單的方法可以去回到一些有用的C++。

忠實和完整decompilation在實踐中幾乎是不可能的,因爲由編譯器生成的彙編代碼已經失去了從原始的源代碼有一定的瞭解。