Получить доступные функции библиотеки во время выполнения - PullRequest
0 голосов
/ 15 января 2019

Я работаю с динамически связанными библиотеками (.dll) в Windows или общими объектами (.so) в Linux.

Моя цель - написать некоторый код, который может - дать абсолютный путь к библиотеке на диске - вернуть список всех экспортируемых функций (таблица экспорта) этой библиотеки и, в конечном итоге, иметь возможность вызывать эти функции. Это должно работать на Windows (с DLL), а также на Linux (с так).

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

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

По этой теме я нашел этот вопрос , имеющий дело только с той же проблемой, что и для конкретного решения Linux. В данном ответе сказано

Для этого нет функции libc. Однако вы можете написать его самостоятельно (или скопировать / вставить код из такого инструмента, как readelf).

Это ясно указывает на то, что есть инструменты для того, что я ищу. Вопрос только в том, может ли он работать как на Windows, так и на Linux? Если нет, то как бы я поступил об этом самостоятельно?


Здесь - реализация C # (на самом деле это код, который я хочу перенести на C ++), делающая то, что я хочу (хотя только для окон). Для меня это выглядит так, как будто структура библиотеки обрабатывается вручную. Если это путь, то где я могу найти необходимую информацию о структуре библиотеки?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Итак, зная теперь, что

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

все становится намного проще: вам на самом деле не нужно получать список экспорта. Это проще и быстрее просто попробовать.

Таким образом, в любой системе POSIX (включая подсистему POSIX Windows и Linux) dlopen откроет библиотеку и загрузит таблицу символов, а dlsym найдет символ из этой таблицы. Если этого символа нет в таблице, он просто возвращает NULL. Итак, у вас уже есть все таблицы, которые вы считаете нужными; просто не явно, но с запросом.

0 голосов
/ 15 января 2019

Таким образом, в unixoids (а Linux и WinNT имеют подсистему posix), функцию dlopen можно использовать для загрузки динамической библиотеки и получения указателей на известных символов по имени этого символа. .

Насколько мне известно, получение списка символов никогда не было тем аспектом, который POSIX пытался определить, так что вкратце, функции, которые могут сделать это для вас в Linux, специфичны для используемого там libc (GNU libc, в основном ), а на винде к тамошнему libc. Переносимый код означает наличие разных кодовых баз для двух разных библиотек!

Если вы не хотите зависеть от вашего libc, вам потребуется анализатор двоичных объектов (для общих библиотек ELF в Linux, PE в Windows) для считывания имен символов из файлы. На самом деле их много - очевидно, у WINE есть один для PE, который является переносимым (особенно работает на Linux), и каждый компоновщик (включая компоновщик времени выполнения glibc) в Linux может анализировать файлы ELF.

Лично radare2 - это прекрасный фреймворк для обратного инжиниринга с множеством языковых привязок, который фактически предназначен для анализа двоичных файлов и дает вам экспортированные символы (а также способен извлекать неэкспортированные функции, создавать графы вызовов и т. Д.). ). У него есть отладчик, то есть функции перехода в функции.

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