Мне нужно извлечь определения структуры из исполняемого файла. Как я могу это сделать? Я читал, что мы можем сделать это с помощью ELF, но не уверен, как это сделать. Любая помощь здесь?
Извлечь определения структуры из исполняемого файла
Ответы (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
(пример) были получены с помощью таких методов.
Насколько я знаю, вы не можете. Программы c/c++ не похожи на java, структуры не получают символ. Их просто определения для вашего компилятора о том, как выровнять и упаковать переменные в кадрах стека или какой-либо другой памяти (члены данных структуры). Например, в отличие от java, у вас нет того, что напоминает загрузку классов при загрузке общих объектов (файл заголовка не включен в вашу программу c), вы можете загружать только глобальные переменные и функции. Определение структуры во многом похоже на создание некоторого типа данных, его определение должно присутствовать только для компиляции, вы не получаете символ в symtable для int
или char
, тогда зачем вам для какой-то структуры? Это просто не имеет смысла. Символы, предназначенные исключительно для объектов, которые ваш компилятор не распознает во время компиляции - время компоновки/время загрузки/время выполнения
ptype
- person tristan   schedule 10.08.2016