0 votes

Débogueur simple, vous voulez travailler ?

Je lis le Gray Hat Python, et j'attrape ça : :

class debugger():
    def __init__(self):
        self.h_process = None
        self.pid = None
        self.debugger_active = False

    def load(self,path_to_exe):
        creation_flags = DEBUG_PROCESS
        startupinfo = STARTUPINFO()
        process_information = PROCESS_INFORMATION()
        startupinfo.dwFlags = 0x1
        startupinfo.wShowWindows = 0x0
        startupinfo.cb = sizeof(startupinfo)
        if kernel32.CreateProcessA(path_to_exe,
                                   None,
                                   None,
                                   None,
                                   None,
                                   creation_flags,
                                   None,
                                   None,
                                   byref(startupinfo),
                                   byref(process_information)):
            print "[*] We have successfully launched the process!"
            print "[*] PID: %d"%(process_information.dwProcessId)
            self.h_process = self.open_process(process_information.dwProcessId)

        else:
            print "[*] Error: 0x%08x."%(kernel32.GetLastError())

    def open_process(self,pid):
        h_process = self.open_process(pid)
        if kernel32.DebugActiveProcess(pid):
            self.debugger_active = True
            self.pid = int(pid)
            self.run()
        else:
            print "[*] Unable to attach to the process."

    def run(self):
        while self.debugger_active == True:
            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.ContinueDebugEvent( \
                debug_event.dwProcessId, \
                debug_event.dwThreadId, \
                continue_status )
    def detach(self):
        if kernel32.DebugActiveProcessStop(self.pid):
            print "[*] Finished debugging. Exiting..."
            return True
        else:
            print "There was an error"
            return False

lors de l'exécution de mon_test.py : :

import my_dbg

debugger = my_dbg.debugger()
pid = raw_input('Enter the PID of the process to attach to: ')
debugger.open_process(int(pid))
debugger.detach()

Je reçois cette erreur : :

Traceback (most recent call last):
  File "C:/Python26/dbgpy/my_test.py", line 5, in <module>
    debugger.attach(int(pid))
  File "C:/Python26/dbgpy\my_dbg.py", line 37, in attach
    h_process = self.attach(pid)
  ...........
  ...........
  ...........
  File "C:/Python26/dbgpy\my_dbg.py", line 37, in attach
    h_process = self.attach(pid)
  File "C:/Python26/dbgpy\my_dbg.py", line 37, in attach
    h_process = self.attach(pid)
RuntimeError: maximum recursion depth exceeded

c'est à cause de la boucle et de quelque chose d'autre, mais qu'est-ce que c'est ? Je fonctionne sous Windows avec Python2.6.4. :)

Mise à jour : :

J'ai trouvé le problème, merci à tous, ce code fonctionne très bien :)

from ctypes import *
from my_dbg_def import *
kernel32 = windll.kernel32
class debugger():
    def __init__(self):
        self.h_process = None
        self.pid = None
        self.debugger_active = False

    def open_process(self,pid):
        h_process = kernel32.OpenProcess(PROCESS_ALL_ACCESS,pid,False)
        return h_process

    def attach(self,pid):

        self.h_process = self.open_process(pid)

        if kernel32.DebugActiveProcess(pid):
            self.debugger_active = True
            self.pid = int(pid)

        else:
            print "[*] Unable to attach to the process."

    def run(self):
        while self.debugger_active == True:
            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.ContinueDebugEvent( \
            debug_event.dwProcessId, \
            debug_event.dwThreadId, \
            continue_status )
    def detach(self):
        if kernel32.DebugActiveProcessStop(self.pid):
            print "[*] Finished debugging. Exiting..."
            return True
        else:
            print "There was an error"
            return False

1voto

Roberto Liffredo Points 15265

Je suppose qu'à un moment donné, vous avez changé le nom de attach en open_process (comme il semble d'après la sortie du traceback).
Dans ce cas, l'erreur se situe ici :

def open_process(self,pid): 
    h_process = self.open_process(pid) 

Comme vous pouvez le voir, il s'appelle lui-même de manière récursive.
Il me semble que vous l'avez pour un copier/coller, donc vous pouvez peut-être le supprimer sans risque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X