Exemplo n.º 1
0
    def _handle_create_process(self, debug_event):
        """Handle CREATE_PROCESS_DEBUG_EVENT"""
        create_process = debug_event.u.CreateProcessInfo
        # Duplicate handle, so garbage collection of the process/thread does not
        # break the debug API invariant (those x_event handle are close by the debug API  itself)
        proc_handle = HANDLE()
        thread_handle = HANDLE()
        cp_handle = windows.current_process.handle
        winproxy.DuplicateHandle(cp_handle,
                                 create_process.hProcess,
                                 cp_handle,
                                 ctypes.byref(proc_handle),
                                 dwOptions=DUPLICATE_SAME_ACCESS)
        winproxy.DuplicateHandle(cp_handle,
                                 create_process.hThread,
                                 cp_handle,
                                 ctypes.byref(thread_handle),
                                 dwOptions=DUPLICATE_SAME_ACCESS)

        self.current_process = WinProcess._from_handle(proc_handle.value)
        self.current_thread = WinThread._from_handle(thread_handle.value)

        self.threads[self.current_thread.tid] = self.current_thread
        self._explicit_single_step[self.current_thread.tid] = False
        self._hardware_breakpoint[self.current_thread.tid] = {}
        self._breakpoint_to_reput[self.current_thread.tid] = []
        self.processes[self.current_process.pid] = self.current_process
        self._watched_pages[self.current_process.pid] = {}  #defaultdict(list)
        self.breakpoints[self.current_process.pid] = {}
        self._module_by_process[self.current_process.pid] = {}
        self._update_debugger_state(debug_event)
        self._setup_pending_breakpoints_new_process(self.current_process)
        self._setup_pending_breakpoints_new_thread(self.current_thread)
        with self.DisabledMemoryBreakpoint():
            return self.on_create_process(create_process)
Exemplo n.º 2
0
    def local_handle(self):
        """A local copy of the handle, acquired with ``DuplicateHandle``

        :type: :class:`int`"""
        if self.dwProcessId == windows.current_process.pid:
            return self.wValue
        res = HANDLE()
        winproxy.DuplicateHandle(self.process.handle, self.wValue, windows.current_process.handle, ctypes.byref(res), dwOptions=DUPLICATE_SAME_ACCESS)
        return res.value
Exemplo n.º 3
0
 def _handle_create_thread(self, debug_event):
     """Handle CREATE_THREAD_DEBUG_EVENT"""
     create_thread = debug_event.u.CreateThread
     # Duplicate handle, so garbage collection of the thread does not
     # break the debug API invariant (those x_event handle are close by the debug API  itself)
     thread_handle = HANDLE()
     cp_handle = windows.current_process.handle
     winproxy.DuplicateHandle(cp_handle,
                              create_thread.hThread,
                              cp_handle,
                              ctypes.byref(thread_handle),
                              dwOptions=DUPLICATE_SAME_ACCESS)
     self.current_thread = WinThread._from_handle(thread_handle.value)
     self.threads[self.current_thread.tid] = self.current_thread
     self._explicit_single_step[self.current_thread.tid] = False
     self._breakpoint_to_reput[self.current_thread.tid] = []
     self._hardware_breakpoint[self.current_thread.tid] = {}
     self._setup_pending_breakpoints_new_thread(self.current_thread)
     with self.DisabledMemoryBreakpoint():
         return self.on_create_thread(create_thread)