2009-05-06 87 views
2

我正在處理一個未公開的API,我正在嘗試做一些逆向工程 - 不要擔心這不是惡意的,只是試圖以創造性的方式實現用例。如何在不知道名稱的情況下訪問C結構的成員?

我有一個指向C結構的指針。有沒有辦法讓我通過檢查記憶來確定這個結構有多少個成員?他們的價值?

我懷疑實際的成員名稱不可用,但也許他們是?

回答

3

根據內存佈局,您可能能夠確定結構在哪裏結束,並且通過了解結構在較高級別上做了什麼可以猜測成員(小心對齊)。但是,除非代碼帶有調試符號,否則沒有關於知道名稱的運氣。在這種情況下,這很容易。打破使用結構的地方,並在調試器中檢查它。

編輯:
假設你沒發現什麼成員結構包含的,你也知道,你的編譯器使用相同的定位,那麼你可以在你的代碼中定義結構的傳真和使用的一個指針結構指向真實結構的地址。然後,您可以在代碼中輕鬆訪問所有元素。

+0

所以我可以這樣假設: struct Foo {int_lod; }; Foo f; Foo * pf =&f; int * pFirstMember = &f[1]; // ?? – Marplesoft 2009-05-06 14:55:28

+0

@Marplesoft,看看數據結構對齊,你可以在SO或WP上找到關於它的信息。基本上保證結構的第一個元素與結構本身具有相同的地址,即pFirstMember =(int *)&f應該工作,當然只有當它真的是一個int。 – quinmars 2009-05-06 16:02:19

4

不,不可能僅從內存中確定成員的「結構」。

1

不幸的是,您沒有C或C++中的類型信息。在C++中提供了一些RTTI,它允許dynamic_cast檢查向下轉換的有效性。但它沒有提供關於成員(姓名或類型)的信息。

+0

你需要完整的源代碼才能工作。如果鏈接器看不到引用,則鏈接器可能會很好地去除所有RTTI信息。 – MSalters 2009-05-06 15:51:20

0

在C中,我通常會創建一個包含所有成員名稱,偏移量和大小的元結構。它看起來像這樣:

#define MEMBER(name,str) { #name, offsetof(struct str, name), sizeof(*(&((struct str *)(0))->name) } 
struct A { char *name, int offset; int size; } = { 
MEMBER(name,A), 
MEMBER(offset,A), 
MEMBER(size,A) 
}; 

然後,如果需要創意鑄塑,您可以列出結構的所有成員。

5

你不能。你所能做的就是檢查記憶,並嘗試猜測。

例如,指針值有時可以很容易找到,因爲它們通常在相同的「常規區域」。如果您有一個結構地址,請以數字方式查找「關閉」的值(平臺的指針大小,通常爲32或64位)。

在您的平臺上查找某些「常見」浮點數的位模式並查找這些數值也許值得研究。在這裏,當然知道應用程序和/或領域的幫助,或許有一些「應該」存在的價值,那麼這些價值就是尋找的自然事物。

如果您有權訪問接受和/或返回結構的API中的任何函數,那麼您可能需要嘗試調用它們並檢查差異,這可以爲正在發生的事情提供線索。

在該說明中,您當然也可以遍歷首先分配/創建結構的代碼,以查看它在哪裏執行的操作。

1

我會說,無論你想要做什麼,有一個更好的方法。

相關問題