我正在使用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。
答案 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字符串。