kernel32.GetModuleHandleA返回奇怪值

2024-09-26 21:58:23 发布

您现在位置:Python中文网/ 问答频道 /正文

通过使用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")

Tags: 代码pyimportmain地址syswmidll
2条回答

清单[Python.Docs]: ctypes - A foreign function library for Python

您的代码存在一些问题:

  1. 主要的一点是:

    要克服这个问题,您应该使用:kernel32.GetModuleHandleW。例如:

    >>> import ctypes as ct
    >>> # kernel32 is alsready loaded
    >>> ct.windll.kernel32.GetModuleHandleA("kernel32")
    0
    >>> ct.windll.kernel32.GetModuleHandleW("kernel32")
    -1613692928
    
  2. 有关通过CTypes.dll调用函数的详细信息,请查看[SO]: C function called from Python via ctypes returns incorrect value (@CristiFati's answer)(特别是,您应该将重新类型设置为64位值,例如wintypes.HMODULE

  3. 没有必要使用GetModuleHandle(使前面的两个项目对这个特定案例没有意义,但我留下了它们,因为它们包含有用的一般信息)。您可以简单地使用load_addr = windll.LoadLibrary(sys.argv[1])._handle

  4. 参数验证应为1st

确保定义与ctypes一起使用的函数的.argtypes.restypeGetModuleHandleALPCSTR(相当于Python中的bytes对象),而GetModuleHandleWLPCWSTR(相当于Python中的str对象)。此外,它们都返回HDMODULE,这是64位系统的64位值,但如果未指定,则默认.restypec_int(32位)

以下是调用任一版本的正确代码:

import ctypes as ct
from ctypes import wintypes as w

k32 = ct.WinDLL('kernel32')
k32.GetModuleHandleA.argtypes = w.LPCSTR,
k32.GetModuleHandleA.restype = w.HMODULE
k32.GetModuleHandleW.argtypes = w.LPCWSTR,
k32.GetModuleHandleW.restype = w.HMODULE

wmi = ct.WinDLL('wmi')

print(k32.GetModuleHandleA(b'wmi'))  # byte string
print(k32.GetModuleHandleW('wmi'))   # Unicode string
print(k32.GetModuleHandleA('wmi'))   # calling with wrong type

下面是示例输出。注意:该值大于32位值所能容纳的值(>;4294967295),如果未设置.restype,则该值将被截断且不正确,如果未设置.argtypes,则不会出现错误消息

1864530853888
1864530853888
Traceback (most recent call last):
  File "C:\test.py", line 15, in <module>
    print(k32.GetModuleHandleA('wmi'))
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

相关问题 更多 >

    热门问题