Python- GetProcAddress 使用 ctypes returns NULL
Python- GetProcAddress using ctypes returns NULL
问题:
我正在尝试获取 LoadLibraryW
的地址,但得到的是 NULL
。
研究成果:
函数成功检索映射到python进程的kernel32.dll
地址,但是returnsNULL
对于LoadLibraryW
地址有126 错误代码。
当我检查 hacker 进程中的函数地址时(在 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)
我尝试了其他库和其他功能,但总是 returns NULL
。
您需要在调用的函数上设置 argtypes
和 restype
属性,以便 ctypes
能够匹配原型。我想这是您代码中的主要问题。
在我看来,您还应该使用 Unicode API 作为一般规则。并且您不得在 GetModuleHandle
.
返回的句柄上调用 CloseHandle
像这样把它们放在一起:
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)
清单[Python 3.Docs]: ctypes - A foreign function library for 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)。
问题:
我正在尝试获取 LoadLibraryW
的地址,但得到的是 NULL
。
研究成果:
函数成功检索映射到python进程的kernel32.dll
地址,但是returnsNULL
对于LoadLibraryW
地址有126 错误代码。
当我检查 hacker 进程中的函数地址时(在 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)
我尝试了其他库和其他功能,但总是 returns NULL
。
您需要在调用的函数上设置 argtypes
和 restype
属性,以便 ctypes
能够匹配原型。我想这是您代码中的主要问题。
在我看来,您还应该使用 Unicode API 作为一般规则。并且您不得在 GetModuleHandle
.
CloseHandle
像这样把它们放在一起:
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)
清单[Python 3.Docs]: ctypes - A foreign function library for 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)。