0

问题:

我正在尝试获取LoadLibraryW但得到的地址NULL

研究努力:

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

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.

4

2 回答 2

0

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

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

像这样把它们放在一起:

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)
于 2019-08-25T11:48:34.853 回答
0

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

它看起来像一个XY 问题
您不需要调用这 2 个函数中的任何一个,ctypes会为您执行此操作

这是您实现的替代方案(请注意,我没有进行异常处理):

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)。

于 2019-08-25T14:01:55.040 回答