2017-02-25 101 views
0

假設我將C/C++文件編譯爲二進制文件。說,該文件定義了一個功能foo()如何找到函數所在的可執行文件中的位置?

我該如何在二進制文件中找到這個函數?通過定位,我的意思是找到確切的位置。

我認爲這個問題取決於我們是考慮Windows還是Linux,所以可以說可執行文件是PE格式。

編譯器是否擦除所有命名,以便按名稱查找函數是不可能的?也就是說,我必須在二進制文件中進行模式搜索?

我知道DLL的有導出表,這可能會在定位中的函數幫助,但在Windows可執行文件沒有這樣的表...

+0

該信息不存儲在二進制映像中。您需要一個PDB或MAP文件。 – IInspectable

+0

這些文件是什麼?從來沒有聽說過他們。 – Shuzheng

+0

[程序數據庫文件](https://msdn.microsoft.com/en-us/library/yd4f8bd1(v = vs.100).aspx)(又名PDB文件)。再加上一些關於MAP文件的信息(參見[/ MAP連接器選項](https://msdn.microsoft.com/en-us/library/k7xkk3e2.aspx))。 – IInspectable

回答

1

.exe文件can export functions並且這些功能可以通過使用。加載到該進程中的DLL。如果您要加載插件並希望提供某種插件API/SDK,這是最好的選擇。然後,您可以通過在處理過程中的任何代碼中執行GetProceAddress(GetModuleHandle(0), "MyFunction")來查找函數。 .DLL也可以直接鏈接到函數,並且加載程序將解析它們,就像它們在.DLL中導出一樣。

另一種方法是在您的.EXE中嵌入符號/調試信息,然後使用DbgHelp functions來查找該函數。

您還可以讓鏈接器生成一個.MAP文件,該文件列出了每個函數及其地址,但在手動調試進程時最常用。

+0

我以爲只有Linux允許可執行文件導出函數? – Shuzheng

+0

MAP文件是否在二進制文件或其RVA(運行時地址)中列出函數的位置? – Shuzheng

+0

@Shuzheng:你已經知道答案了。 .MAP文件在鏈接時生成。鏈接器無法知道模塊將在運行時加載的位置。此外,「RVA」中的「R」是「相對」的簡稱。 RVA是模塊相對的。 – IInspectable

相關問題