2014-01-30 4 views
6

Предположим, что у меня есть динамическая библиотека (.so) для Linux. У меня также есть существующее приложение, которое использует библиотеку. Библиотека лишена. Я хотел бы создать некоторый (приблизительный) заголовочный файл для библиотеки, чтобы я мог написать другую программу, которая его использует.Как переделать библиотеку C?

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

Как узнать, что представляют собой аргументы функции?

Некоторые идеи. Возможно, я могу использовать метод LD_PRELOAD или dlsym, чтобы загрузить библиотеку прокладки, которая смотрит на стек всякий раз, когда в исходной библиотеке вызывается любая функция. Возможно, я тоже могу что-то сделать в прокладке, которая сбрасывает регистры (это на ARM, так что это будет r0-r3, я полагаю). С большим количеством работы (если посмотреть на разборку), возможно, будет также выяснено, содержит ли регистр указатель, который будет разыменован, а затем дамп функции прокладки, который находится на этом указателе.

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

Примечание: меня совсем не интересуют, как работают функции, как правильно их подавать.

+1

Я не думаю, что это может быть эффективно автоматизированы. Вам почти наверняка придется прорываться через реализации функций, чтобы увидеть, как используются каждый аргумент, и обратитесь к соответствующему спецификатору ABI, чтобы сопоставить «int32 in r0, указатель на материал в [sp-8]» на подпись функции C. – delnan

+0

@ delnan: Такие вещи звучат, как скрипт, может это сделать, нет? По крайней мере, сценарий, который довольно умен по отношению к ABI и сборке синтаксического анализа. (Кроме того, он может использовать данные при запуске приложения: которые могут включать, например, какие точные байты памяти были прочитаны или записаны функцией :) –

ответ

3

Хороший старт - это дизассемблер, например, Objdump, HopperApp или IDA Pro. Последний из них автоматически определяет параметры для неспецифических случаев.

Если вы хотите сами понять, как это работает, я бы рассмотрел различные «соглашения о вызовах» (википедия - хорошее начало).

Пример __stdcall: скажем, у вас есть x86 .so библиотеки и что-то подобное происходит в двоичном:

push 3 
push 2 
push 1 
call func ; void func(int a, int b, int c) where a=1, b=2 and c=3 

Аргументы помещаются в стек в обратном порядке. EAX, ECX и EDX могут использоваться внутри функции (сохраненной вызывающим абонентом), другие регистры должны быть явно сохранены из самой функции (сохраненной вызываемым абонентом). Это ничего не говорит о типе данных за аргументом. Для этого требуется еще некоторое обратное решение.

Даже IDA Pro не обнаруживает каждую информацию автоматически, потому что это зависит от многих факторов и может быть очень трудно :)

+1

Если вы хотите попробовать сценарий, как вы описали самостоятельно, я бы порекомендовал библиотека, подобная capstone-engine с привязками к python. – japedo

Смежные вопросы