2011-01-24 83 views
4

如何區分兩個二進制文件?比較兩個二進制文件

我有兩個版本的程序,版本1和版本2.我做了兩個版本之間的少量變化,但不幸的是沒有定期備份,所以雖然我已經得到了版本2的源代碼,我只有版本1的二進制文件。我需要了解兩個版本之間的變化。我已經嘗試創建兩個版本的objdump,然後使用diff來查找更改,但這不起作用,因爲偏移量不同,所以diff差不多認爲每條線都發生了更改。

例如,一條線可能是bgez v0,4074d0<daemonize+0xd4>版本1和bgez v0,4073d4<daemonize+0xd4>在第2版。這些都是直接從轉儲文件複製的 - 你可以看到兩行做同樣的事情,但差異不能區分它們。這些文件對我來說太大了,無法手動檢查每一行;如何檢測功能更改,同時忽略偏移量的差異?

+0

這聽起來像是一個現實世界的NP完全問題。 ;-) – 2011-01-24 16:48:25

+0

不是NP完整的,因爲它可以通過DFA解決。 – Benubird 2011-01-25 09:19:02

+0

NP和DFA的含義是什麼? – 2016-02-11 14:45:15

回答

3

我最終通過刪除原始指令和偏移標記來解決此問題,所以我只有程序集,然後使用sed去除每個數字,並過濾差異以忽略僅包含1行的更改。我有點驚訝,它的工作,但它確實。

1

簡答:你不能。

長答案:編寫自己的diff,可以忽略操作碼的一個或兩個操作數,如果它們是數值立即值的話。

0

您可以使用sed或awk(或perl或...)編寫過濾器,以在運行diff之前使所有偏移量相同。寫這樣一個過濾器留給讀者來練習。 :-P

+0

你已經回答了'我該怎麼做'的問題,說'它可以完成'。雖然技術上正確,但這完全沒用。 -1 – Benubird 2011-01-25 09:23:03

4

這是可能的。我目前正在開發一個項目,該項目能夠從新的/修改的二進制文件中的已編譯文件中搜索函數和內存指針地址。它支持x86和x86_64上的windows PE和ELF二進制文件。還有一篇論文描述了這種方法。它適用於我的反轉項目,在進行二進制更新時,我必須經常更新所有鉤子和內存地址。但也有其他用例。

Check it out here.

訣竅在於,它不依賴於弱文本比較,它拆卸二進制文件,並通過使用代碼度量測量它們之間的幾何距離的所有功能進行比較。