簡體   English   中英

如何在不知道名稱的情況下訪問C結構的成員?

[英]How would you access a C structure's members without knowing the name?

我正在處理一個未記錄的API,我正在嘗試進行一些逆向工程 - 不要擔心這不是惡意的,只是試圖以創造性的方式完成一個用例。

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

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

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

例如,指針值有時可以很容易定位,因為它們通常位於相同的“一般區域”中。 如果你有一個struct的地址,那么在數值上查找“close”的值(平台的指針大小,通常是32位或64位)。

在您的平台上查找某些“常見”浮點數的位模式也可能值得研究一下。 在這里,應用程序和/或域幫助的知識當然可能有一些“應該”在那里的值,那些是那些自然要搜索的東西。

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

在這方面,你當然也可以逐步完成分配/創建結構的代碼,看看它在哪里做了什么。

不,沒有辦法僅僅從內存中確定struct成員的“結構”。

根據內存布局,您可以確定結構的結束位置,並通過了解結構在更高級別上執行的操作,您可以猜測成員(謹防對齊)。 但除非代碼附帶調試符號,否則知道名稱是沒有運氣的。 在那種情況下,這很容易。 在使用結構的地方打破並在調試器中檢查它。

編輯:
假設您確實找到了struct包含的成員,並且您也知道您的編譯器使用相同的對齊方式,那么您可以在代碼中定義結構的傳真,並使用指向結構的指針指向實際結構的地址。 然后,您可以在代碼中輕松訪問所有元素。

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

我會說無論你想做什么,都有更好的方法。

在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)
};

然后,如果需要,可以使用創意投射,列出結構的所有成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM