Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Refactor state view in the simgr view into a StateInspector widget to…
… ease communication
  • Loading branch information
rhelmot committed Jun 27, 2018
1 parent 3970f3d commit 498575f
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 34 deletions.
40 changes: 9 additions & 31 deletions angrmanagement/ui/views/symexec_view.py
@@ -1,13 +1,11 @@

from PySide.QtGui import QMainWindow, QHBoxLayout, QDockWidget
from PySide.QtCore import Qt, QSize
from PySide.QtCore import Qt
from angrmanagement.ui.widgets.state_inspector import StateInspector

from ..widgets.qpathtree import QPathTree
from ..widgets.qsimulation_managers import QSimulationManagers
from .view import BaseView
from ..widgets.qregister_viewer import QRegisterViewer
from ..widgets.qmemory_viewer import QMemoryViewer
from ..widgets.qvextemps_viewer import QVEXTempsViewer


class SymexecView(BaseView):
Expand All @@ -18,9 +16,7 @@ def __init__(self, workspace, *args, **kwargs):

self._pathtree = None # type: QPathTree
self._simgrs = None # type: QSimulationManagers
self._register_viewer = None # type: QRegisterViewer
self._memory_viewer = None # type: QMemoryViewer
self._vextemps_viewer = None # type: QVEXTempsViewer
self._state_viewer = None # type: StateInspector

self._selected_state_block = None

Expand Down Expand Up @@ -49,9 +45,7 @@ def select_simgr_desc(self, pg_desc):
self._simgrs.select_simgr_desc(pg_desc)

def view_state(self, state):
self._register_viewer.state = state
self._memory_viewer.state = state
self._vextemps_viewer.state = state
self._state_viewer.state = state

# push namespace into the console
self.workspace.views_by_category['console'][0].push_namespace({
Expand Down Expand Up @@ -105,30 +99,14 @@ def _init_widgets(self):
main.addDockWidget(Qt.RightDockWidgetArea, pathgroups_dock)
pathgroups_dock.setWidget(simgrs)

reg_viewer = QRegisterViewer(self, self.workspace)
reg_viewer_dock = QDockWidget('Register Viewer', reg_viewer)
main.addDockWidget(Qt.RightDockWidgetArea, reg_viewer_dock)
reg_viewer_dock.setWidget(reg_viewer)

mem_viewer = QMemoryViewer(self, self.workspace)
mem_viewer_dock = QDockWidget('Memory Viewer', mem_viewer)
main.addDockWidget(Qt.RightDockWidgetArea, mem_viewer_dock)
mem_viewer_dock.setWidget(mem_viewer)

vextemps_viewer = QVEXTempsViewer(self, self.workspace)
vextemps_viewer_dock = QDockWidget('VEX Temps Viewer', vextemps_viewer)
main.addDockWidget(Qt.RightDockWidgetArea, vextemps_viewer_dock)
vextemps_viewer_dock.setWidget(vextemps_viewer)

main.tabifyDockWidget(reg_viewer_dock, mem_viewer_dock)
main.tabifyDockWidget(mem_viewer_dock, vextemps_viewer_dock)
reg_viewer_dock.raise_()
state_viewer = StateInspector(self.workspace, parent=self)
state_viewer_dock = QDockWidget('Selected State', state_viewer)
main.addDockWidget(Qt.RightDockWidgetArea, state_viewer_dock)
state_viewer_dock.setWidget(state_viewer)

self._pathtree = pathtree
self._simgrs = simgrs
self._register_viewer = reg_viewer
self._memory_viewer = mem_viewer
self._vextemps_viewer = vextemps_viewer
self._state_viewer = state_viewer

main_layout = QHBoxLayout()
main_layout.addWidget(main)
Expand Down
5 changes: 3 additions & 2 deletions angrmanagement/ui/widgets/qmemory_viewer.py
Expand Up @@ -23,8 +23,9 @@ class NewLinePiece(object):


class QMemoryView(QWidget):
def __init__(self, parent=None):
def __init__(self, workspace, parent=None):
super(QMemoryView, self).__init__(parent)
self.workspace = workspace

self.state = None
self.cols = None
Expand Down Expand Up @@ -215,7 +216,7 @@ def _init_widgets(self):
top_layout.addWidget(lbl_addr)
top_layout.addWidget(txt_addr)

self._view = QMemoryView()
self._view = QMemoryView(self.workspace)

area = QScrollArea()
self._scrollarea = area
Expand Down
6 changes: 6 additions & 0 deletions angrmanagement/ui/widgets/qstate_block.py
Expand Up @@ -120,6 +120,12 @@ def on_mouse_pressed(self, button, pos):
self.symexec_view.view_state(None)
self.symexec_view.redraw_graph()

def on_mouse_doubleclicked(self, button, pos):
if self.state is not None:
self._workspace.viz(self.state.addr)
elif self.history is not None:
self._workspace.viz(self.history.state.addr)

#
# Private methods
#
Expand Down
18 changes: 18 additions & 0 deletions angrmanagement/ui/widgets/qsymexec_graph.py
Expand Up @@ -142,6 +142,24 @@ def mousePressEvent(self, event):

super(QSymExecGraph, self).mousePressEvent(event)

def mouseDoubleClickEvent(self, event):
"""
:param QMouseEvent event:
:return:
"""

btn = event.button()
if btn == Qt.LeftButton:
pos = event.pos()
block = self._get_block_by_pos(pos)
if block is not None:
block.on_mouse_doubleclicked(btn, self._to_graph_pos(pos))
event.accept()
return

super(QSymExecGraph, self).mouseDoubleClickEvent(event)

def _on_keypressed_event(self, key_event):
"""
Expand Down
39 changes: 39 additions & 0 deletions angrmanagement/ui/widgets/state_inspector.py
@@ -0,0 +1,39 @@
from PySide.QtGui import QTabWidget
from angrmanagement.ui.widgets.qmemory_viewer import QMemoryViewer
from angrmanagement.ui.widgets.qregister_viewer import QRegisterViewer
from angrmanagement.ui.widgets.qvextemps_viewer import QVEXTempsViewer


class StateInspector(QTabWidget):
def __init__(self, workspace, parent=None, state=None):
super(StateInspector, self).__init__(parent=parent)
self.workspace = workspace
self._state = None

self._register_viewer = None # type: QRegisterViewer
self._memory_viewer = None # type: QMemoryViewer
self._vextemps_viewer = None # type: QVEXTempsViewer

self._init_widgets()
self.state = state

@property
def state(self):
return self._state

@state.setter
def state(self, state):
self._state = state
self._register_viewer.state = state
self._memory_viewer.state = state
self._vextemps_viewer.state = state

def _init_widgets(self):
self._register_viewer = QRegisterViewer(self, self.workspace)
self.addTab(self._register_viewer, "Registers")

self._memory_viewer = QMemoryViewer(self, self.workspace)
self.addTab(self._memory_viewer, "Memory")

self._vextemps_viewer = QVEXTempsViewer(self, self.workspace)
self.addTab(self._vextemps_viewer, "Temps")
1 change: 0 additions & 1 deletion angrmanagement/ui/workspace.py
@@ -1,7 +1,6 @@

from collections import defaultdict

from PySide.QtGui import QFont, QFontMetricsF
from PySide.QtCore import Qt
from angr.knowledge_plugins import Function

Expand Down

0 comments on commit 498575f

Please sign in to comment.