我正在阅读《灰帽Python》 我从书上复制了代码,但它似乎不起作用。 其他人也对这本书有疑问,但还没有达到我现在的阶段。 我从这里复制了书中所述的 my_debugger_defines.py:http://dpunkt.de/leseproben/3245/Quellcodes.zip 里面也有一个my_debugger.py,我也试过了,不行。 是的,我根据需要使用 Python 2.5 问题是它输出:“[*]无法附加到进程。 有一个错误” 老实说,我不知道问题出在哪里。 这是我的 my_debugger.py 版本(不用担心德语注释)
from ctypes import *
from my_debugger_defines import *
kernel32 = windll.kernel32
class debugger():
def __init__(self):
self.h_process = None
self.pid = None
self.debugger_active = False
def load(self, path_to_exe):
#Bestimmt wie der Prozess zu erzeugen ist, zb CREATE_NEW_CONSOLE
creation_flags = DEBUG_PROCESS
#Strukturen instanzieren
startupinfo = STARTUPINFO()
process_information = PROCESS_INFORMATION()
#die beiden flags ermoeglichen es den prozess in einem eigenen fenster da zu stellen
startupinfo.dwFlags = 0x1
startupinfo.wShowWindow = 0x0
#cb Countbyte
startupinfo.cb = sizeof(startupinfo)
if kernel32.CreateProcessA(path_to_exe,
None,
None,
None,
None,
creation_flags,
None,
None,
byref(startupinfo),
byref(process_information)
):
print "[*] Process erfolgreich gestarted"
print "[*] PID: %d" % process_information.dwProcessId
else:
print "[*] Erorr: 0x%08x" % kernel32.GetLastError()
#Anfordern des gewuenschten Access fuer einen Prozess mit der angegeben pid
def open_process(self, pid):
h_process = kernel32.OpenProcess(PROCESS_ALL_ACCESS,False,pid)
return h_process
def attach(self, pid):
#oeffnen des Processhandels mit dem gewuenschten recht
self.h_process = self.open_process(pid)
#Versuch sich an den Process anzukopeln
if kernel32.DebugActiveProcess(pid):
self.debugger_active = True
self.pid = int(pid)
else:
print "[*] Unable to attach to the process"
def run(self):
#Waren auf DebugEvents
while self.debugger_active:
self.get_debug_event()
def get_debug_event(self):
debug_event = DEBUG_EVENT()
continue_status = DBG_CONTINUE
if kernel32.WaitForDebugEvent(byref(debug_event), INFINITE):
raw_input("Press a key to continue...")
self.debugger_active = False
kernel32.ContiuneDebugEvent(\
debug_event.dwProcessId, \
debug_event.dwThreadId, \
continue_status)
def detach(self):
if kernel32.DebugActiveProcessStop(self.pid):
print "[*] Finished debugging. Exiting..."
return True
else:
print "Error"
return False
这是我测试它的代码
import my_debugger
debugger = my_debugger.debugger()
pid = raw_input("Enter PID of process to attach to:")
debugger.attach(int(pid))
debugger.detach()
感谢您的帮助:)
如果您运行的是 Windows 7(64 位操作系统),请在 Windows/sysWOW64 目录下运行 calc,这是 32 位文件,您可以通过查看任务管理器来判断 calc 的 32 位版本,它会显示*32 旁边的 32 位版本,无论如何,当我使用该计算器时,该程序对我有用
我刚刚使用 Window 7 遇到了这个问题,这与这些调试功能不适用于 64 位程序有关。
您可以通过更改线路来获得有关错误的报告,如下所示:
print "[*] Unable to attach to the process [%d] - %s" % (int(pid), FormatError(kernel32.GetLastError()))
如果您尝试附加到除您的用户之外的其他用户(例如 SYSTEM)拥有的 32 位程序,则该程序不起作用 - 您会收到“访问被拒绝”的消息。
我在“Immunity Debugger”上尝试了它(例如,我加载了 Immunity 并附加到其进程),这确实有效,所以我认为它适用于您拥有的所有 *32 进程。
我也在用 C 语言编写一个简单的调试器。但当我使用 DebugActiveProcess(pi.dwProcessId) 时,它显示错误代码 87。我的程序的问题是位。这取决于您是否在 64 位操作系统上以 64 位模式编译调试器。由于Python是一种解释性语言,你必须了解它是如何编译的。如果Python是32位编译的,那么你必须选择32位程序进行调试