Как вы можете получить доступ к членам C-структуры, не зная названия?

Я имею дело с недокументированным API, который я пытаюсь сделать немного обратной инженерии – не беспокойтесь, это не злонамеренно, просто пытайтесь реализовать прецедент в творческом ключе.

У меня есть указатель на структуру C. Есть ли способ для меня определить путем изучения памяти, сколько членов этой структуры имеет? Их ценности?

Я подозреваю, что фактические имена участников недоступны, но, может быть, они есть?

В зависимости от макета памяти вы можете определить, где заканчивается структура, и, зная, что структура делает на более высоком уровне, вы можете угадать членов (остерегайтесь выравнивания). Но нам не повезло узнать имена, если код не содержит символы отладки. В этом случае это легко. Перерыв где-нибудь, где используется структура, и проверить его в отладчике.

Редактировать:
Предположим, что вы выяснили, какие члены содержат содержащиеся в ней структуры, и вы также знаете, что ваш компилятор использует одно и то же выравнивание, тогда вы можете определить факсимиле структуры в своем коде и использовать указатель на свою структуру, чтобы указать на адрес реальной структуры , Затем вы можете легко получить доступ ко всем элементам кода.

Вы не можете. Все, что вы можете сделать, это проверить память и попытаться сделать догадки.

Например, значения указателей иногда могут быть легко найдены, так как они часто находятся в одной и той же «общей области». Если у вас есть адрес для структуры, найдите значения (размером указателя платформы, обычно 32 или 64 бит), которые «близки», численно.

Также может быть полезно изучить, что битпаттерн для некоторых «общих» чисел с плавающей запятой, на вашей платформе, и искать их. Разумеется, знание приложения и / или домена помогает, возможно, есть некоторые ценности, которые «должны» быть там, тогда это естественные вещи для поиска.

Если у вас есть доступ к любым функциям API, которые принимают и / или возвращают структуру, вы можете попробовать позвонить им и проверить различия, которые могут дать ключ к тому, что происходит.

В этой заметке вы можете, конечно, также пройти через код, который выделяет / создает структуру в первую очередь, чтобы видеть, что она делает где.

Нет, нет возможности определить «структуру» членов 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) }; 

затем, при необходимости, с помощью творческого кастинга, вы можете перечислить всех членов структуры.