2010-12-07 70 views
8

這裏的一些答案指出,調試信息可以更容易地對軟件進行逆向工程。當我使用Visual C++並分發帶有調試信息但沒有其他文件(.pdb)的可執行文件時,它是否會包含任何有趣的內容?調試版本如何使逆向工程變得簡單?

我看了一個十六進制編輯器可執行文件並沒有發現什麼樣的符號名,現在我假定.exe文件只鏈接信息的.pdb文件,對不對?

你知道它是否包含

  • 變量名?
  • 函數/成員名稱?
  • 行號?
  • 什麼有趣?

回答

9

調試版本傾向於產生可容易地用高級語言結構相關的輸出。只需查看機器代碼即可識別變量,測試,循環等。你不會得到變量的名字,但這通常是反向工程時最不重要的考慮因素。

優化代碼OTOH重新排列指令,展開循環,重用多個變量的插槽,共享函數之間的代碼塊,內聯小函數等等,使辨別原始意圖變得相當困難。即使您擁有代碼,也會使調試更加困難,因爲當前行標記通常非常具有誤導性,並且變量趨於消失或顯示隨機廢話。

無的,這使得反向工程是不可能的,雖然。梳理其含義只是更多的工作。

2

可執行文件不應該包含變量名稱或行號。它可能包含函數/成員名稱,用於導出任何這樣的名稱(更可能是lib/dll而不是exe)。

代碼將「更加緊密」類似於原始源代碼的結構 - 這是不可能的代碼將被內聯,曾報表重新排序,已循環展開,等等

5

建立與調試信息ISN 't「調試構建」。

定義_DEBUG符號時,「Debug build」就是這樣構建的。如果是這樣,有很多字符串可用於反向工程(assert等)。

這樣就可以使發行版本在.pbd調試信息,並進行反編譯程序會很難,因爲沒有調試信息。

1

很久以前的調試信息被附加到可執行文件(所謂的CodeView格式)。現在它主要分別在PDB文件中。這個exe本身確實只包含了一個到PDB的鏈接。

PDBS通常有兩種形式:私營和公共(又名剝離)。公共(例如由Microsoft提供的)通常只有函數和全局變量的名稱。私人的(例如,當您使用調試信息構建您的應用程序時產生的)可以另外包含類型信息(結構,枚舉,類,變量類型)函數原型,局部變量名稱和類型以及行號信息。

如果您想檢查您的PDB,請在Visual Studio安裝中的「DIA SDK」文件夾中檢查DIA2Dump。

+0

+1有關PDB文件的信息很有幫助 – Martin 2013-10-25 03:35:21

1

優化使代碼更難理解(並且在使用符號和源代碼調試自己的代碼時,還會使源代碼和程序集之間的關聯變得更加困難)。

調試版本不包含行號,函數名稱或行號,它們屬於PDB。但是,每次使用assert()時,代碼都將包含一個包含文件名和行號的字符串。