2016-03-14 132 views
-6

我要實現的是這樣的:將C++ Linux二進制文件轉換爲僞C++代碼。逆向工程

C++ riped code

基本上它已經從一個Linux二進制這原是C++ code.I並從別人莫名其妙地做了轉換二進制到採取這種圖像拍攝C++可讀代碼。

謝謝。

ps:示例中的大部分變量名都由人類重寫。

+0

我已經嘗試了幾個C++反編譯器,但他們只是沒有工作(很多沒有意義的代碼)。 –

+0

那麼,就我所知(我自己實際上並沒有真正使用反編譯器),通常無法獲得比「沒有任何意義的許多代碼」更好的東西,而無需人工干預。如果你對某個具體問題有疑問,試圖修改反編譯器或以編程方式嘗試實現你想要的內容,那麼應該將其作爲一個問題發佈。 –

+0

我期待着看看有人在這裏試過反編譯任何C++ linux二進制文件並分享他們的經驗。感謝你的回答。 –

回答

1

由於現代編譯器生成的機器碼,尤其是用-O1或更高版本編譯的代碼與原始代碼幾乎沒有相似之處,所以編寫一個工具甚至在這方面做出合理的工作真的很不容易。

我已經使用LLVM編寫了我自己的編譯器,並且從LLVM-IR(它是「高級彙編程序」)到機器代碼都會對代碼做很多更改,特別是一旦啓用某些優化。變量消失,屬於不同塊的代碼混合在一起。作業從原來的地方轉移到更晚的地方[或更早的地方]。

所有環路成爲「同」 [存在實際上是LLVM特別通行證做的正是這一點,所以後來通行證就可以知道「什麼循環樣子」,而不必分析四種不同的方式,使循環[forwhile,do-whilegoto] - 他們都看起來非常相似,通過後。

當然,編譯器會在可能的情況下內聯函數,並且合適的意思是類內部的好函數不再能與其他代碼區分開來。

交換機和if-else鏈變得難以區分。實際上,在你的例子中,你可以看到一些在C++中跳轉到L239的goto,實際上它幾乎可以肯定是一個switch語句,缺省的錯誤。它不太可讀,幾乎不可能以有意義的方式進行改變。這還是很不錯的。

循環展開。類和結構停止成爲對象,並在某些情況下成爲一組獨特的變量。

Casts和轉換消失並重新映射到別處。

這真的很難跟隨由編譯器生成的機器代碼,並且很好地理解它 - 甚至更難以以任何有意義的方式重建原始代碼。

我期望有一些經驗,閱讀彙編代碼並理解它的實際操作更容易,並從中重新創建代碼,而不是使用生成「C++」的工具(在某些術語的鬆散意義上) 。