Предположим, что у меня есть динамическая библиотека (.so) для Linux. У меня также есть существующее приложение, которое использует библиотеку. Библиотека лишена. Я хотел бы создать некоторый (приблизительный) заголовочный файл для библиотеки, чтобы я мог написать другую программу, которая его использует.Как переделать библиотеку C?
Достаточно просто использовать objdump, чтобы увидеть, какие функции находятся в библиотеке, и ltrace, чтобы видеть каждый вызов, когда он выполняется.
Как узнать, что представляют собой аргументы функции?
Некоторые идеи. Возможно, я могу использовать метод LD_PRELOAD или dlsym, чтобы загрузить библиотеку прокладки, которая смотрит на стек всякий раз, когда в исходной библиотеке вызывается любая функция. Возможно, я тоже могу что-то сделать в прокладке, которая сбрасывает регистры (это на ARM, так что это будет r0-r3, я полагаю). С большим количеством работы (если посмотреть на разборку), возможно, будет также выяснено, содержит ли регистр указатель, который будет разыменован, а затем дамп функции прокладки, который находится на этом указателе.
Похоже, что большой шаг оттуда «эта функция принимает в качестве первого аргумента указатель на структуру со следующими полями ...» Есть ли какие-либо автоматизированные инструменты для такого рода вещей?
Примечание: меня совсем не интересуют, как работают функции, как правильно их подавать.
Я не думаю, что это может быть эффективно автоматизированы. Вам почти наверняка придется прорываться через реализации функций, чтобы увидеть, как используются каждый аргумент, и обратитесь к соответствующему спецификатору ABI, чтобы сопоставить «int32 in r0, указатель на материал в [sp-8]» на подпись функции C. – delnan
@ delnan: Такие вещи звучат, как скрипт, может это сделать, нет? По крайней мере, сценарий, который довольно умен по отношению к ABI и сборке синтаксического анализа. (Кроме того, он может использовать данные при запуске приложения: которые могут включать, например, какие точные байты памяти были прочитаны или записаны функцией :) –