您當前的位置:首頁 > 舞蹈

如何將機器碼還原為 C?

作者:由 狂奔的雞骨架 發表于 舞蹈時間:2016-08-21

如何將機器碼還原為 C?RednaxelaFX2016-09-02 05:26:29

先給題主放個傳送門:怎麼將二進位制程式碼轉換為中間程式碼(IR)呢? - RednaxelaFX 的回答

把機器碼反編譯到C程式碼是個大坑啊。

如何將機器碼還原為 C?立黨2016-09-02 05:30:59

難度不亞於把一鍋牛肉丸還原成一頭牛……

哎呀抖個機靈就不要點讚了,請看R大的怎麼將二進位制程式碼轉換為中間程式碼(IR)呢? - RednaxelaFX 的回答

如何將機器碼還原為 C?知乎使用者2016-09-02 11:35:24

這個確實是個大坑,完整的反編譯成可編譯的C程式碼基本上是不可能的,都是搞成偽C程式碼,只能用來看看流程,要編譯的話需要人工做大量的修改。。隨便發幾個連結吧,其中有一些我也在倒騰。

1。 IDA Pro

第一個肯定要是逆向界的老大IDA Pro了,他的hexray外掛支援x86/x64/arm/arm64/mips的反編譯,在一個函式上按一下F5就出來(偽)C程式碼了,還可以在反編譯出來的程式碼上下斷點除錯,就問你怕不怕。。。不過這貨貴的要死(所有外掛都加上應該要3w+軟妹幣),所以這裡發個demo版的,限制很多,不能儲存分析結果支援的檔案格式和CPU架構很少沒有F5基本上就是個殘廢,可以拿來玩玩。

2。 Hopper

跟IDA挺像的一個玩意,不過功能少很多,相應的也便宜不少,好像也沒什麼特別的地方,有興趣的可以自己去看一下

3。 exetoc

國內大牛劉濤濤搞的,過去的TRW2000的作者,現在貌似不咋出現了,開源的,看雪上也很多人研究這個東西,程式碼寫的比較爛,一堆MFC的玩意,不過可能是因為時間太過久遠的原因。

放兩個看雪上的連結:

【分享】劉濤濤的EXEToC的程式碼

【原創】反編譯程式ExeToc 2011v1。01 (原始碼)

【分享】《反編譯器C-Decompiler關鍵技術的研究和實現》

4。 Retargetable Decompiler

一個線上反編譯的東東,也有IDA外掛(需要註冊才能下載),個人感覺某些情況下比IDA的還有好用。原理好像是先講二進位制程式弄成LLVM IR,然後再IR的基礎上反編譯成C程式碼。

5。 GitHub - joelpx/plasma: Interactive disassembler for x86/ARM/MIPS。 Generates indented pseudo-code with colored syntax code。

一個py寫的反編譯工具,功能在標題裡都寫清楚了。。

6。 Snowman

既可以當IDA外掛也可以單獨使用的反編譯工具,開源,很值得研究。

7。 REC Decompiler

免費不開源,bug一堆,反彙編一個exe後在反彙編程式碼上右鍵選decompile即可得到偽C程式碼

8。 Relyze - Interactive x86 and x64 reverse engineering and analysis

收費工具,效果和介面都很不錯,有試用版可以下載。

如何將機器碼還原為 C?狗肉 花與果2016-09-02 12:51:27

不開最佳化還是可能的

如何將機器碼還原為 C?NWMonster2016-09-03 11:14:46

依靠自動化工具(例如hexray或者hopper等等)自動來做這件事效果的確比較差,看了下其他答案大多都在討論自動化的解決方案。其實在實際工程上大多數逆向(也就是所謂的機器碼轉成c)的工作是由人力來完成的。簡單介紹下其中難易點和知識需求。

難易點:

逆向工程的過程我分為兩大種,一種是“參考型”,一種是“學習型”。

“參考型”指的是根據目標程式的輸入輸出基本可以推斷出這個程式是如何寫的,只需要透過看看程式中的字串資訊,再確認下某幾個具體細節,就能基本重新寫出來一個(實際工程上可能只需要一部分的功能程式碼),這類多見於惡意程式,競品分析等的分析工作。完成這項工作大多需要逆向者對目標程式所涉及到的知識有過學習。

“學習型”的大意是對要逆向的目標程式“如何實現某個功能”毫無概念,這就需要了解其具體實現演算法。與“參考型”相反在看到目標程式之初無法”腦補“出具體實現細節,需要在程式中找到實現對應演算法的部分,進行比較細的分析。這類多見於對漏洞利用,編寫keygen,還原VM保護等等。這項工作相對”參考型“會比較耗費時間。

知識需求:

在實際逆向過程中,除了對目標程式所用平臺的組合語言的理解之外。

對編譯目標程式所用的編譯器的學習也至關重要,甚至可能需要精確到編譯器的版本,可以減少實際工作時不少重複工作,尤其對於VB, Delphi這類。

更為重要的是對編譯器所採用的最佳化演算法的學習,不僅是對程式流程上的最佳化,計算過程上的最佳化也很重要。

總結一下,逆向的過程就是:

腦補目標程式某過程實現—>確認是否和腦補出來的一樣 || 精確還原某部分實現—>根據腦補(還原)出來的實現細節用熟悉的計算機高階語言寫出來。