当我通过win32api致电GetProcAddress()
时,我成功获得了句柄,但ctypes
没有。
代码是:
from ctypes import windll
import win32api
KERNEL32 = windll.kernel32
h_kernel32 = KERNEL32.GetModuleHandleW('kernel32.dll')
print(hex(h_kernel32))
h_loadlib1=win32api.GetProcAddress(h_kernel32,'LoadLibraryW')
print(hex(h_loadlib1))
if not h_loadlib1:
print("NtCreateThreadEx Failed:",win32api.GetLastError())
h_loadlib2 = KERNEL32.GetProcAddress(h_kernel32,'LoadLibraryW')
print(hex(h_loadlib2))
if not h_loadlib2:
print("NtCreateThreadEx Failed:",win32api.GetLastError())
输出:
0x77250000
0x77266f80
0x0
NtCreateThreadEx Failed: 127
系统信息:
windows7 64,python 3.43
答案 0 :(得分:3)
您需要使用char字符串而不是python 3.x提供的默认Unicode字符串,如GetProcAddress文档所示(第二个参数是LPCSTR
,不是< / strong> LPCTSTR
或LPCWSTR
):
h_loadlib2 = KERNEL32.GetProcAddress(h_kernel32,'LoadLibraryW'.encode(encoding='ascii'))
或者,您可以传递一个字节:
h_loadlib2 = KERNEL32.GetProcAddress(h_kernel32, b'LoadLibraryW')
注意:上面的代码不能在python 64位解释器上工作(64位模块句柄中最重要的32位被置零)。在这种情况下,您需要将argtypes
和restype
用作explained in the tutorial(例如,通过定义64位HMODULE
类型)。