首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ctype的GetProcAddress返回NULL

使用ctype的GetProcAddress返回NULL
EN

Stack Overflow用户
提问于 2019-08-25 08:48:29
回答 2查看 1K关注 0票数 0

问题:

我想知道LoadLibraryW的地址,但得到了NULL

研究工作:

该函数成功检索映射到python进程的kernel32.dll地址,但返回包含126个错误代码的LoadLibraryW地址的NULL。当我检查进程黑客中的函数地址(在python进程下)时,我会看到一个有效的地址。

代码语言:javascript
复制
from ctypes import *
kernel32 = windll.kernel32

def resolve_function(dll, func):
    handle = kernel32.GetModuleHandleA(dll.encode("ascii"))
    address = kernel32.GetProcAddress(handle, func.encode("ascii"))
    kernel32.CloseHandle(handle)
    return address


address = resolve_function('kernel32.dll', 'LoadLibraryW')
print(address)

我尝试了其他库和其他函数,但它总是返回NULL

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-25 11:48:34

您需要在调用的函数上设置argtypesrestype属性,以便ctypes能够匹配原型。我想这是您代码中的主要问题。

在我看来,您还应该使用Unicode API作为一般规则。您不能对CloseHandle返回的句柄调用GetModuleHandle

把它们放在一起,就像这样:

代码语言:javascript
复制
from ctypes import *
kernel32 = windll.kernel32

def resolve_function(dll, func):
    kernel32.GetModuleHandleW.argtypes = [c_wchar_p]
    kernel32.GetModuleHandleW.restype = c_void_p
    kernel32.GetProcAddress.argtypes = [c_void_p, c_char_p]
    kernel32.GetProcAddress.restype = c_void_p
    handle = kernel32.GetModuleHandleW(dll)
    address = kernel32.GetProcAddress(handle, func)
    return address

address = resolve_function('kernel32.dll', b'LoadLibraryW')
print(address)
票数 0
EN

Stack Overflow用户

发布于 2019-08-25 14:01:55

清单[Python3.Docs]:ctypes Python的外部函数库

看起来像是XY问题。

--您不需要调用这两个函数中的任何一个-- ctype为您提供

这里有一个替代您的实现(请注意,我没有异常处理):

代码语言:javascript
复制
import ctypes


def resolve_function(dll_name, func_name, dll_factory=ctypes.CDLL):
    dll = dll_factory(dll_name)
    return getattr(dll, func_name, None)

这是跨平台(也将在Nix上工作)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57644565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档