我正在学习如何在python中使用Windows 7上的ctype创建一个简单的调试器。我的问题是,下面给出的代码似乎返回了一个无效的地址(这是我对这个问题的猜测),但我不知道原因。我认为可能是因为返回的句柄在我的代码使用时不再有效,或者因为我只是提供"msvcrt.dll“作为模块,所以返回了一个与脚本无关的句柄。我做了很多修补工作,但到目前为止还没有找到解决方案。
编辑:地址返回为False。我从下面的片段中得到以下错误:
错误126 :找不到指定的模块。
def func_resolve(self, dll, function):
error = None
handle = kernel32.GetModuleHandleA(dll)
if handle == False:
print "Handle is FALSE"
error = GetLastError()
address = kernel32.GetProcAddress(handle, function)
if address == False:
print "Address is FALSE"
error = GetLastError()
if error is not None:
print "ERROR %d : %s" % (error, FormatError(error))
return False
kernel32.CloseHandle(handle)
return address上面的代码是从这个简短的测试脚本调用的:
import my_debugger
debugger = my_debugger.debugger()
pid = raw_input("Input PID of process to attach to: ")
debugger.attach(int(pid))
printf_address = debugger.func_resolve("msvcrt.dll", "printf")
print "[*] Address of printf: 0x%08x" % printf_address
debugger.bp_set(printf_address)
debugger.run()
debugger.detach()这是我要附加到的脚本:
from ctypes import *
import time
msvcrt = cdll.msvcrt
counter = 0
while True:
msvcrt.printf("Loop iteration %d /n", counter)
time.sleep(2)
counter += 1所以我运行上面的脚本,在任务管理器中找到PID,然后运行我的测试脚本并给它PID。我每次都得到以下输出。用户定义的printf断点永远不会到达,并且它的地址总是被指定为0x00000000,这似乎是不对的。
Input PID of process to attach to: 8124
Process PID: 8124
[*] Address of printf: 0x00000000
[*] Setting breakpoint at 0x00000000
[*] Waiting for debug events...
[*] Event Code: 3 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 6 Thread ID: 7664
[*] Event Code: 2 Thread ID: 7124
[*] Event Code: 1 Thread ID: 7124
[*] Exception address: 0x76e00590
[*] Hit the first breakpoint
[*] Event Code: 4 Thread ID: 7124有人能看出我做错了什么吗?如果需要的话我可以提供所有的代码。
发布于 2017-07-15 13:56:14
我还一直在阅读GreyHat的Python,并且顽固地将my_debugger.py文件转换为支持64位调试。我已经找到了解决这个问题的办法。
将func_resolve设置为如下所示:
def func_resolve(self,dll,function):
_GetModuleHandleA = kernel32.GetModuleHandleA
_GetModuleHandleA.restype = POINTER(c_void_p)
_GetProcAddress = kernel32.GetProcAddress
_GetProcAddress.restype = c_void_p
handle = _GetModuleHandleA(dll)
if handle is None:
print 'Error getting handle'
address = _GetProcAddress(handle, function)
if address is None:
print 'Error getting address'
kernel32.CloseHandle(handle)
return address这应该会为函数返回一个有效的64位地址。
发布于 2018-07-10 14:48:08
我正在使用本书作为模板在github中建立一个存储库,但更改为支持windows 10 redux/tree/master/chapter03上的redux/tree/master/chapter03,遇到了与其他评论中提到的相同的问题--使用了错误的DLL,我使用了以下方法来解决这个问题:
msvcrt = cdll[ctypes.util.find_msvcrt()]如果您确保无论何时要解析msvcrt,都可以使用它,那么您应该可以使用它。
https://stackoverflow.com/questions/28681717
复制相似问题