From 0fa8026c1b12cf7734ecbceb50affc1385319c7a Mon Sep 17 00:00:00 2001 From: hakril Date: Fri, 5 Jun 2020 17:10:45 +0200 Subject: [PATCH] Fix localdebugger (and sample) for python3 --- samples/debug/local_debugger.py | 5 +++-- windows/debug/localdbg.py | 20 +++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/samples/debug/local_debugger.py b/samples/debug/local_debugger.py index 37ee4a6..d23f3f4 100644 --- a/samples/debug/local_debugger.py +++ b/samples/debug/local_debugger.py @@ -4,6 +4,7 @@ import pprint sys.path.append(os.path.abspath(__file__ + "\..\..")) import windows +import windows.debug from windows.generated_def.winstructs import * import windows.native_exec.simple_x86 as x86 @@ -12,7 +13,7 @@ class SingleSteppingDebugger(windows.debug.LocalDebugger): def on_exception(self, exc): code = self.get_exception_code() context = self.get_exception_context() - print("EXCEPTION !!!! Got a {0} at 0x{1:x}".format(code, context.pc)) + print("EXCEPTION !!!! Got a {0!r} at 0x{1:x}".format(code, context.pc)) self.SINGLE_STEP_COUNT -= 1 if self.SINGLE_STEP_COUNT: return self.single_step() @@ -23,7 +24,7 @@ class RewriteBreakpoint(windows.debug.HXBreakpoint): context = dbg.get_exception_context() print("GOT AN HXBP at 0x{0:x}".format(context.pc)) # Rewrite the infinite loop with 2 nop - windows.current_process.write_memory(self.addr, "\x90\x90") + windows.current_process.write_memory(self.addr, b"\x90\x90") # Ask for a single stepping return dbg.single_step() diff --git a/windows/debug/localdbg.py b/windows/debug/localdbg.py index 213e837..fe2ee23 100644 --- a/windows/debug/localdbg.py +++ b/windows/debug/localdbg.py @@ -46,7 +46,7 @@ class LocalDebugger(object): winproxy.AddVectoredExceptionHandler(0, self.callback_vectored) self.setup_hxbp_callback_vectored = winexception.VectoredException(self.setup_hxbp_callback) self.hxbp_info = None - self.code = windows.native_exec.create_function("\xcc\xc3", [PVOID]) + self.code = windows.native_exec.create_function(b"\xcc\xc3", [PVOID]) self.veh_depth = 0 self.current_exception = None self.exceptions_stack = [None] @@ -128,7 +128,7 @@ class LocalDebugger(object): bp, single_step = self._reput_breakpoint[windows.current_thread.tid] self._memory_save[bp._addr] = windows.current_process.read_memory(bp._addr, 1) with windows.utils.VirtualProtected(bp._addr, 1, PAGE_EXECUTE_READWRITE): - windows.current_process.write_memory(bp._addr, "\xcc") + windows.current_process.write_memory(bp._addr, b"\xcc") del self._reput_breakpoint[windows.current_thread.tid] if single_step: return self.on_exception(exc) @@ -184,7 +184,7 @@ class LocalDebugger(object): self.breakpoints[addr] = bp self._memory_save[addr] = windows.current_process.read_memory(addr, 1) with windows.utils.VirtualProtected(addr, 1, PAGE_EXECUTE_READWRITE): - windows.current_process.write_memory(addr, "\xcc") + windows.current_process.write_memory(addr, b"\xcc") return def add_bp_hxbp(self, bp, targets=None): @@ -204,16 +204,18 @@ class LocalDebugger(object): def setup_hxbp_callback(self, exc): with self.NewCurrentException(exc): exp_code = self.get_exception_code() + if exp_code != windef.EXCEPTION_BREAKPOINT: + return windef.EXCEPTION_CONTINUE_SEARCH context = self.get_exception_context() exp_addr = context.pc hxbp_used = self.setup_hxbp_in_context(context, self.data) - windows.current_process.write_memory(exp_addr, "\x90") + windows.current_process.write_memory(exp_addr, b"\x90") # Raising in the VEH is a bad idea.. # So better give the information to triggerer.. if hxbp_used is not None: - self.get_exception_context().Eax = exp_addr + self.get_exception_context().func_result = exp_addr else: - self.get_exception_context().Eax = 0 + self.get_exception_context().func_result = 0 return windef.EXCEPTION_CONTINUE_EXECUTION def remove_hxbp_callback(self, exc): @@ -222,7 +224,7 @@ class LocalDebugger(object): context = self.get_exception_context() exp_addr = context.pc hxbp_used = self.remove_hxbp_in_context(context, self.data) - windows.current_process.write_memory(exp_addr, "\x90") + windows.current_process.write_memory(exp_addr, b"\x90") # Raising in the VEH is a bad idea.. # So better give the information to triggerer.. if hxbp_used is not None: @@ -267,7 +269,7 @@ class LocalDebugger(object): x = self.code() if x is None: raise ValueError("Could not setup HXBP") - windows.current_process.write_memory(x, "\xcc") + windows.current_process.write_memory(x, b"\xcc") return def setup_hxbp_other_thread(self, addr, thread): @@ -290,7 +292,7 @@ class LocalDebugger(object): x = self.code() if x is None: raise ValueError("Could not remove HXBP") - windows.current_process.write_memory(x, "\xcc") + windows.current_process.write_memory(x, b"\xcc") return def remove_hxbp_other_thread(self, addr, thread):