Windows API, Python3, kernel32.GetModuleHandleA() 调用失败

Windows API, Python3, kernel32.GetModuleHandleA() call fails

我正在通过 Justin Seitz 的 Gray Hat Python 工作,但我无法使此示例代码正常工作。程序依附于进程;但是,当模块 func_resolve() 被调用时 kernel32.GetModuleHandleA() returns NULL。然后我无法获得 printf().

的内存地址

这是调试器的一部分 class:

    def func_resolve(self,dll,function):

    handle  = kernel32.GetModuleHandleA(dll)
    error = kernel32.GetLastError()
    if handle == False:
        print("kernel32.GetModuleHandleA() failed! Error: %d" % error)
    address = kernel32.GetProcAddress(handle, function)
    error = kernel32.GetLastError()
    if address == False:
        print("kernel32.GetProcAddress() failed! Error: %d" % error)
    kernel32.CloseHandle(handle)

    return address

错误信息的输出:

kernel32.GetModuleHandleA() failed! Error: 126

来自我的测试工具的函数调用:

printf_address = debugger.func_resolve("msvcrt.dll", "printf")

我为测试附加的 printf 循环:

from ctypes import *
import time
msvcrt  = cdll.msvcrt
counter = 0
while 1:
    msvcrt.printf(b"Loop iteration: ")
    msvcrt.printf("%d" % counter)
    msvcrt.printf("\n")
    time.sleep(2)
    counter += 1

问题与the one here非常相似,但我使用的是Python3.4,而不是书籍Python2.5,我的环境是windows XP in virtualbox。他还尝试使用 'msvcr100' 并通过切换到 'msvcrt' 解决了问题,这是本书使用的,我一直在使用。

objective是获取printf()的地址在那里设置断点,看着他们程序循环重复调用printf().

编辑:使用进程浏览器我也刚刚验证了进程加载了 msvcrt.dll。

问题是 Python3.4 将字符串作为 Unicode 而不是 ASCII 传递。对函数调用的以下更改解决了问题:

dll = "msvcrt.dll".encode('ascii')
function = "printf".encode('ascii')
printf_address = d.func_resolve(dll, function)

我最初是在 func_resolve():

中写的
handle = kernel32.GetModuleHandleW(dll)

并且仍然遇到我发布的原始问题,不确定为什么它不能正确处理 Unicode 字符串。