通过使用python main.py wmi.dll
运行下面的python代码,我想获得DLL的加载地址。然而,loadAddr
的值是0
。代码中有什么错误
from ctypes import *
import sys
import string
kernel32 = windll.kernel32
print(kernel32)
if len(sys.argv)!=2:
print("Usage : dll.py<DLL to resolve>")
sys.exit(0)
windll.LoadLibrary(sys.argv[1])
loadAddr = kernel32.GetModuleHandleA(sys.argv[1])
print(str(loadAddr)+"\n")
print(sys.argv[1])
print(hex(loadAddr) + " Load Address")
print(hex(loadAddr + int("0x1000",16)) + " Text segment")
清单[Python.Docs]: ctypes - A foreign function library for Python
您的代码存在一些问题:
主要的一点是:
要克服这个问题,您应该使用:kernel32.GetModuleHandleW。例如:
有关通过CTypes从.dll调用函数的详细信息,请查看[SO]: C function called from Python via ctypes returns incorrect value (@CristiFati's answer)(特别是,您应该将重新类型设置为64位值,例如wintypes.HMODULE)
没有必要使用GetModuleHandle(使前面的两个项目对这个特定案例没有意义,但我留下了它们,因为它们包含有用的一般信息)。您可以简单地使用
load_addr = windll.LoadLibrary(sys.argv[1])._handle
参数验证应为1st
确保定义与
ctypes
一起使用的函数的.argtypes
和.restype
GetModuleHandleA
取LPCSTR
(相当于Python中的bytes
对象),而GetModuleHandleW
取LPCWSTR
(相当于Python中的str
对象)。此外,它们都返回HDMODULE
,这是64位系统的64位值,但如果未指定,则默认.restype
为c_int
(32位)以下是调用任一版本的正确代码:
下面是示例输出。注意:该值大于32位值所能容纳的值(>;4294967295),如果未设置
.restype
,则该值将被截断且不正确,如果未设置.argtypes
,则不会出现错误消息相关问题 更多 >
编程相关推荐