我正在用python加载动态库,为简单起见,我们说glibc:
>>> 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。我想知道如何为函数检索正确的偏移量?
对于glibc,仅查找符号并传递它们各自的地址似乎不起作用。所以我可能会丢失一些东西。
不确定在Linux中是否等效,但是Windows具有dumpbin
列出DLL的导出,并且可以使用导出的序号: