2011-08-03 15 views
0

我想確定使用.pdb和DIA SDK的.exe的靜態調用圖。不幸的是,當增量鏈接時,使用dia2dump示例時,函數調用的增量蹦牀thunk不會顯示出來。從.pdb獲取使用增量鏈接thunks的函數?

如果運行與調試和增量鏈接鏈接dia2dump樣品(或簡單的一個here)時,將調用wprintfprintf沒有任何功能的符號轉儲顯示出來。但是,如果您禁用增量鏈接,他們會這樣做。

有什麼辦法通過DIA獲得函數使用的增量蹦牀嗎?或者我應該破解.obj和.lib文件?

回答

1

你如何鏈接到CRT?靜態還是動態?

我編譯了VS2010中的示例(使用動態/ dll CRT),並將生成的.exe加載到IDA Pro中。以Fatal函數(來自示例)爲例,其所有printf調用都直接編譯爲該函數的.exe導入條目的引用(即__imp__printf)。所以這可能是爲什麼你沒有看到他們出現在你的轉儲。如果我使用靜態鏈接到CRT(增量開啓),它會調用ILT。如果我關閉增量,它會直接調用printf(因爲它不會導入它)

對於動態CRT,間接(調用導入)和ILT(調用間接;你的'蹦牀'我相信)版本的printf函數等仍然存在於增量.exe中,但沒有對它們的代碼引用。

該示例正確轉儲自身的ILT(下面的printf示例),所以我想它能夠正確地將它們轉儲到函數符號轉儲中,然後實際調用它們。然而,我在DIA方面的經驗有限,所以到現在爲止我或多或少都在說我的屁股。

0x00011799 (PublicSymbol) @ILT+1940(_printf)