Как динамически вставлять функции C из Python в Linux (без LD_PRELOAD)? - PullRequest
11 голосов
/ 04 февраля 2011

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

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

Ответы [ 2 ]

2 голосов
/ 24 января 2012

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

2 голосов
/ 12 февраля 2011

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

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

  • GetModuleHandle / GetProcAddress: получить адрес функции. Это может сделать dlsym.
  • VirtualProtect: разрешить изменение сборки. mprotect.
  • GetCurrentProcess: getpid
  • FlushInstructionCache (судя по комментариям nop)

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

...