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 字符串。
我正在通过 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 字符串。