From c266033be9108a07f4762968f426ee835f42995c Mon Sep 17 00:00:00 2001 From: pompolic <pompolic@special-circumstanc.es> Date: Mon, 27 Dec 2021 19:48:20 +0100 Subject: [PATCH] Code cleanup --- gdb-port/parser-name-instrumentation-gdb.py | 56 +++++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/gdb-port/parser-name-instrumentation-gdb.py b/gdb-port/parser-name-instrumentation-gdb.py index 6141369..85d53e1 100644 --- a/gdb-port/parser-name-instrumentation-gdb.py +++ b/gdb-port/parser-name-instrumentation-gdb.py @@ -5,11 +5,9 @@ # TODO: possible enhancement, caching the vtable type in Parser objects (allows searching by type) # TODO: The parameter given to h_do_parse is not shown in the backtrace, which is confusing -# quick way to get locals from frame.block() -# {local.name : local for local in block} # Tuples of symbol name, length in bytes -h_rule_functions = [ ("init_runlengthdecode_parser", 314), ("init_LZW_parser", 1221) ] +H_RULE_FUNCTIONS = [ ("init_runlengthdecode_parser", 314), ("init_LZW_parser", 1221) ] class Parser: def __init__(self, name, address): @@ -429,7 +427,6 @@ class HArenaMallocRawBreakpoint(gdb.Breakpoint): return False -# TODO: PDFMain.hammer_retq_breakpoints property instead hammer_retq_breakpoints = [] class PDFMainBreakpoint(gdb.Breakpoint): @@ -449,6 +446,54 @@ class PDFMainBreakpoint(gdb.Breakpoint): breakpoints.append(h_packrat_parse_ret) return breakpoints +class BreakpointManager(): + def __init__(self): + self.hammer_retq_breakpoints = [] + self.h_rule_breakpoints = [] + + self.h_do_parse = None + self.h_packrat_parse = None + self.perform_lowlevel_parse = None + self.h_arena_malloc_raw = None + + self.parse_action = None + self.parse_choice = None + self.parse_sequence = None + self.parse_difference = None + self.parse_many = None + self.parse_and = None + self.parse_attr_bool = None + self.parse_bind = None + self.parse_bits = None + self.parse_butnot = None + self.parse_charset = None + self.parse_ch = None + self.parse_end = None + self.parse_endianness = None + self.parse_epsilon = None + self.parse_ignore = None + self.parse_ignoreseq = None + self.parse_indirect = None + self.parse_int_range = None + self.parse_not = None + self.parse_nothing = None + self.parse_optional = None + self.parse_permutation = None + self.parse_skip = None + self.parse_seek = None + self.parse_tell = None + self.parse_token = None + self.parse_unimplemented = None + self.parse_put = None + self.parse_get = None + self.parse_whitespace = None + self.parse_xor = None + + def set_h_rule_breakpoints() + for func in H_RULE_FUNCTIONS: + func_retq = locate_retq(func[0], func[1]) + self.h_rule_breakpoints[func] = HRuleBreakpoint("*" + hex(func_retq)) + # GDB parameters # TODO: hammer parameter prefix @@ -601,6 +646,7 @@ class HammerParserCurrentEnv(gdb.Command): HammerParserCurrentEnv() +#TODO: move all this to BreakpointManager? # Call when execution stopped at breakpoint in main def locate_perform_lowlevel_parse_retq(): arch = gdb.selected_frame().architecture() @@ -719,7 +765,7 @@ init_parser = InitParserBreakpoint("*" + hex(i_p_retq)) h_rule_breakpoints = {} -for func in h_rule_functions: +for func in H_RULE_FUNCTIONS: func_retq = locate_retq(func[0], func[1]) h_rule_breakpoints[func] = HRuleBreakpoint("*" + hex(func_retq)) -- GitLab