ctypes._FuncPtr接受哪个偏移量作为输入?

问题描述 投票:0回答:1

我正在用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,仅查找符号并传递它们各自的地址似乎不起作用。所以我可能会丢失一些东西。

python ctypes python-3.7
1个回答
0
投票

不确定在Linux中是否等效,但是Windows具有dumpbin列出DLL的导出,并且可以使用导出的序号:

© www.soinside.com 2019 - 2024. All rights reserved.