forked from angr/angr-management
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmanual_human_activities.py
151 lines (120 loc) · 5.75 KB
/
manual_human_activities.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
from __future__ import annotations
import os
import sys
import unittest
import angr
from common import setUp, test_location
from PySide6.QtCore import Qt
from PySide6.QtTest import QTest
from PySide6.QtWidgets import QGraphicsScene, QGraphicsView
from angrmanagement.ui.dialogs.rename_label import RenameLabel
from angrmanagement.ui.dialogs.rename_node import RenameNode
from angrmanagement.ui.main_window import MainWindow
from angrmanagement.ui.views import CodeView, DisassemblyView
class TestHumanActivities(unittest.TestCase):
def setUp(self):
setUp()
def tearDown(self):
os.remove("/tmp/testtest.sqlite")
def _open_a_project(self):
main = MainWindow(show=False)
binpath = os.path.join(test_location, "x86_64", "fauxware")
main.workspace.main_instance.project.am_obj = angr.Project(binpath, auto_load_libs=False)
main.workspace.main_instance.project.am_event()
main.workspace.main_instance.job_manager.join_all_jobs()
self.project = binpath
# import ipdb; ipdb.set_trace()
self.project_md5 = main.workspace.main_instance.project.loader.main_object.md5.hex()
return main
def test_open_a_project(self):
self._open_a_project()
def test_rename_a_function_in_disasm_and_pseudocode_views(self):
main = self._open_a_project()
func = main.workspace.main_instance.project.kb.functions["main"]
self.assertIsNotNone(func)
# decompile the function
disasm_view = main.workspace._get_or_create_view("disassembly", DisassemblyView)
disasm_view.display_disasm_graph()
disasm_view.display_function(func)
disasm_view.decompile_current_function()
main.workspace.main_instance.job_manager.join_all_jobs()
pseudocode_view = main.workspace._get_or_create_view("pseudocode", CodeView)
# find the node for function
for _, item in pseudocode_view.codegen.map_pos_to_node.items():
if isinstance(item.obj, angr.analyses.decompiler.structured_codegen.c.CFunction):
func_node = item.obj
break
else:
self.fail("The CFunction instance is not found.")
self.assertEqual(func_node.name, "main")
# rename the function in the disassembly view
rlabel = RenameLabel(disasm_view, func.addr, parent=None)
rlabel._name_box.setText("")
QTest.keyClicks(rlabel._name_box, "asdf")
QTest.mouseClick(rlabel._ok_button, Qt.MouseButton.LeftButton)
self.assertEqual(func.name, "asdf")
self.assertEqual(func_node.name, "main")
# rename the function in the pseudocode view
rnode = RenameNode(code_view=pseudocode_view, node=func_node)
rnode._name_box.setText("")
QTest.keyClicks(rnode._name_box, "fdsa")
QTest.mouseClick(rnode._ok_button, Qt.MouseButton.LeftButton)
self.assertEqual(func.name, "fdsa")
def test_rename_a_variable_in_pseudocode_view(self):
main = self._open_a_project()
func = main.workspace.main_instance.project.kb.functions["main"]
self.assertIsNotNone(func)
# decompile the function
disasm_view = main.workspace._get_or_create_view("disassembly", DisassemblyView)
disasm_view.display_disasm_graph()
disasm_view.display_function(func)
disasm_view.decompile_current_function()
main.workspace.main_instance.job_manager.join_all_jobs()
pseudocode_view = main.workspace._get_or_create_view("pseudocode", CodeView)
# find an arbitrary node for a variable
for _, item in pseudocode_view.codegen.map_pos_to_node.items():
if (
isinstance(item.obj, angr.analyses.decompiler.structured_codegen.c.CVariable)
and item.obj.unified_variable is not None
):
variable_node = item.obj
break
else:
self.fail("Cannot find a testing variable.")
# rename the variable in the pseudocode view
rnode = RenameNode(code_view=pseudocode_view, node=variable_node)
rnode._name_box.setText("")
QTest.keyClicks(rnode._name_box, "fdsa")
QTest.mouseClick(rnode._ok_button, Qt.MouseButton.LeftButton)
self.assertEqual(variable_node.unified_variable.name, "fdsa")
def test_click_block(self):
main_window = self._open_a_project()
func = main_window.workspace.main_instance.project.kb.functions["main"]
self.assertIsNotNone(func)
# display function main
disasm_view = main_window.workspace._get_or_create_view("disassembly", DisassemblyView)
disasm_view.display_disasm_graph()
disasm_view.display_function(func)
# get and click the first bbl of function main
block = disasm_view.current_graph._insaddr_to_block.get(func.addr)
scene = QGraphicsScene()
scene.addItem(block)
view = QGraphicsView(scene)
QTest.mouseClick(view.viewport(), Qt.MouseButton.LeftButton)
def test_click_insn(self):
main_window = self._open_a_project()
func = main_window.workspace.main_instance.project.kb.functions["main"]
self.assertIsNotNone(func)
# display function main
disasm_view = main_window.workspace._get_or_create_view("disassembly", DisassemblyView)
disasm_view.display_disasm_graph()
disasm_view.display_function(func)
# get and click the first bbl of function main
block = disasm_view.current_graph._insaddr_to_block.get(func.addr)
insn = block.addr_to_insns[func.addr]
scene = QGraphicsScene()
scene.addItem(insn)
view = QGraphicsView(scene)
QTest.mouseClick(view.viewport(), Qt.MouseButton.LeftButton)
if __name__ == "__main__":
unittest.main(argv=sys.argv)