def do_instructionflow(self, arg, opts=None): if (not arg): self.cprint.print_error( "Incorrect Syntax: help instructionflow.\n") else: method_definition = repr(''.join(arg))[2:-2] self.cprint.print_title( "* Method %s Instructions Flow saved to MethodInstructionsFlow.png." % (method_definition)) fnd = InstructionsFinder(method_definition, opts.full_graph) self.walker.assign_finder(fnd) resultados = self.walker.do_find() graph_mgr = GraphManager(True) for b1 in resultados: for lbl, target in b1.bifurcaciones: for b2 in resultados: if b2.etiqueta == target: graph_mgr.add_block_edge(b1, b2, lbl) break try: graph_mgr.draw("MethodInstructionsFlow", not opts.store_dot) except: self.cprint.print_error( "Complex Graph can't be rendered with graphviz libraries, using .dot format instead!\n" ) graph_mgr.draw("MethodInstructionsFlow", False)
def do_instructionflow(self, arg, opts=None): if (not arg): self.cprint.print_error("Incorrect Syntax: help instructionflow.\n") else: method_definition = repr(''.join(arg))[2:-2] self.cprint.print_title("* Method %s Instructions Flow saved to MethodInstructionsFlow.png." % (method_definition)) fnd = InstructionsFinder(method_definition, opts.full_graph) self.walker.assign_finder(fnd) resultados = self.walker.do_find() graph_mgr = GraphManager(True) for b1 in resultados: for lbl,target in b1.bifurcaciones: for b2 in resultados: if b2.etiqueta == target: graph_mgr.add_block_edge(b1,b2, lbl) break try: graph_mgr.draw("MethodInstructionsFlow", not opts.store_dot) except: self.cprint.print_error("Complex Graph can't be rendered with graphviz libraries, using .dot format instead!\n") graph_mgr.draw("MethodInstructionsFlow", False)
def do_crossreferences(self, arg, opts=None): def cross_level(start_points, direction, view_system_calls, lvl): auxCalls = [] for methodPair in start_points: fcaller, fcalled = methodPair fnd = CallsFinder(fcaller) self.walker.assign_finder(fnd) mthXrefs = self.walker.do_find() for callPair in mthXrefs: caller, called = callPair if direction == 0: condition = (called == fcaller) elif direction == 1: condition = (caller == fcaller) else: condition = True if condition: if (caller, called) not in auxCalls: if view_system_calls: auxCalls.append((caller, called)) else: if lvl == 0: auxCalls.append((caller, called)) else: if called.split( '->' )[0] in self.walker.AppInventory.keys(): auxCalls.append((caller, called)) return auxCalls if (not arg): self.cprint.print_error( "Incorrect Syntax: help crossreferences.\n") return # arg method_definition = repr(''.join(arg))[2:-2] # str patterns StringMatch = None if opts.str_reg: strings_patterns = [opts.str_reg] fnd = StringsFinder(strings_patterns) self.walker.assign_finder(fnd) StringMatch = self.walker.do_find() if StringMatch: self.cprint.print_title( "* Cross-References with a %d recursion level and String Pattern search." % (opts.max_levels)) else: self.cprint.print_title( "* Cross-References with a %d recursion level." % (opts.max_levels)) level = 0 PackageUsage = [] results = [] PackageUsage.append((method_definition, '')) while True: PackageUsage2 = cross_level(PackageUsage, opts.direction, opts.view_system_calls, level) if len(PackageUsage) == len(PackageUsage2): equal = True for a in PackageUsage: equal = a in PackageUsage2 if not equal: break if equal: break results += PackageUsage2 PackageUsage = PackageUsage2 level += 1 if level == opts.max_levels: break graph_mgr = GraphManager() coincidences = {} for calls in results: caller, called = calls graph_mgr.add_xref_edge(caller, called, method_definition, StringMatch) if StringMatch: if (caller in StringMatch) and (caller not in coincidences): coincidences[caller] = StringMatch[caller] elif (called in StringMatch) and (called not in coincidences): coincidences[called] = StringMatch[called] self.cprint.print_dict(coincidences) if StringMatch: try: graph_mgr.draw("CrossReferencesWithPatterns", not opts.store_dot) except: self.cprint.print_error( "Complex Graph can't be rendered with graphviz libraries, using .dot format instead!\n" ) graph_mgr.draw("CrossReferencesWithPatterns", False) else: try: graph_mgr.draw("CrossReferences", not opts.store_dot) except: self.cprint.print_error( "Complex Graph can't be rendered with graphviz libraries, using .dot format instead!\n" ) graph_mgr.draw("CrossReferences", False)
def do_crossreferences(self, arg, opts=None): def cross_level(start_points, direction, view_system_calls, lvl): auxCalls = [] for methodPair in start_points: fcaller, fcalled = methodPair fnd = CallsFinder(fcaller) self.walker.assign_finder(fnd) mthXrefs = self.walker.do_find() for callPair in mthXrefs: caller, called = callPair if direction == 0: condition = (called == fcaller) elif direction == 1: condition = (caller == fcaller) else: condition = True if condition: if (caller, called) not in auxCalls: if view_system_calls: auxCalls.append( (caller, called) ) else: if lvl==0: auxCalls.append( (caller, called) ) else: if called.split('->')[0] in self.walker.AppInventory.keys(): auxCalls.append( (caller, called) ) return auxCalls if (not arg): self.cprint.print_error("Incorrect Syntax: help crossreferences.\n") return # arg method_definition = repr(''.join(arg))[2:-2] # str patterns StringMatch = None if opts.str_reg: strings_patterns = [opts.str_reg] fnd = StringsFinder(strings_patterns) self.walker.assign_finder(fnd) StringMatch = self.walker.do_find() if StringMatch: self.cprint.print_title("* Cross-References with a %d recursion level and String Pattern search." % (opts.max_levels)) else: self.cprint.print_title("* Cross-References with a %d recursion level." % (opts.max_levels)) level = 0 PackageUsage = [] results = [] PackageUsage.append( (method_definition,'') ) while True: PackageUsage2 = cross_level(PackageUsage, opts.direction, opts.view_system_calls, level) if len(PackageUsage) == len(PackageUsage2): equal = True for a in PackageUsage: equal = a in PackageUsage2 if not equal: break if equal: break results += PackageUsage2 PackageUsage = PackageUsage2 level +=1 if level == opts.max_levels: break graph_mgr = GraphManager() coincidences = {} for calls in results: caller, called = calls graph_mgr.add_xref_edge(caller, called, method_definition, StringMatch) if StringMatch: if (caller in StringMatch) and (caller not in coincidences): coincidences[caller] = StringMatch[caller] elif (called in StringMatch) and (called not in coincidences): coincidences[called] = StringMatch[called] self.cprint.print_dict(coincidences) if StringMatch: try: graph_mgr.draw("CrossReferencesWithPatterns", not opts.store_dot) except: self.cprint.print_error("Complex Graph can't be rendered with graphviz libraries, using .dot format instead!\n") graph_mgr.draw("CrossReferencesWithPatterns", False) else: try: graph_mgr.draw("CrossReferences", not opts.store_dot) except: self.cprint.print_error("Complex Graph can't be rendered with graphviz libraries, using .dot format instead!\n") graph_mgr.draw("CrossReferences", False)