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

时间:2015-05-02 21:45:03

标签: winapi python-3.x

我正在使用Justin Seitz的Gray Hat Python,我无法让这个示例代码工作。该计划附属于该进程;但是,当调用模块func_resolve()时,kernel32.GetModuleHandleA()会返回NULL。然后我无法获得printf()的内存地址。

这是调试器类的一部分:

    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()失败了!错误: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。他还试图使用'msvcr100'并通过切换到'msvcrt'来解决问题,这是本书使用的,我一直在使用。

目标是获取printf()的地址以在那里设置断点,并在程序循环重复调用printf()时观察它们。

编辑:使用进程资源管理器我还刚刚验证了进程加载了msvcrt.dll。

1 个答案:

答案 0 :(得分:1)

问题在于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字符串。