Как динамически вставлять функции C из Python в Linux (без LD_PRELOAD)?

Как мне, во время выполнения (нет LD_PRELOAD), перехватить / перехватить функцию C, например fopen() на Linux, а-ля Detours для Windows? Я хотел бы сделать это из Python (следовательно, я предполагаю, что программа уже работает на виртуальной машине CPython), а также перенаправить на код Python. Я в порядке, просто перехватывая функции общей библиотеки. Я также хотел бы сделать это без изменения способа запуска программы.

Одна идея состоит в том, чтобы свернуть мой собственный инструмент на основе ptrace()или при переписывании кода, найденного с dlsym() или в PLT, и нацеливание ctypesсгенерированные C-функции, но я подумал, что сначала спрошу здесь. Благодарю.

2 ответа

У одного из разработчиков ltrace вы найдете способ сделать это. Смотрите этот пост, который включает в себя полный патч, чтобы поймать динамически загруженную библиотеку. Чтобы вызвать его из python, вам, вероятно, понадобится создать модуль C.

google-perftools имеет собственную реализацию Detour в каталоге src / windows / preamble_patcher *. На данный момент это только окна, но я не вижу причин, по которым он не будет работать ни на одном компьютере с архитектурой x86, за исключением того факта, что он использует функции win32 для поиска адресов символов.

Быстрое сканирование кода, и я вижу, что используются следующие функции win32, все из которых имеют версии linux:

  • GetModuleHandle / GetProcAddress: получить адрес функции. Dlsym может сделать это.
  • VirtualProtect: разрешить модификацию сборки. mprotect.
  • GetCurrentProcess: getpid
  • FlushInstructionCache (по-видимому, нет, согласно комментариям)

Кажется, что это не так уж сложно собрать и связать в python, но я бы отправил сообщение разработчикам perftools и посмотрел, что они думают.

Другие вопросы по тегам