diff --git a/typetapper/analysis.py b/typetapper/analysis.py index a9be2ba..34d2fc9 100644 --- a/typetapper/analysis.py +++ b/typetapper/analysis.py @@ -31,7 +31,9 @@ class TypeTapperAnalysis(angr.Analysis): def _analyze_active_flow(self): node: CFGNode - for node in self._cfg.graph.nodes(): + for i, node in enumerate(self._cfg.graph.nodes()): + progress = i / len(self._cfg.graph) * 100 + self._update_progress(progress, "Analyzing " + str(node)) block: Block = node.block if block is not None: self._engine.handle_vex_block(block.vex) @@ -42,6 +44,7 @@ class TypeTapperAnalysis(angr.Analysis): proc.analyze(node.addr) def _analyze_passive_flow(self): + self._update_progress(99.99, "Analyzing passive flow") queue = OrderedDict() for block_addr in self.manager.block_info.keys(): queue[block_addr] = None diff --git a/typetapper/hierarchy_graph_view.py b/typetapper/hierarchy_graph_view.py index 2b3abcf..0891e17 100644 --- a/typetapper/hierarchy_graph_view.py +++ b/typetapper/hierarchy_graph_view.py @@ -219,7 +219,7 @@ class HierarchicalGraphWidget(QZoomableDraggableGraphicsView): qnode.setSelected(True) for other_qnode in self.qnodes: other_qnode.setAcceptHoverEvents(False) - other_qnode.setAcceptedMouseButtons(Qt.MouseButton.NoButton | 0) + other_qnode.setAcceptedMouseButtons(Qt.MouseButton.NoButton | Qt.MouseButton.NoButton) if qnode is other_qnode: other_qnode.setOpacity(0.8) else: @@ -273,7 +273,7 @@ class HierarchicalGraphWidget(QZoomableDraggableGraphicsView): def end_expand(self, accepted_qnode: Optional['PropChartHG']=None): for qnode in self.qnodes: qnode.setAcceptHoverEvents(True) - qnode.setAcceptedMouseButtons(Qt.MouseButton.AllButtons | 0) + qnode.setAcceptedMouseButtons(Qt.MouseButton.AllButtons | Qt.MouseButton.AllButtons) qnode.setOpacity(1) for edge in self.qedges: edge.setOpacity(1) diff --git a/typetapper/plugin.py b/typetapper/plugin.py index 5010807..157ea25 100644 --- a/typetapper/plugin.py +++ b/typetapper/plugin.py @@ -1,6 +1,8 @@ +import threading from typing import Optional from angr.analyses.decompiler.structured_codegen.c import CVariable +from angrmanagement.data.jobs.job import Job from angrmanagement.plugins import BasePlugin from angrmanagement.ui.views import CodeView @@ -15,14 +17,12 @@ class TypeTapper(BasePlugin): super().__init__(workspace) self.kp: Optional[TypeTapperManager] = None - MENU_BUTTONS = ["TypeTapper initial analysis"] + def handle_project_initialization(self): + threading.Thread(target=self._startup).start() - def handle_click_menu(self, idx): - assert idx == 0 - cfg = self.workspace.main_instance.cfg - tt = self.workspace.main_instance.project.analyses[TypeTapperAnalysis](cfg) - self.kp = tt.manager - self._start(self.kp.lookup_reg(0x4144a5, "rdi")) + def _startup(self): + self.workspace.main_instance.join_all_jobs(0.200) + self.workspace.main_instance.add_job(TypeTapperStartupJob(self)) def build_context_menu_node(self, node): # this is bad lol @@ -56,3 +56,13 @@ class TypeTapper(BasePlugin): ) self.workspace.add_view(view) self.workspace.raise_view(view) + +class TypeTapperStartupJob(Job): + def __init__(self, plugin: TypeTapper, **kwargs): + super().__init__("TypeTapper", **kwargs) + self.plugin = plugin + + def _run(self, inst): + cfg = inst.cfg + tt = inst.project.analyses[TypeTapperAnalysis](cfg, progress_callback=self._progress_callback) + self.plugin.kp = tt.manager