Как бы вы получили доступ к членам структуры C, не зная имени? - PullRequest
2 голосов
/ 06 мая 2009

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

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

Я подозреваю, что настоящие имена членов не доступны, но, возможно, они есть?

Ответы [ 6 ]

5 голосов
/ 06 мая 2009

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

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

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

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

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

4 голосов
/ 06 мая 2009

Нет, нет способа определить "структуру" struct членов просто по памяти.

3 голосов
/ 06 мая 2009

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

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

1 голос
/ 06 мая 2009

Я бы сказал, что вы пытаетесь сделать, есть лучший способ.

1 голос
/ 06 мая 2009

К сожалению, у вас нет информации о типах в C или C ++. В C ++ есть некоторые RTTI, которые позволяют dynamic_cast проверять правильность приведения вниз. Но это не дает информации о членах (имена или типы).

0 голосов
/ 06 мая 2009

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

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

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