Я загружаю динамическую c библиотеку в python, для простоты, скажем, glib c:
>>> import ctypes
>>> libc = ctypes.CDLL("libc.so.6")
Доступ к функциям из этой библиотеки обычно работает путем указания символа, т.е.
>>> libc.system(b"whoami")
Источник этой функции выглядит следующим образом (из /usr/lib/python3.7/ctypes/__init__.py
):
366 def __getattr__(self, name):
367 if name.startswith('__') and name.endswith('__'):
368 raise AttributeError(name)
369 func = self.__getitem__(name)
370 setattr(self, name, func)
371 return func
372
373 def __getitem__(self, name_or_ordinal):
374 func = self._FuncPtr((name_or_ordinal, self))
375 if not isinstance(name_or_ordinal, int):
376 func.__name__ = name_or_ordinal
377 return func
Поэтому я подозреваю, что вы также можете указать смещение для вызова функции, то есть что-то вроде этого:
>>> libc[0xabcd](b"foo")
Однако я всегда сталкиваюсь с определенным SEGFAULT при попытке сделать это. Мне было интересно, как я могу получить правильное смещение для функции?
В случае с glib c простой поиск символов и передача их соответствующего адреса, похоже, не работает. Так что я, наверное, что-то упускаю.