2012-08-30 173 views
3

我正在尋找10,000+行彙編程序中的錯誤,並在將來進行維護。它涉及PIC18微芯片微控制器的彙編代碼。該代碼是由一位不再可用的前同事編寫的,他沒有留下任何文檔,他的代碼評論很差。該代碼還使用了一些直接轉到和胸罩的和相對的(例如$ + 0x06),所以我非常不願意編輯它。反編譯彙編程序到c

我寧願將他的彙編源代碼反編譯成'新'C代碼(或C++)並從那裏開始工作。我想知道:

  1. 是反編譯彙編器 - > C代碼100%的功能?
  2. 直接和相對goto會發生什麼?
  3. 是否有任何免費或廉價的工具可用於反編譯PIC18代碼?
+1

正是因爲這個原因,你應該正確地評論你的代碼。 – poitroae

+2

我不認爲你可以做到這一點。噢,我喜歡認爲所有產品都有C編譯器,包括PIC18。你是否用Google搜索過?一切重新開始。程序集的10000 LOC可能在C中大約爲1000 LOC。 – nullpotent

+2

反編譯器取得了一些進展,但它們仍然沒有真正的工作,特別是對於看起來不像「典型編譯器輸出」的代碼。你通常得到的是「彙編但是C語法」 - 這並不能真正清除很多東西。 – harold

回答

4

我是這樣看的:

  1. 沒有,我期望這是可能的,因爲沒有保證C能準確地表達一切特定的CPU可以在組件級別的方式做這足夠直接使得可以在反編譯器中實現。當然,他們都是都靈完整的,但魔鬼肯定在細節中,在這裏。
  2. 這是一個特定的問題,例如。裝配當然可以跳過例如進入C語句的中間,這使得翻譯變得複雜。
  3. 我不這麼認爲,沒有。

有關問題空間的更多信息,請查看Boomerang project's FAQ

2

非mips圖片編譯器非常不友好,使用C在消耗極限資源方面速度慢並且代價高昂。

gotos和branches是處理器如何工作的,沒有錯。

我會先刪除相關分支並將其替換爲標籤,但通過比較預修改代碼和修改後代碼的二進制代碼,您應該檢查一下是否沒有添加新的錯誤。一旦相關分支都使用標籤,您就可以添加或刪除代碼,而不用擔心打破別的東西。

反編譯器不工作,不能工作。這就像嘗試從你的腸道中拿出午餐的薯條,並嘗試恢復原來的馬鈴薯(當然,除非是皮膚上的薯條,否則不需要皮膚)。原始數據源經過多次烹飪和處理後,纔會被匯入彙編器,然後如果使用對象和鏈接器,它會被再次烹飪(以及被加熱)。在無法恢復的道路上丟失了太多的材料。

非常有可能做一個靜態的二進制翻譯,並獲得一些C語言的東西,但比asm更難讀取和維護,特別是帶有標誌的體系結構。翻譯者不會完美地移除所有的死碼。每條添加指令都將是自己加上代碼以檢測溢出,如果溢出設置標誌,否則清除,如果結果等於零設置標誌,否則清除是否設置了msbit設置n位否則清除,如果存在如果有符號溢出,則設置v位清除,一條簡單的asm行會變成10行C代碼,除非轉換程序可以自動刪除該死代碼。

+0

「*反編譯器不工作,不能工作*」 - 也就是說「你不能從程序集中生成等價的高級代碼」,這當然是錯誤的,因爲將程序集轉換爲等效的C代碼是非常常見的*逆向工程*實踐。當然,沒有辦法通過反編譯來恢復*原始*源代碼,但是沒有任何東西可以阻止將彙編邏輯轉換爲C邏輯 - 例如,如果生成的代碼可以編譯或不編譯,則取決於反編譯器的質量雖然。當然,反編譯幾乎總是隻是一個工具,絕對不是最終的解決方案。 – zxcdw

+0

瞭解..... –

0

儘管反編譯本身在某種程度上是可能的,但它是否適用於您的情況是另一件事情,它取決於可用的軟件。就我個人而言,我會開始手動解密代碼,並用C粗略重構代碼。當然,這是一項單調乏味的任務,可能涉及很多錯誤和錯誤,但是如果您應該維護代碼庫,那麼嘗試使這個任務稍後會盡可能簡單 - 也許未來的維護人員也會很感激你的工作。