Извлечь определения структуры из исполняемого файла

Мне нужно извлечь определения структуры из исполняемого файла. Как я могу это сделать? Я читал, что мы можем сделать это с помощью ELF, но не уверен, как это сделать. Любая помощь здесь?


person Anup Buchke    schedule 09.08.2016    source источник
comment
если в вашем двоичном файле есть отладочная информация, просто используйте команду gdb ptype   -  person tristan    schedule 10.08.2016
comment
мой подход к получению структуры из необработанной памяти состоит в том, чтобы прочитать документацию по параметрам функции и начать оттуда, большинство параметров функций для структур указывают на адрес памяти.   -  person rcd    schedule 16.08.2016


Ответы (2)


Я читал, что мы можем сделать это с помощью ELF, но не уверен, как это сделать.

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

Это относится не только к ELF: многие другие форматы исполняемых файлов (например, COFF) также позволяют встраивать отладочную информацию.

Кроме того, формат этой отладочной информации отличается для разных платформ. Некоторыми из распространенных UNIX-систем являются DWARF и STABS (при этом DWARF более новая и гораздо более мощная).

Если у вас есть двоичный файл ELF и вы подозреваете, что он может содержать DWARF отладочную информацию, вы можете расшифровать его с помощью readelf -wi a.out (будьте готовы к тому, что информации будет много, если она вообще присутствует) . objdump -g можно использовать для декодирования STABS (последние версии objdump также могут декодировать DWARF).

Или, как предложил Тристан, вы можете загрузить исполняемый файл в GDB и использовать команды info types и ptype.

Если двоичный файл не содержит отладочной информации, то ответ DrPrItay правильный: вы не можете легко восстановить из него определения структуры. Однако вы по-прежнему можете восстановить их с помощью методов обратного проектирования. Например, многие определения структур, используемые проектом Wine (пример) были получены с помощью таких методов.

person Employed Russian    schedule 14.08.2016

Насколько я знаю, вы не можете. Программы c/c++ не похожи на java, структуры не получают символ. Их просто определения для вашего компилятора о том, как выровнять и упаковать переменные в кадрах стека или какой-либо другой памяти (члены данных структуры). Например, в отличие от java, у вас нет того, что напоминает загрузку классов при загрузке общих объектов (файл заголовка не включен в вашу программу c), вы можете загружать только глобальные переменные и функции. Определение структуры во многом похоже на создание некоторого типа данных, его определение должно присутствовать только для компиляции, вы не получаете символ в symtable для int или char, тогда зачем вам для какой-то структуры? Это просто не имеет смысла. Символы, предназначенные исключительно для объектов, которые ваш компилятор не распознает во время компиляции - время компоновки/время загрузки/время выполнения

person DrPrItay    schedule 10.08.2016
comment
Насколько я знаю, вы не можете. -- Вам еще многому предстоит научиться. - person Employed Russian; 14.08.2016