hardsploit_gui 2.3 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -22
- data/Rakefile +1 -1
- data/bin/hardsploit_gui +3 -3
- data/lib/Firmwares/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
- data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd +0 -0
- data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/VersionFPGA.rb +5 -5
- data/lib/Firmwares/UC/VersionUC.rb +12 -12
- data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -210
- data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -150
- data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -109
- data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -305
- data/lib/HardsploitAPI/Core/HardsploitAPI_PROGRESS.rb +28 -28
- data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -166
- data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -356
- data/lib/HardsploitAPI/Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb +206 -206
- data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -306
- data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -340
- data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -83
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -367
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -89
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -61
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_STM32.rb +121 -121
- data/lib/HardsploitAPI/Modules/TEST/HardsploitAPI_TEST_INTERACT.rb +98 -98
- data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -196
- data/lib/Hardsploit_gui.rb +96 -96
- data/lib/LICENSE.txt +674 -674
- data/lib/README.md +22 -22
- data/lib/TRADEMARK +2 -2
- data/lib/class/Chip_editor.rb +304 -304
- data/lib/class/Chip_management.rb +496 -496
- data/lib/class/Command_editor.rb +216 -216
- data/lib/class/Command_table.rb +233 -233
- data/lib/class/Console.rb +26 -26
- data/lib/class/ErrorMsg.rb +312 -312
- data/lib/class/Export.rb +140 -140
- data/lib/class/Export_manager.rb +124 -124
- data/lib/class/Firmware.rb +70 -70
- data/lib/class/Generic_commands.rb +260 -260
- data/lib/class/{i2c → I2C}/I2c_command.rb +51 -51
- data/lib/class/{i2c → I2C}/I2c_export.rb +95 -95
- data/lib/class/{i2c → I2C}/I2c_import.rb +117 -117
- data/lib/class/{i2c → I2C}/I2c_scanner.rb +114 -114
- data/lib/class/{i2c → I2C}/I2c_settings.rb +148 -148
- data/lib/class/Import.rb +193 -193
- data/lib/class/{parallel → PARALLEL}/Parallel_export.rb +118 -118
- data/lib/class/{parallel → PARALLEL}/Parallel_import.rb +113 -113
- data/lib/class/{parallel → PARALLEL}/Parallel_settings.rb +81 -81
- data/lib/class/Progress_bar.rb +32 -32
- data/lib/class/{spi → SPI}/Spi_export.rb +108 -108
- data/lib/class/{spi → SPI}/Spi_import.rb +159 -159
- data/lib/class/{spi → SPI}/Spi_settings.rb +108 -108
- data/lib/class/{spi → SPI}/Spi_sniffer.rb +101 -101
- data/lib/class/Signal_mapper.rb +120 -120
- data/lib/class/Wire_helper.rb +230 -230
- data/lib/class/swd/Swd.rb +125 -125
- data/lib/class/swd/Swd_scanner.rb +121 -121
- data/lib/class/swd/Swd_settings.rb +76 -76
- data/lib/class/uart/Uart_baudrate.rb +62 -62
- data/lib/class/uart/Uart_console.rb +115 -115
- data/lib/class/uart/Uart_settings.rb +102 -102
- data/lib/db/associations.rb +138 -138
- data/lib/db/database.rb +4 -4
- data/lib/db/development.sqlite3 +0 -0
- data/lib/db/migrate/004_create_manufacturers.rb +13 -13
- data/lib/db/migrate/005_create_packages.rb +13 -13
- data/lib/db/migrate/006_create_chip_types.rb +11 -11
- data/lib/db/migrate/007_create_buses.rb +11 -11
- data/lib/db/migrate/008_create_signals.rb +14 -14
- data/lib/db/migrate/009_create_chips.rb +25 -25
- data/lib/db/migrate/010_create_commands.rb +21 -21
- data/lib/db/migrate/011_create_bytes.rb +19 -19
- data/lib/db/migrate/012_create_i2c_settings.rb +21 -21
- data/lib/db/migrate/013_create_spi_settings.rb +26 -26
- data/lib/db/migrate/014_create_parallel_settings.rb +21 -21
- data/lib/db/migrate/015_create_pins.rb +19 -19
- data/lib/db/migrate/016_create_uses.rb +17 -17
- data/lib/db/migrate/017_create_swd_settings.rb +19 -19
- data/lib/db/migrate/018_create_uart_settings.rb +22 -22
- data/lib/db/schema.rb +157 -157
- data/lib/db/seeds.rb +161 -161
- data/lib/gui/gui_chip_editor.rb +349 -349
- data/lib/gui/gui_chip_management.rb +377 -377
- data/lib/gui/gui_command_editor.rb +219 -219
- data/lib/gui/gui_export.rb +132 -132
- data/lib/gui/gui_export_manager.rb +93 -93
- data/lib/gui/gui_generic_commands.rb +202 -202
- data/lib/gui/gui_generic_export.rb +164 -164
- data/lib/gui/gui_generic_import.rb +142 -142
- data/lib/gui/gui_i2c_command.rb +116 -116
- data/lib/gui/gui_i2c_settings.rb +230 -230
- data/lib/gui/gui_import.rb +131 -131
- data/lib/gui/gui_parallel_settings.rb +195 -195
- data/lib/gui/gui_progress_bar.rb +85 -85
- data/lib/gui/gui_signal_mapper.rb +121 -121
- data/lib/gui/gui_signal_scanner.rb +146 -146
- data/lib/gui/gui_spi_import.rb +126 -126
- data/lib/gui/gui_spi_settings.rb +313 -313
- data/lib/gui/gui_spi_sniffer.rb +112 -112
- data/lib/gui/gui_swd_settings.rb +166 -166
- data/lib/gui/gui_uart_baudrate.rb +114 -114
- data/lib/gui/gui_uart_console.rb +164 -164
- data/lib/gui/gui_uart_settings.rb +243 -243
- data/lib/gui/gui_wire_helper.rb +99 -99
- data/lib/gui_designer/gui_chip_editor.ui +549 -549
- data/lib/gui_designer/gui_chip_management.ui +886 -886
- data/lib/gui_designer/gui_command_editor.ui +350 -350
- data/lib/gui_designer/gui_export.ui +171 -171
- data/lib/gui_designer/gui_export_manager.ui +115 -115
- data/lib/gui_designer/gui_generic_commands.ui +342 -342
- data/lib/gui_designer/gui_generic_export.ui +202 -202
- data/lib/gui_designer/gui_generic_import.ui +165 -165
- data/lib/gui_designer/gui_i2c_command.ui +148 -148
- data/lib/gui_designer/gui_i2c_settings.ui +292 -292
- data/lib/gui_designer/gui_import.ui +168 -168
- data/lib/gui_designer/gui_parallel_settings.ui +247 -247
- data/lib/gui_designer/gui_progress_bar.ui +86 -86
- data/lib/gui_designer/gui_signal_mapper.ui +179 -179
- data/lib/gui_designer/gui_signal_scanner.ui +261 -261
- data/lib/gui_designer/gui_spi_settings.ui +446 -446
- data/lib/gui_designer/gui_spi_sniffer.ui +156 -156
- data/lib/gui_designer/gui_swd_settings.ui +189 -189
- data/lib/gui_designer/gui_uart_baudrate.ui +161 -161
- data/lib/gui_designer/gui_uart_console.ui +284 -284
- data/lib/gui_designer/gui_uart_settings.ui +280 -280
- data/lib/gui_designer/gui_wire_helper.ui +117 -117
- data/lib/images/search.png +0 -0
- data/lib/logs/error.log +0 -63
- data/lib/models/bus.rb +19 -19
- data/lib/models/byte.rb +29 -29
- data/lib/models/chip.rb +41 -41
- data/lib/models/chip_type.rb +14 -14
- data/lib/models/command.rb +20 -20
- data/lib/models/i2c_setting.rb +41 -41
- data/lib/models/manufacturer.rb +14 -14
- data/lib/models/package.rb +26 -26
- data/lib/models/parallel_setting.rb +37 -37
- data/lib/models/pin.rb +14 -14
- data/lib/models/signall.rb +20 -20
- data/lib/models/spi_setting.rb +67 -67
- data/lib/models/swd_setting.rb +25 -25
- data/lib/models/uart_setting.rb +52 -52
- data/lib/models/use.rb +6 -6
- data/lib/startHardsploit.rb +10 -10
- metadata +14 -14
@@ -1,496 +1,496 @@
|
|
1
|
-
#===================================================
|
2
|
-
# Hardsploit GUI - By Opale Security
|
3
|
-
# www.opale-security.com || www.hardsploit.io
|
4
|
-
# License: GNU General Public License v3
|
5
|
-
# License URI: http://www.gnu.org/licenses/gpl.txt
|
6
|
-
#===================================================
|
7
|
-
|
8
|
-
ABSOLUTE_PATH = File.expand_path(File.dirname(__FILE__)) + "/"
|
9
|
-
|
10
|
-
Dir[ABSOLUTE_PATH + "../models/*.rb"].each {|file| require_relative file }
|
11
|
-
Dir[ABSOLUTE_PATH + "*.rb"].each {|file| require_relative file }
|
12
|
-
Dir[ABSOLUTE_PATH + "parallel/*.rb"].each {|file| require_relative file }
|
13
|
-
Dir[ABSOLUTE_PATH + "spi/*.rb"].each {|file| require_relative file }
|
14
|
-
Dir[ABSOLUTE_PATH + "i2c/*.rb"].each {|file| require_relative file }
|
15
|
-
Dir[ABSOLUTE_PATH + "swd/*.rb"].each {|file| require_relative file }
|
16
|
-
Dir[ABSOLUTE_PATH + "uart/*.rb"].each {|file| require_relative file }
|
17
|
-
|
18
|
-
class Chip_management < Qt::MainWindow
|
19
|
-
slots 'load_tree(int, int)'
|
20
|
-
slots 'load_chip_action(QTreeWidgetItem*, int)'
|
21
|
-
slots 'feed_chip_array()'
|
22
|
-
slots 'update_uc_firmware()'
|
23
|
-
slots 'get_hardsploit_versions()'
|
24
|
-
slots 'get_log_path()'
|
25
|
-
slots 'get_db_path()'
|
26
|
-
slots 'get_hardsploit_website()'
|
27
|
-
slots 'set_firmware()'
|
28
|
-
slots 'display_current_firmware()'
|
29
|
-
slots 'console_view()'
|
30
|
-
slots 'add_chip()'
|
31
|
-
slots 'edit_chip()'
|
32
|
-
slots 'wire_chip()'
|
33
|
-
slots 'delete_chip()'
|
34
|
-
slots 'import()'
|
35
|
-
slots 'export()'
|
36
|
-
slots 'open_signal_mapper()'
|
37
|
-
|
38
|
-
def initialize(versionGUI)
|
39
|
-
super()
|
40
|
-
@view = Ui_Chip_management.new
|
41
|
-
@view.setupUi(self)
|
42
|
-
@view.img_search.setPixmap(Qt::Pixmap.new(File.expand_path(File.dirname(__FILE__)) + "/../images/search.png"))
|
43
|
-
inputRestrict(@view.lie_search, 2)
|
44
|
-
feed_chip_array
|
45
|
-
feed_manufacturer_cbx
|
46
|
-
feed_type_cbx
|
47
|
-
@console = Console.new(@view.tbl_console)
|
48
|
-
@versionGUI = versionGUI
|
49
|
-
check_hardsploit_connection
|
50
|
-
rescue Exception => msg
|
51
|
-
ErrorMsg.new.unknown(msg)
|
52
|
-
return false
|
53
|
-
end
|
54
|
-
|
55
|
-
def feed_type_cbx
|
56
|
-
Manufacturer.all.each do |m|
|
57
|
-
@view.cbx_manufacturer.addItem(m.name)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def feed_manufacturer_cbx
|
62
|
-
ChipType.all.each do |c|
|
63
|
-
@view.cbx_type.addItem(c.name)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def console_view
|
68
|
-
sender.isChecked ? @view.tbl_console.show : @view.tbl_console.hide
|
69
|
-
end
|
70
|
-
|
71
|
-
def get_chip_buses(chip)
|
72
|
-
chip_buses = []
|
73
|
-
chip.pins.each do |pin|
|
74
|
-
chip_buses.push(pin.signall.buses[0].name)
|
75
|
-
end
|
76
|
-
chip_buses.delete("NA")
|
77
|
-
return chip_buses.uniq
|
78
|
-
end
|
79
|
-
|
80
|
-
def load_tree(line, column)
|
81
|
-
return 0 unless column.zero?
|
82
|
-
@view.tw_chip.clear
|
83
|
-
@chip_clicked = Chip.find_by(reference: @view.tbl_chip.item(line, column).text)
|
84
|
-
# CHIP LEVEL
|
85
|
-
chip_lvl = Qt::TreeWidgetItem.new
|
86
|
-
chip_lvl.setText(0, @view.tbl_chip.item(line, column).text)
|
87
|
-
@view.tw_chip.addTopLevelItem(chip_lvl)
|
88
|
-
chip_lvl.setExpanded(true)
|
89
|
-
# ACTION LEVEL
|
90
|
-
action_lvl = Qt::TreeWidgetItem.new
|
91
|
-
action_lvl.setText(0, 'Manage')
|
92
|
-
chip_lvl.addChild(create_action_nodes(action_lvl))
|
93
|
-
action_lvl.setExpanded(true)
|
94
|
-
|
95
|
-
# BUS LEVEL(S)
|
96
|
-
chip_bus = get_chip_buses(@chip_clicked)
|
97
|
-
chip_bus.each do |b|
|
98
|
-
@bus_lvl = Qt::TreeWidgetItem.new
|
99
|
-
@bus_lvl.setText(0, b)
|
100
|
-
chip_lvl.addChild(create_bus_nodes(b, @bus_lvl))
|
101
|
-
@bus_lvl.setExpanded(true) unless @bus_lvl.nil?
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def create_action_nodes(parent_node)
|
106
|
-
wiring_lvl = Qt::TreeWidgetItem.new
|
107
|
-
wiring_lvl.setText(0, "Wiring")
|
108
|
-
parent_node.addChild(wiring_lvl)
|
109
|
-
edit_lvl = Qt::TreeWidgetItem.new
|
110
|
-
edit_lvl.setText(0, "Edit")
|
111
|
-
parent_node.addChild(edit_lvl)
|
112
|
-
template_lvl = Qt::TreeWidgetItem.new
|
113
|
-
template_lvl.setText(0, "Template")
|
114
|
-
parent_node.addChild(template_lvl)
|
115
|
-
delete_lvl = Qt::TreeWidgetItem.new
|
116
|
-
delete_lvl.setText(0, "Delete")
|
117
|
-
parent_node.addChild(delete_lvl)
|
118
|
-
return parent_node
|
119
|
-
end
|
120
|
-
|
121
|
-
def create_bus_nodes(bus, parent_node)
|
122
|
-
case bus
|
123
|
-
when 'UART'
|
124
|
-
settings_lvl = Qt::TreeWidgetItem.new
|
125
|
-
settings_lvl.setText(0, "Settings")
|
126
|
-
parent_node.addChild(settings_lvl)
|
127
|
-
console_lvl = Qt::TreeWidgetItem.new
|
128
|
-
console_lvl.setText(0, "Console")
|
129
|
-
parent_node.addChild(console_lvl)
|
130
|
-
when 'SWD'
|
131
|
-
settings_lvl = Qt::TreeWidgetItem.new
|
132
|
-
settings_lvl.setText(0, "Settings")
|
133
|
-
parent_node.addChild(settings_lvl)
|
134
|
-
scan_lvl = Qt::TreeWidgetItem.new
|
135
|
-
scan_lvl.setText(0, "PIN Scanner")
|
136
|
-
parent_node.addChild(scan_lvl)
|
137
|
-
detect_lvl = Qt::TreeWidgetItem.new
|
138
|
-
detect_lvl.setText(0, "Detect")
|
139
|
-
parent_node.addChild(detect_lvl)
|
140
|
-
import_lvl = Qt::TreeWidgetItem.new
|
141
|
-
import_lvl.setText(0, "Import")
|
142
|
-
parent_node.addChild(import_lvl)
|
143
|
-
export_lvl = Qt::TreeWidgetItem.new
|
144
|
-
export_lvl.setText(0, "Dump")
|
145
|
-
parent_node.addChild(export_lvl)
|
146
|
-
erase_lvl = Qt::TreeWidgetItem.new
|
147
|
-
erase_lvl.setText(0, "Erase")
|
148
|
-
parent_node.addChild(erase_lvl)
|
149
|
-
when 'SPI'
|
150
|
-
settings_lvl = Qt::TreeWidgetItem.new
|
151
|
-
settings_lvl.setText(0, "Settings")
|
152
|
-
parent_node.addChild(settings_lvl)
|
153
|
-
cmd_lvl = Qt::TreeWidgetItem.new
|
154
|
-
cmd_lvl.setText(0, "Commands")
|
155
|
-
parent_node.addChild(cmd_lvl)
|
156
|
-
import_lvl = Qt::TreeWidgetItem.new
|
157
|
-
import_lvl.setText(0, "Import")
|
158
|
-
parent_node.addChild(import_lvl)
|
159
|
-
export_lvl = Qt::TreeWidgetItem.new
|
160
|
-
export_lvl.setText(0, "Export")
|
161
|
-
parent_node.addChild(export_lvl)
|
162
|
-
sniffer_lvl = Qt::TreeWidgetItem.new
|
163
|
-
sniffer_lvl.setText(0, "Sniffer")
|
164
|
-
parent_node.addChild(sniffer_lvl)
|
165
|
-
when 'I2C'
|
166
|
-
settings_lvl = Qt::TreeWidgetItem.new
|
167
|
-
settings_lvl.setText(0, "Settings")
|
168
|
-
parent_node.addChild(settings_lvl)
|
169
|
-
scanner_lvl = Qt::TreeWidgetItem.new
|
170
|
-
scanner_lvl.setText(0, "PIN Scanner")
|
171
|
-
parent_node.addChild(scanner_lvl)
|
172
|
-
cmd_lvl = Qt::TreeWidgetItem.new
|
173
|
-
cmd_lvl.setText(0, "Commands")
|
174
|
-
parent_node.addChild(cmd_lvl)
|
175
|
-
import_lvl = Qt::TreeWidgetItem.new
|
176
|
-
import_lvl.setText(0, "Import")
|
177
|
-
parent_node.addChild(import_lvl)
|
178
|
-
export_lvl = Qt::TreeWidgetItem.new
|
179
|
-
export_lvl.setText(0, "Export")
|
180
|
-
parent_node.addChild(export_lvl)
|
181
|
-
when 'PARALLEL'
|
182
|
-
settings_lvl = Qt::TreeWidgetItem.new
|
183
|
-
settings_lvl.setText(0, "Settings")
|
184
|
-
parent_node.addChild(settings_lvl)
|
185
|
-
# Not implemented yet
|
186
|
-
#import_lvl = Qt::TreeWidgetItem.new
|
187
|
-
#import_lvl.setText(0, "Import")
|
188
|
-
#parent_node.addChild(import_lvl)
|
189
|
-
export_lvl = Qt::TreeWidgetItem.new
|
190
|
-
export_lvl.setText(0, "Export")
|
191
|
-
parent_node.addChild(export_lvl)
|
192
|
-
end
|
193
|
-
return parent_node
|
194
|
-
end
|
195
|
-
|
196
|
-
def feed_chip_array
|
197
|
-
@view.tbl_chip.clearContents
|
198
|
-
chips = filter_chips
|
199
|
-
@view.tbl_chip.setRowCount(chips.count);
|
200
|
-
# Insert chip table rows
|
201
|
-
chips.to_enum.with_index(0).each do |c, i|
|
202
|
-
# Reference
|
203
|
-
item = Qt::TableWidgetItem.new(c.reference)
|
204
|
-
item.setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled)
|
205
|
-
@view.tbl_chip.setItem(i, 0, item)
|
206
|
-
# Chip Type
|
207
|
-
item2 = Qt::TableWidgetItem.new(ChipType.find(c.chip_type_id).name)
|
208
|
-
item2.setFlags(Qt::ItemIsEnabled)
|
209
|
-
@view.tbl_chip.setItem(i, 1, item2)
|
210
|
-
# Chip Manufacturer
|
211
|
-
item3 = Qt::TableWidgetItem.new(Manufacturer.find(c.manufacturer_id).name)
|
212
|
-
item3.setFlags(Qt::ItemIsEnabled)
|
213
|
-
@view.tbl_chip.setItem(i, 2, item3)
|
214
|
-
bus_list = get_chip_buses(c)
|
215
|
-
bus_list_str = ''
|
216
|
-
bus_list.each do |b|
|
217
|
-
bus_list_str = bus_list_str + "#{b} "
|
218
|
-
end
|
219
|
-
# Chip Bus(es)
|
220
|
-
item4 = Qt::TableWidgetItem.new(bus_list_str)
|
221
|
-
item4.setFlags(Qt::ItemIsEnabled)
|
222
|
-
@view.tbl_chip.setItem(i, 3, item4)
|
223
|
-
end
|
224
|
-
@view.tbl_chip.resizeColumnsToContents
|
225
|
-
@view.tbl_chip.resizeRowsToContents
|
226
|
-
@view.tbl_chip.horizontalHeader.stretchLastSection = true
|
227
|
-
@view.tbl_console.horizontalHeader.stretchLastSection = true
|
228
|
-
end
|
229
|
-
|
230
|
-
def filter_chips
|
231
|
-
if @view.lie_search.text.empty?
|
232
|
-
chips = Chip.all
|
233
|
-
else
|
234
|
-
chips = Chip.where("reference LIKE ?", "%#{@view.lie_search.text}%")
|
235
|
-
end
|
236
|
-
unless @view.cbx_manufacturer.currentIndex.zero?
|
237
|
-
man_id = Manufacturer.find_by(name: @view.cbx_manufacturer.currentText).id
|
238
|
-
chips = chips.where(manufacturer_id: man_id)
|
239
|
-
end
|
240
|
-
unless @view.cbx_type.currentIndex.zero?
|
241
|
-
type_id = ChipType.find_by(name: @view.cbx_type.currentText).id
|
242
|
-
chips = chips.where(chip_type_id: type_id)
|
243
|
-
end
|
244
|
-
return chips
|
245
|
-
end
|
246
|
-
|
247
|
-
def load_chip_action(item, column)
|
248
|
-
return 0 unless item.childCount.zero?
|
249
|
-
if item.parent.text(0) == 'Manage'
|
250
|
-
case item.text(0)
|
251
|
-
when 'Wiring' ; wire_chip
|
252
|
-
when 'Edit' ; edit_chip
|
253
|
-
when 'Template' ; add_chip
|
254
|
-
when 'Delete' ; delete_chip
|
255
|
-
end
|
256
|
-
else
|
257
|
-
case item.parent.text(0)
|
258
|
-
when 'SPI' ; load_spi_module(item.text(0))
|
259
|
-
when 'I2C' ; load_i2c_module(item.text(0))
|
260
|
-
when 'PARALLEL' ; load_parallel_module(item.text(0))
|
261
|
-
when 'SWD' ; load_swd_module(item.text(0))
|
262
|
-
when 'UART' ; load_uart_module(item.text(0))
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
def load_spi_module(spi_module)
|
268
|
-
case spi_module
|
269
|
-
when 'Settings' ; Spi_settings.new(@chip_clicked).show
|
270
|
-
when 'Commands' ; Generic_commands.new(@chip_clicked, 'SPI').show
|
271
|
-
when 'Import' ; Spi_import.new(@chip_clicked).show
|
272
|
-
when 'Export' ; Spi_export.new(@chip_clicked).show
|
273
|
-
when 'Sniffer' ; Spi_sniffer.new(@chip_clicked).show
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
def load_i2c_module(i2c_module)
|
278
|
-
case i2c_module
|
279
|
-
when 'Settings' ; I2c_settings.new(@chip_clicked).show
|
280
|
-
when 'PIN Scanner' ; I2c_scanner.new.show
|
281
|
-
when 'Commands' ; Generic_commands.new(@chip_clicked, 'I2C').show
|
282
|
-
when 'Import' ; I2c_import.new(@chip_clicked).show
|
283
|
-
when 'Export' ; I2c_export.new(@chip_clicked).show
|
284
|
-
end
|
285
|
-
end
|
286
|
-
|
287
|
-
def load_parallel_module(parallel_module)
|
288
|
-
case parallel_module
|
289
|
-
when 'Settings' ; Parallel_settings.new(@chip_clicked).show
|
290
|
-
when 'Import' ; Parallel_import.new(@chip_clicked).show
|
291
|
-
when 'Export' ; Parallel_export.new(@chip_clicked).show
|
292
|
-
end
|
293
|
-
end
|
294
|
-
|
295
|
-
def load_swd_module(swd_module)
|
296
|
-
case swd_module
|
297
|
-
when 'Settings' ; Swd_settings.new(@chip_clicked).show
|
298
|
-
when 'PIN Scanner' ; Swd_scanner.new.show
|
299
|
-
when 'Detect' ; Swd.new(@chip_clicked, @console).detect
|
300
|
-
when 'Import'
|
301
|
-
filepath = Qt::FileDialog.getOpenFileName(self, tr('Select a file'), '/')
|
302
|
-
Swd.new(@chip_clicked, @console).import(filepath) unless filepath.nil?
|
303
|
-
when 'Dump'
|
304
|
-
filepath = Qt::FileDialog.getSaveFileName(self, tr('Select a file'), '/')
|
305
|
-
Swd.new(@chip_clicked, @console).export(filepath) unless filepath.nil?
|
306
|
-
when 'Erase' ; Swd.new(@chip_clicked, @console).erase
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
|
-
def load_uart_module(uart_module)
|
311
|
-
case uart_module
|
312
|
-
when 'Settings'
|
313
|
-
settingsUart = Uart_settings.new(@chip_clicked)
|
314
|
-
settingsUart.setWindowModality(Qt::ApplicationModal)
|
315
|
-
settingsUart.show
|
316
|
-
when 'Console'
|
317
|
-
consoleUart = Uart_console.new(@chip_clicked)
|
318
|
-
consoleUart.setWindowModality(Qt::ApplicationModal)
|
319
|
-
consoleUart.show
|
320
|
-
end
|
321
|
-
end
|
322
|
-
|
323
|
-
def add_chip
|
324
|
-
|
325
|
-
if sender.objectName == 'tw_chip' or sender.objectName == 'actionTemplate'
|
326
|
-
unless @chip_clicked.nil?
|
327
|
-
add_chip = Chip_editor.new(self, @chip_clicked, 'temp')
|
328
|
-
else
|
329
|
-
ErrorMsg.new.no_chip_loaded
|
330
|
-
end
|
331
|
-
else
|
332
|
-
add_chip = Chip_editor.new(self, 'none', 'new')
|
333
|
-
end
|
334
|
-
add_chip.show
|
335
|
-
end
|
336
|
-
|
337
|
-
def edit_chip
|
338
|
-
return ErrorMsg.new.no_chip_loaded if @chip_clicked.nil?
|
339
|
-
edit_chip = Chip_editor.new(self, @chip_clicked, 'edit')
|
340
|
-
edit_chip.show
|
341
|
-
end
|
342
|
-
|
343
|
-
def delete_chip
|
344
|
-
return ErrorMsg.new.no_chip_loaded if @chip_clicked.nil?
|
345
|
-
msg = Qt::MessageBox.new
|
346
|
-
msg.setWindowTitle("Delete current chip")
|
347
|
-
msg.setText("Delete #{@chip_clicked.reference}? Commands will be deleted too.")
|
348
|
-
msg.setIcon(Qt::MessageBox::Question)
|
349
|
-
msg.setStandardButtons(Qt::MessageBox::Cancel | Qt::MessageBox::Ok)
|
350
|
-
msg.setDefaultButton(Qt::MessageBox::Cancel)
|
351
|
-
if msg.exec == Qt::MessageBox::Ok
|
352
|
-
@chip_clicked.destroy
|
353
|
-
@chip_clicked = nil
|
354
|
-
feed_chip_array
|
355
|
-
@view.tw_chip.clear
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
|
-
def wire_chip
|
360
|
-
return ErrorMsg.new.hardsploit_not_found unless HardsploitAPI.getNumberOfBoardAvailable > 0
|
361
|
-
return ErrorMsg.new.no_chip_loaded if @chip_clicked.nil?
|
362
|
-
wire_helper = Wire_helper.new(@chip_clicked)
|
363
|
-
wire_helper.setWindowModality(Qt::ApplicationModal)
|
364
|
-
wire_helper.show
|
365
|
-
end
|
366
|
-
|
367
|
-
def import
|
368
|
-
if @chip_clicked.nil?
|
369
|
-
import = Import.new(self)
|
370
|
-
else
|
371
|
-
import = Import.new(self, @chip_clicked)
|
372
|
-
end
|
373
|
-
import.setWindowModality(Qt::ApplicationModal)
|
374
|
-
import.show
|
375
|
-
end
|
376
|
-
|
377
|
-
def export
|
378
|
-
return ErrorMsg.new.no_chip_loaded if @chip_clicked.nil?
|
379
|
-
export = Export.new(@view.tbl_chip.selectedItems)
|
380
|
-
export.setWindowModality(Qt::ApplicationModal)
|
381
|
-
export.show
|
382
|
-
end
|
383
|
-
|
384
|
-
def display_current_firmware
|
385
|
-
if $currentFirmware.nil?
|
386
|
-
Qt::MessageBox.new(
|
387
|
-
Qt::MessageBox::Information,
|
388
|
-
'Firmware',
|
389
|
-
'No firmware loaded'
|
390
|
-
).exec
|
391
|
-
else
|
392
|
-
Qt::MessageBox.new(
|
393
|
-
Qt::MessageBox::Information,
|
394
|
-
'Firmware',
|
395
|
-
"Actual firmware: #{$currentFirmware}"
|
396
|
-
).exec
|
397
|
-
end
|
398
|
-
end
|
399
|
-
|
400
|
-
def set_firmware
|
401
|
-
Firmware.new(sender.objectName[6, sender.objectName.length])
|
402
|
-
display_current_firmware
|
403
|
-
end
|
404
|
-
|
405
|
-
def update_uc_firmware
|
406
|
-
Firmware.new('uC')
|
407
|
-
end
|
408
|
-
|
409
|
-
def get_hardsploit_versions
|
410
|
-
if HardsploitAPI.getNumberOfBoardAvailable > 0
|
411
|
-
Qt::MessageBox.new(
|
412
|
-
Qt::MessageBox::Information,
|
413
|
-
'Hardsploit versions',
|
414
|
-
"GUI VERSION : #{@versionGUI}\n"+
|
415
|
-
"API VERSION : #{HardsploitAPI::VERSION::API}\n"+
|
416
|
-
"BOARD : #{HardsploitAPI.instance.getVersionNumber}"
|
417
|
-
).exec
|
418
|
-
else
|
419
|
-
Qt::MessageBox.new(
|
420
|
-
Qt::MessageBox::Information,
|
421
|
-
'Hardsploit versions',
|
422
|
-
"GUI VERSION : #{@versionGUI}\n "+
|
423
|
-
"API VERSION : #{HardsploitAPI::VERSION::API}"
|
424
|
-
).exec
|
425
|
-
end
|
426
|
-
end
|
427
|
-
|
428
|
-
def get_log_path
|
429
|
-
msg = Qt::MessageBox.new
|
430
|
-
msg.setWindowTitle('Log file path')
|
431
|
-
msg.setText("Path: #{$logFilePath}")
|
432
|
-
msg.setIcon(Qt::MessageBox::Information)
|
433
|
-
close_btn = msg.setStandardButtons(Qt::MessageBox::Close)
|
434
|
-
open_btn = msg.addButton('Open folder', Qt::MessageBox::ActionRole)
|
435
|
-
open_btn.setObjectName('open_btn')
|
436
|
-
msg.exec
|
437
|
-
if msg.clickedButton.objectName == 'open_btn'
|
438
|
-
system("xdg-open #{$logFilePath}")
|
439
|
-
end
|
440
|
-
end
|
441
|
-
|
442
|
-
def get_db_path
|
443
|
-
msg = Qt::MessageBox.new
|
444
|
-
msg.setWindowTitle('Database path')
|
445
|
-
msg.setText("Path: #{$dbFilePath}\n")
|
446
|
-
msg.setIcon(Qt::MessageBox::Information)
|
447
|
-
close_btn = msg.setStandardButtons(Qt::MessageBox::Close)
|
448
|
-
open_btn = msg.addButton('Open folder', Qt::MessageBox::ActionRole)
|
449
|
-
open_btn.setObjectName('open_btn')
|
450
|
-
backup_btn = msg.addButton('Create backup', Qt::MessageBox::ActionRole)
|
451
|
-
backup_btn.setObjectName('backup_btn')
|
452
|
-
msg.exec
|
453
|
-
if msg.clickedButton.objectName == 'backup_btn'
|
454
|
-
system("cp #{$dbFilePath} #{$dbFilePath}.bck")
|
455
|
-
Qt::MessageBox.new(
|
456
|
-
Qt::MessageBox::Information,
|
457
|
-
'Backup status',
|
458
|
-
'db.bck created'
|
459
|
-
).exec
|
460
|
-
end
|
461
|
-
if msg.clickedButton.objectName == 'open_btn'
|
462
|
-
system("xdg-open #{$dbFilePath}")
|
463
|
-
end
|
464
|
-
end
|
465
|
-
|
466
|
-
def get_hardsploit_website
|
467
|
-
Qt::MessageBox.new(
|
468
|
-
Qt::MessageBox::Information,
|
469
|
-
'Hardsploit website',
|
470
|
-
'Find all the news about Hardsploit on our website: http://hardsploit.io'
|
471
|
-
).exec
|
472
|
-
end
|
473
|
-
|
474
|
-
def open_signal_mapper
|
475
|
-
signal_mapper = Signal_mapper.new
|
476
|
-
signal_mapper.setWindowModality(Qt::ApplicationModal)
|
477
|
-
signal_mapper.show
|
478
|
-
end
|
479
|
-
|
480
|
-
def check_hardsploit_connection
|
481
|
-
if HardsploitAPI.getNumberOfBoardAvailable > 0
|
482
|
-
HardsploitAPI.id = ARGV[0].to_i
|
483
|
-
@console.print(
|
484
|
-
"Hardsploit board detected GUI V#{@versionGUI} "+
|
485
|
-
"API V#{HardsploitAPI::VERSION::API} "+
|
486
|
-
"BOARD : #{HardsploitAPI.instance.getVersionNumber}"
|
487
|
-
)
|
488
|
-
@console.print('Hardsploit ready to suck chip souls !')
|
489
|
-
else
|
490
|
-
@console.print(
|
491
|
-
'Hardsploit board unconnected: '+
|
492
|
-
'Wiring and command execution disabled'
|
493
|
-
)
|
494
|
-
end
|
495
|
-
end
|
496
|
-
end
|
1
|
+
#===================================================
|
2
|
+
# Hardsploit GUI - By Opale Security
|
3
|
+
# www.opale-security.com || www.hardsploit.io
|
4
|
+
# License: GNU General Public License v3
|
5
|
+
# License URI: http://www.gnu.org/licenses/gpl.txt
|
6
|
+
#===================================================
|
7
|
+
|
8
|
+
ABSOLUTE_PATH = File.expand_path(File.dirname(__FILE__)) + "/"
|
9
|
+
|
10
|
+
Dir[ABSOLUTE_PATH + "../models/*.rb"].each {|file| require_relative file }
|
11
|
+
Dir[ABSOLUTE_PATH + "*.rb"].each {|file| require_relative file }
|
12
|
+
Dir[ABSOLUTE_PATH + "parallel/*.rb"].each {|file| require_relative file }
|
13
|
+
Dir[ABSOLUTE_PATH + "spi/*.rb"].each {|file| require_relative file }
|
14
|
+
Dir[ABSOLUTE_PATH + "i2c/*.rb"].each {|file| require_relative file }
|
15
|
+
Dir[ABSOLUTE_PATH + "swd/*.rb"].each {|file| require_relative file }
|
16
|
+
Dir[ABSOLUTE_PATH + "uart/*.rb"].each {|file| require_relative file }
|
17
|
+
|
18
|
+
class Chip_management < Qt::MainWindow
|
19
|
+
slots 'load_tree(int, int)'
|
20
|
+
slots 'load_chip_action(QTreeWidgetItem*, int)'
|
21
|
+
slots 'feed_chip_array()'
|
22
|
+
slots 'update_uc_firmware()'
|
23
|
+
slots 'get_hardsploit_versions()'
|
24
|
+
slots 'get_log_path()'
|
25
|
+
slots 'get_db_path()'
|
26
|
+
slots 'get_hardsploit_website()'
|
27
|
+
slots 'set_firmware()'
|
28
|
+
slots 'display_current_firmware()'
|
29
|
+
slots 'console_view()'
|
30
|
+
slots 'add_chip()'
|
31
|
+
slots 'edit_chip()'
|
32
|
+
slots 'wire_chip()'
|
33
|
+
slots 'delete_chip()'
|
34
|
+
slots 'import()'
|
35
|
+
slots 'export()'
|
36
|
+
slots 'open_signal_mapper()'
|
37
|
+
|
38
|
+
def initialize(versionGUI)
|
39
|
+
super()
|
40
|
+
@view = Ui_Chip_management.new
|
41
|
+
@view.setupUi(self)
|
42
|
+
@view.img_search.setPixmap(Qt::Pixmap.new(File.expand_path(File.dirname(__FILE__)) + "/../images/search.png"))
|
43
|
+
inputRestrict(@view.lie_search, 2)
|
44
|
+
feed_chip_array
|
45
|
+
feed_manufacturer_cbx
|
46
|
+
feed_type_cbx
|
47
|
+
@console = Console.new(@view.tbl_console)
|
48
|
+
@versionGUI = versionGUI
|
49
|
+
check_hardsploit_connection
|
50
|
+
rescue Exception => msg
|
51
|
+
ErrorMsg.new.unknown(msg)
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
|
55
|
+
def feed_type_cbx
|
56
|
+
Manufacturer.all.each do |m|
|
57
|
+
@view.cbx_manufacturer.addItem(m.name)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def feed_manufacturer_cbx
|
62
|
+
ChipType.all.each do |c|
|
63
|
+
@view.cbx_type.addItem(c.name)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def console_view
|
68
|
+
sender.isChecked ? @view.tbl_console.show : @view.tbl_console.hide
|
69
|
+
end
|
70
|
+
|
71
|
+
def get_chip_buses(chip)
|
72
|
+
chip_buses = []
|
73
|
+
chip.pins.each do |pin|
|
74
|
+
chip_buses.push(pin.signall.buses[0].name)
|
75
|
+
end
|
76
|
+
chip_buses.delete("NA")
|
77
|
+
return chip_buses.uniq
|
78
|
+
end
|
79
|
+
|
80
|
+
def load_tree(line, column)
|
81
|
+
return 0 unless column.zero?
|
82
|
+
@view.tw_chip.clear
|
83
|
+
@chip_clicked = Chip.find_by(reference: @view.tbl_chip.item(line, column).text)
|
84
|
+
# CHIP LEVEL
|
85
|
+
chip_lvl = Qt::TreeWidgetItem.new
|
86
|
+
chip_lvl.setText(0, @view.tbl_chip.item(line, column).text)
|
87
|
+
@view.tw_chip.addTopLevelItem(chip_lvl)
|
88
|
+
chip_lvl.setExpanded(true)
|
89
|
+
# ACTION LEVEL
|
90
|
+
action_lvl = Qt::TreeWidgetItem.new
|
91
|
+
action_lvl.setText(0, 'Manage')
|
92
|
+
chip_lvl.addChild(create_action_nodes(action_lvl))
|
93
|
+
action_lvl.setExpanded(true)
|
94
|
+
|
95
|
+
# BUS LEVEL(S)
|
96
|
+
chip_bus = get_chip_buses(@chip_clicked)
|
97
|
+
chip_bus.each do |b|
|
98
|
+
@bus_lvl = Qt::TreeWidgetItem.new
|
99
|
+
@bus_lvl.setText(0, b)
|
100
|
+
chip_lvl.addChild(create_bus_nodes(b, @bus_lvl))
|
101
|
+
@bus_lvl.setExpanded(true) unless @bus_lvl.nil?
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def create_action_nodes(parent_node)
|
106
|
+
wiring_lvl = Qt::TreeWidgetItem.new
|
107
|
+
wiring_lvl.setText(0, "Wiring")
|
108
|
+
parent_node.addChild(wiring_lvl)
|
109
|
+
edit_lvl = Qt::TreeWidgetItem.new
|
110
|
+
edit_lvl.setText(0, "Edit")
|
111
|
+
parent_node.addChild(edit_lvl)
|
112
|
+
template_lvl = Qt::TreeWidgetItem.new
|
113
|
+
template_lvl.setText(0, "Template")
|
114
|
+
parent_node.addChild(template_lvl)
|
115
|
+
delete_lvl = Qt::TreeWidgetItem.new
|
116
|
+
delete_lvl.setText(0, "Delete")
|
117
|
+
parent_node.addChild(delete_lvl)
|
118
|
+
return parent_node
|
119
|
+
end
|
120
|
+
|
121
|
+
def create_bus_nodes(bus, parent_node)
|
122
|
+
case bus
|
123
|
+
when 'UART'
|
124
|
+
settings_lvl = Qt::TreeWidgetItem.new
|
125
|
+
settings_lvl.setText(0, "Settings")
|
126
|
+
parent_node.addChild(settings_lvl)
|
127
|
+
console_lvl = Qt::TreeWidgetItem.new
|
128
|
+
console_lvl.setText(0, "Console")
|
129
|
+
parent_node.addChild(console_lvl)
|
130
|
+
when 'SWD'
|
131
|
+
settings_lvl = Qt::TreeWidgetItem.new
|
132
|
+
settings_lvl.setText(0, "Settings")
|
133
|
+
parent_node.addChild(settings_lvl)
|
134
|
+
scan_lvl = Qt::TreeWidgetItem.new
|
135
|
+
scan_lvl.setText(0, "PIN Scanner")
|
136
|
+
parent_node.addChild(scan_lvl)
|
137
|
+
detect_lvl = Qt::TreeWidgetItem.new
|
138
|
+
detect_lvl.setText(0, "Detect")
|
139
|
+
parent_node.addChild(detect_lvl)
|
140
|
+
import_lvl = Qt::TreeWidgetItem.new
|
141
|
+
import_lvl.setText(0, "Import")
|
142
|
+
parent_node.addChild(import_lvl)
|
143
|
+
export_lvl = Qt::TreeWidgetItem.new
|
144
|
+
export_lvl.setText(0, "Dump")
|
145
|
+
parent_node.addChild(export_lvl)
|
146
|
+
erase_lvl = Qt::TreeWidgetItem.new
|
147
|
+
erase_lvl.setText(0, "Erase")
|
148
|
+
parent_node.addChild(erase_lvl)
|
149
|
+
when 'SPI'
|
150
|
+
settings_lvl = Qt::TreeWidgetItem.new
|
151
|
+
settings_lvl.setText(0, "Settings")
|
152
|
+
parent_node.addChild(settings_lvl)
|
153
|
+
cmd_lvl = Qt::TreeWidgetItem.new
|
154
|
+
cmd_lvl.setText(0, "Commands")
|
155
|
+
parent_node.addChild(cmd_lvl)
|
156
|
+
import_lvl = Qt::TreeWidgetItem.new
|
157
|
+
import_lvl.setText(0, "Import")
|
158
|
+
parent_node.addChild(import_lvl)
|
159
|
+
export_lvl = Qt::TreeWidgetItem.new
|
160
|
+
export_lvl.setText(0, "Export")
|
161
|
+
parent_node.addChild(export_lvl)
|
162
|
+
sniffer_lvl = Qt::TreeWidgetItem.new
|
163
|
+
sniffer_lvl.setText(0, "Sniffer")
|
164
|
+
parent_node.addChild(sniffer_lvl)
|
165
|
+
when 'I2C'
|
166
|
+
settings_lvl = Qt::TreeWidgetItem.new
|
167
|
+
settings_lvl.setText(0, "Settings")
|
168
|
+
parent_node.addChild(settings_lvl)
|
169
|
+
scanner_lvl = Qt::TreeWidgetItem.new
|
170
|
+
scanner_lvl.setText(0, "PIN Scanner")
|
171
|
+
parent_node.addChild(scanner_lvl)
|
172
|
+
cmd_lvl = Qt::TreeWidgetItem.new
|
173
|
+
cmd_lvl.setText(0, "Commands")
|
174
|
+
parent_node.addChild(cmd_lvl)
|
175
|
+
import_lvl = Qt::TreeWidgetItem.new
|
176
|
+
import_lvl.setText(0, "Import")
|
177
|
+
parent_node.addChild(import_lvl)
|
178
|
+
export_lvl = Qt::TreeWidgetItem.new
|
179
|
+
export_lvl.setText(0, "Export")
|
180
|
+
parent_node.addChild(export_lvl)
|
181
|
+
when 'PARALLEL'
|
182
|
+
settings_lvl = Qt::TreeWidgetItem.new
|
183
|
+
settings_lvl.setText(0, "Settings")
|
184
|
+
parent_node.addChild(settings_lvl)
|
185
|
+
# Not implemented yet
|
186
|
+
#import_lvl = Qt::TreeWidgetItem.new
|
187
|
+
#import_lvl.setText(0, "Import")
|
188
|
+
#parent_node.addChild(import_lvl)
|
189
|
+
export_lvl = Qt::TreeWidgetItem.new
|
190
|
+
export_lvl.setText(0, "Export")
|
191
|
+
parent_node.addChild(export_lvl)
|
192
|
+
end
|
193
|
+
return parent_node
|
194
|
+
end
|
195
|
+
|
196
|
+
def feed_chip_array
|
197
|
+
@view.tbl_chip.clearContents
|
198
|
+
chips = filter_chips
|
199
|
+
@view.tbl_chip.setRowCount(chips.count);
|
200
|
+
# Insert chip table rows
|
201
|
+
chips.to_enum.with_index(0).each do |c, i|
|
202
|
+
# Reference
|
203
|
+
item = Qt::TableWidgetItem.new(c.reference)
|
204
|
+
item.setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled)
|
205
|
+
@view.tbl_chip.setItem(i, 0, item)
|
206
|
+
# Chip Type
|
207
|
+
item2 = Qt::TableWidgetItem.new(ChipType.find(c.chip_type_id).name)
|
208
|
+
item2.setFlags(Qt::ItemIsEnabled)
|
209
|
+
@view.tbl_chip.setItem(i, 1, item2)
|
210
|
+
# Chip Manufacturer
|
211
|
+
item3 = Qt::TableWidgetItem.new(Manufacturer.find(c.manufacturer_id).name)
|
212
|
+
item3.setFlags(Qt::ItemIsEnabled)
|
213
|
+
@view.tbl_chip.setItem(i, 2, item3)
|
214
|
+
bus_list = get_chip_buses(c)
|
215
|
+
bus_list_str = ''
|
216
|
+
bus_list.each do |b|
|
217
|
+
bus_list_str = bus_list_str + "#{b} "
|
218
|
+
end
|
219
|
+
# Chip Bus(es)
|
220
|
+
item4 = Qt::TableWidgetItem.new(bus_list_str)
|
221
|
+
item4.setFlags(Qt::ItemIsEnabled)
|
222
|
+
@view.tbl_chip.setItem(i, 3, item4)
|
223
|
+
end
|
224
|
+
@view.tbl_chip.resizeColumnsToContents
|
225
|
+
@view.tbl_chip.resizeRowsToContents
|
226
|
+
@view.tbl_chip.horizontalHeader.stretchLastSection = true
|
227
|
+
@view.tbl_console.horizontalHeader.stretchLastSection = true
|
228
|
+
end
|
229
|
+
|
230
|
+
def filter_chips
|
231
|
+
if @view.lie_search.text.empty?
|
232
|
+
chips = Chip.all
|
233
|
+
else
|
234
|
+
chips = Chip.where("reference LIKE ?", "%#{@view.lie_search.text}%")
|
235
|
+
end
|
236
|
+
unless @view.cbx_manufacturer.currentIndex.zero?
|
237
|
+
man_id = Manufacturer.find_by(name: @view.cbx_manufacturer.currentText).id
|
238
|
+
chips = chips.where(manufacturer_id: man_id)
|
239
|
+
end
|
240
|
+
unless @view.cbx_type.currentIndex.zero?
|
241
|
+
type_id = ChipType.find_by(name: @view.cbx_type.currentText).id
|
242
|
+
chips = chips.where(chip_type_id: type_id)
|
243
|
+
end
|
244
|
+
return chips
|
245
|
+
end
|
246
|
+
|
247
|
+
def load_chip_action(item, column)
|
248
|
+
return 0 unless item.childCount.zero?
|
249
|
+
if item.parent.text(0) == 'Manage'
|
250
|
+
case item.text(0)
|
251
|
+
when 'Wiring' ; wire_chip
|
252
|
+
when 'Edit' ; edit_chip
|
253
|
+
when 'Template' ; add_chip
|
254
|
+
when 'Delete' ; delete_chip
|
255
|
+
end
|
256
|
+
else
|
257
|
+
case item.parent.text(0)
|
258
|
+
when 'SPI' ; load_spi_module(item.text(0))
|
259
|
+
when 'I2C' ; load_i2c_module(item.text(0))
|
260
|
+
when 'PARALLEL' ; load_parallel_module(item.text(0))
|
261
|
+
when 'SWD' ; load_swd_module(item.text(0))
|
262
|
+
when 'UART' ; load_uart_module(item.text(0))
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
def load_spi_module(spi_module)
|
268
|
+
case spi_module
|
269
|
+
when 'Settings' ; Spi_settings.new(@chip_clicked).show
|
270
|
+
when 'Commands' ; Generic_commands.new(@chip_clicked, 'SPI').show
|
271
|
+
when 'Import' ; Spi_import.new(@chip_clicked).show
|
272
|
+
when 'Export' ; Spi_export.new(@chip_clicked).show
|
273
|
+
when 'Sniffer' ; Spi_sniffer.new(@chip_clicked).show
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def load_i2c_module(i2c_module)
|
278
|
+
case i2c_module
|
279
|
+
when 'Settings' ; I2c_settings.new(@chip_clicked).show
|
280
|
+
when 'PIN Scanner' ; I2c_scanner.new.show
|
281
|
+
when 'Commands' ; Generic_commands.new(@chip_clicked, 'I2C').show
|
282
|
+
when 'Import' ; I2c_import.new(@chip_clicked).show
|
283
|
+
when 'Export' ; I2c_export.new(@chip_clicked).show
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
def load_parallel_module(parallel_module)
|
288
|
+
case parallel_module
|
289
|
+
when 'Settings' ; Parallel_settings.new(@chip_clicked).show
|
290
|
+
when 'Import' ; Parallel_import.new(@chip_clicked).show
|
291
|
+
when 'Export' ; Parallel_export.new(@chip_clicked).show
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
def load_swd_module(swd_module)
|
296
|
+
case swd_module
|
297
|
+
when 'Settings' ; Swd_settings.new(@chip_clicked).show
|
298
|
+
when 'PIN Scanner' ; Swd_scanner.new.show
|
299
|
+
when 'Detect' ; Swd.new(@chip_clicked, @console).detect
|
300
|
+
when 'Import'
|
301
|
+
filepath = Qt::FileDialog.getOpenFileName(self, tr('Select a file'), '/')
|
302
|
+
Swd.new(@chip_clicked, @console).import(filepath) unless filepath.nil?
|
303
|
+
when 'Dump'
|
304
|
+
filepath = Qt::FileDialog.getSaveFileName(self, tr('Select a file'), '/')
|
305
|
+
Swd.new(@chip_clicked, @console).export(filepath) unless filepath.nil?
|
306
|
+
when 'Erase' ; Swd.new(@chip_clicked, @console).erase
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
def load_uart_module(uart_module)
|
311
|
+
case uart_module
|
312
|
+
when 'Settings'
|
313
|
+
settingsUart = Uart_settings.new(@chip_clicked)
|
314
|
+
settingsUart.setWindowModality(Qt::ApplicationModal)
|
315
|
+
settingsUart.show
|
316
|
+
when 'Console'
|
317
|
+
consoleUart = Uart_console.new(@chip_clicked)
|
318
|
+
consoleUart.setWindowModality(Qt::ApplicationModal)
|
319
|
+
consoleUart.show
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
def add_chip
|
324
|
+
|
325
|
+
if sender.objectName == 'tw_chip' or sender.objectName == 'actionTemplate'
|
326
|
+
unless @chip_clicked.nil?
|
327
|
+
add_chip = Chip_editor.new(self, @chip_clicked, 'temp')
|
328
|
+
else
|
329
|
+
ErrorMsg.new.no_chip_loaded
|
330
|
+
end
|
331
|
+
else
|
332
|
+
add_chip = Chip_editor.new(self, 'none', 'new')
|
333
|
+
end
|
334
|
+
add_chip.show
|
335
|
+
end
|
336
|
+
|
337
|
+
def edit_chip
|
338
|
+
return ErrorMsg.new.no_chip_loaded if @chip_clicked.nil?
|
339
|
+
edit_chip = Chip_editor.new(self, @chip_clicked, 'edit')
|
340
|
+
edit_chip.show
|
341
|
+
end
|
342
|
+
|
343
|
+
def delete_chip
|
344
|
+
return ErrorMsg.new.no_chip_loaded if @chip_clicked.nil?
|
345
|
+
msg = Qt::MessageBox.new
|
346
|
+
msg.setWindowTitle("Delete current chip")
|
347
|
+
msg.setText("Delete #{@chip_clicked.reference}? Commands will be deleted too.")
|
348
|
+
msg.setIcon(Qt::MessageBox::Question)
|
349
|
+
msg.setStandardButtons(Qt::MessageBox::Cancel | Qt::MessageBox::Ok)
|
350
|
+
msg.setDefaultButton(Qt::MessageBox::Cancel)
|
351
|
+
if msg.exec == Qt::MessageBox::Ok
|
352
|
+
@chip_clicked.destroy
|
353
|
+
@chip_clicked = nil
|
354
|
+
feed_chip_array
|
355
|
+
@view.tw_chip.clear
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
def wire_chip
|
360
|
+
return ErrorMsg.new.hardsploit_not_found unless HardsploitAPI.getNumberOfBoardAvailable > 0
|
361
|
+
return ErrorMsg.new.no_chip_loaded if @chip_clicked.nil?
|
362
|
+
wire_helper = Wire_helper.new(@chip_clicked)
|
363
|
+
wire_helper.setWindowModality(Qt::ApplicationModal)
|
364
|
+
wire_helper.show
|
365
|
+
end
|
366
|
+
|
367
|
+
def import
|
368
|
+
if @chip_clicked.nil?
|
369
|
+
import = Import.new(self)
|
370
|
+
else
|
371
|
+
import = Import.new(self, @chip_clicked)
|
372
|
+
end
|
373
|
+
import.setWindowModality(Qt::ApplicationModal)
|
374
|
+
import.show
|
375
|
+
end
|
376
|
+
|
377
|
+
def export
|
378
|
+
return ErrorMsg.new.no_chip_loaded if @chip_clicked.nil?
|
379
|
+
export = Export.new(@view.tbl_chip.selectedItems)
|
380
|
+
export.setWindowModality(Qt::ApplicationModal)
|
381
|
+
export.show
|
382
|
+
end
|
383
|
+
|
384
|
+
def display_current_firmware
|
385
|
+
if $currentFirmware.nil?
|
386
|
+
Qt::MessageBox.new(
|
387
|
+
Qt::MessageBox::Information,
|
388
|
+
'Firmware',
|
389
|
+
'No firmware loaded'
|
390
|
+
).exec
|
391
|
+
else
|
392
|
+
Qt::MessageBox.new(
|
393
|
+
Qt::MessageBox::Information,
|
394
|
+
'Firmware',
|
395
|
+
"Actual firmware: #{$currentFirmware}"
|
396
|
+
).exec
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
def set_firmware
|
401
|
+
Firmware.new(sender.objectName[6, sender.objectName.length])
|
402
|
+
display_current_firmware
|
403
|
+
end
|
404
|
+
|
405
|
+
def update_uc_firmware
|
406
|
+
Firmware.new('uC')
|
407
|
+
end
|
408
|
+
|
409
|
+
def get_hardsploit_versions
|
410
|
+
if HardsploitAPI.getNumberOfBoardAvailable > 0
|
411
|
+
Qt::MessageBox.new(
|
412
|
+
Qt::MessageBox::Information,
|
413
|
+
'Hardsploit versions',
|
414
|
+
"GUI VERSION : #{@versionGUI}\n"+
|
415
|
+
"API VERSION : #{HardsploitAPI::VERSION::API}\n"+
|
416
|
+
"BOARD : #{HardsploitAPI.instance.getVersionNumber}"
|
417
|
+
).exec
|
418
|
+
else
|
419
|
+
Qt::MessageBox.new(
|
420
|
+
Qt::MessageBox::Information,
|
421
|
+
'Hardsploit versions',
|
422
|
+
"GUI VERSION : #{@versionGUI}\n "+
|
423
|
+
"API VERSION : #{HardsploitAPI::VERSION::API}"
|
424
|
+
).exec
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
428
|
+
def get_log_path
|
429
|
+
msg = Qt::MessageBox.new
|
430
|
+
msg.setWindowTitle('Log file path')
|
431
|
+
msg.setText("Path: #{$logFilePath}")
|
432
|
+
msg.setIcon(Qt::MessageBox::Information)
|
433
|
+
close_btn = msg.setStandardButtons(Qt::MessageBox::Close)
|
434
|
+
open_btn = msg.addButton('Open folder', Qt::MessageBox::ActionRole)
|
435
|
+
open_btn.setObjectName('open_btn')
|
436
|
+
msg.exec
|
437
|
+
if msg.clickedButton.objectName == 'open_btn'
|
438
|
+
system("xdg-open #{$logFilePath}")
|
439
|
+
end
|
440
|
+
end
|
441
|
+
|
442
|
+
def get_db_path
|
443
|
+
msg = Qt::MessageBox.new
|
444
|
+
msg.setWindowTitle('Database path')
|
445
|
+
msg.setText("Path: #{$dbFilePath}\n")
|
446
|
+
msg.setIcon(Qt::MessageBox::Information)
|
447
|
+
close_btn = msg.setStandardButtons(Qt::MessageBox::Close)
|
448
|
+
open_btn = msg.addButton('Open folder', Qt::MessageBox::ActionRole)
|
449
|
+
open_btn.setObjectName('open_btn')
|
450
|
+
backup_btn = msg.addButton('Create backup', Qt::MessageBox::ActionRole)
|
451
|
+
backup_btn.setObjectName('backup_btn')
|
452
|
+
msg.exec
|
453
|
+
if msg.clickedButton.objectName == 'backup_btn'
|
454
|
+
system("cp #{$dbFilePath} #{$dbFilePath}.bck")
|
455
|
+
Qt::MessageBox.new(
|
456
|
+
Qt::MessageBox::Information,
|
457
|
+
'Backup status',
|
458
|
+
'db.bck created'
|
459
|
+
).exec
|
460
|
+
end
|
461
|
+
if msg.clickedButton.objectName == 'open_btn'
|
462
|
+
system("xdg-open #{$dbFilePath}")
|
463
|
+
end
|
464
|
+
end
|
465
|
+
|
466
|
+
def get_hardsploit_website
|
467
|
+
Qt::MessageBox.new(
|
468
|
+
Qt::MessageBox::Information,
|
469
|
+
'Hardsploit website',
|
470
|
+
'Find all the news about Hardsploit on our website: http://hardsploit.io'
|
471
|
+
).exec
|
472
|
+
end
|
473
|
+
|
474
|
+
def open_signal_mapper
|
475
|
+
signal_mapper = Signal_mapper.new
|
476
|
+
signal_mapper.setWindowModality(Qt::ApplicationModal)
|
477
|
+
signal_mapper.show
|
478
|
+
end
|
479
|
+
|
480
|
+
def check_hardsploit_connection
|
481
|
+
if HardsploitAPI.getNumberOfBoardAvailable > 0
|
482
|
+
HardsploitAPI.id = ARGV[0].to_i
|
483
|
+
@console.print(
|
484
|
+
"Hardsploit board detected GUI V#{@versionGUI} "+
|
485
|
+
"API V#{HardsploitAPI::VERSION::API} "+
|
486
|
+
"BOARD : #{HardsploitAPI.instance.getVersionNumber}"
|
487
|
+
)
|
488
|
+
@console.print('Hardsploit ready to suck chip souls !')
|
489
|
+
else
|
490
|
+
@console.print(
|
491
|
+
'Hardsploit board unconnected: '+
|
492
|
+
'Wiring and command execution disabled'
|
493
|
+
)
|
494
|
+
end
|
495
|
+
end
|
496
|
+
end
|