hardsploit_gui 2.3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -22
  3. data/Rakefile +1 -1
  4. data/bin/hardsploit_gui +3 -3
  5. data/lib/Firmwares/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
  6. data/lib/Firmwares/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
  7. data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
  8. data/lib/Firmwares/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd +0 -0
  9. data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
  10. data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
  11. data/lib/Firmwares/FPGA/VersionFPGA.rb +5 -5
  12. data/lib/Firmwares/UC/VersionUC.rb +12 -12
  13. data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -210
  14. data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -150
  15. data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -109
  16. data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -305
  17. data/lib/HardsploitAPI/Core/HardsploitAPI_PROGRESS.rb +28 -28
  18. data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -166
  19. data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -356
  20. data/lib/HardsploitAPI/Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb +206 -206
  21. data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -306
  22. data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -340
  23. data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -83
  24. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -367
  25. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -89
  26. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -61
  27. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_STM32.rb +121 -121
  28. data/lib/HardsploitAPI/Modules/TEST/HardsploitAPI_TEST_INTERACT.rb +98 -98
  29. data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -196
  30. data/lib/Hardsploit_gui.rb +96 -96
  31. data/lib/LICENSE.txt +674 -674
  32. data/lib/README.md +22 -22
  33. data/lib/TRADEMARK +2 -2
  34. data/lib/class/Chip_editor.rb +304 -304
  35. data/lib/class/Chip_management.rb +496 -496
  36. data/lib/class/Command_editor.rb +216 -216
  37. data/lib/class/Command_table.rb +233 -233
  38. data/lib/class/Console.rb +26 -26
  39. data/lib/class/ErrorMsg.rb +312 -312
  40. data/lib/class/Export.rb +140 -140
  41. data/lib/class/Export_manager.rb +124 -124
  42. data/lib/class/Firmware.rb +70 -70
  43. data/lib/class/Generic_commands.rb +260 -260
  44. data/lib/class/{i2c → I2C}/I2c_command.rb +51 -51
  45. data/lib/class/{i2c → I2C}/I2c_export.rb +95 -95
  46. data/lib/class/{i2c → I2C}/I2c_import.rb +117 -117
  47. data/lib/class/{i2c → I2C}/I2c_scanner.rb +114 -114
  48. data/lib/class/{i2c → I2C}/I2c_settings.rb +148 -148
  49. data/lib/class/Import.rb +193 -193
  50. data/lib/class/{parallel → PARALLEL}/Parallel_export.rb +118 -118
  51. data/lib/class/{parallel → PARALLEL}/Parallel_import.rb +113 -113
  52. data/lib/class/{parallel → PARALLEL}/Parallel_settings.rb +81 -81
  53. data/lib/class/Progress_bar.rb +32 -32
  54. data/lib/class/{spi → SPI}/Spi_export.rb +108 -108
  55. data/lib/class/{spi → SPI}/Spi_import.rb +159 -159
  56. data/lib/class/{spi → SPI}/Spi_settings.rb +108 -108
  57. data/lib/class/{spi → SPI}/Spi_sniffer.rb +101 -101
  58. data/lib/class/Signal_mapper.rb +120 -120
  59. data/lib/class/Wire_helper.rb +230 -230
  60. data/lib/class/swd/Swd.rb +125 -125
  61. data/lib/class/swd/Swd_scanner.rb +121 -121
  62. data/lib/class/swd/Swd_settings.rb +76 -76
  63. data/lib/class/uart/Uart_baudrate.rb +62 -62
  64. data/lib/class/uart/Uart_console.rb +115 -115
  65. data/lib/class/uart/Uart_settings.rb +102 -102
  66. data/lib/db/associations.rb +138 -138
  67. data/lib/db/database.rb +4 -4
  68. data/lib/db/development.sqlite3 +0 -0
  69. data/lib/db/migrate/004_create_manufacturers.rb +13 -13
  70. data/lib/db/migrate/005_create_packages.rb +13 -13
  71. data/lib/db/migrate/006_create_chip_types.rb +11 -11
  72. data/lib/db/migrate/007_create_buses.rb +11 -11
  73. data/lib/db/migrate/008_create_signals.rb +14 -14
  74. data/lib/db/migrate/009_create_chips.rb +25 -25
  75. data/lib/db/migrate/010_create_commands.rb +21 -21
  76. data/lib/db/migrate/011_create_bytes.rb +19 -19
  77. data/lib/db/migrate/012_create_i2c_settings.rb +21 -21
  78. data/lib/db/migrate/013_create_spi_settings.rb +26 -26
  79. data/lib/db/migrate/014_create_parallel_settings.rb +21 -21
  80. data/lib/db/migrate/015_create_pins.rb +19 -19
  81. data/lib/db/migrate/016_create_uses.rb +17 -17
  82. data/lib/db/migrate/017_create_swd_settings.rb +19 -19
  83. data/lib/db/migrate/018_create_uart_settings.rb +22 -22
  84. data/lib/db/schema.rb +157 -157
  85. data/lib/db/seeds.rb +161 -161
  86. data/lib/gui/gui_chip_editor.rb +349 -349
  87. data/lib/gui/gui_chip_management.rb +377 -377
  88. data/lib/gui/gui_command_editor.rb +219 -219
  89. data/lib/gui/gui_export.rb +132 -132
  90. data/lib/gui/gui_export_manager.rb +93 -93
  91. data/lib/gui/gui_generic_commands.rb +202 -202
  92. data/lib/gui/gui_generic_export.rb +164 -164
  93. data/lib/gui/gui_generic_import.rb +142 -142
  94. data/lib/gui/gui_i2c_command.rb +116 -116
  95. data/lib/gui/gui_i2c_settings.rb +230 -230
  96. data/lib/gui/gui_import.rb +131 -131
  97. data/lib/gui/gui_parallel_settings.rb +195 -195
  98. data/lib/gui/gui_progress_bar.rb +85 -85
  99. data/lib/gui/gui_signal_mapper.rb +121 -121
  100. data/lib/gui/gui_signal_scanner.rb +146 -146
  101. data/lib/gui/gui_spi_import.rb +126 -126
  102. data/lib/gui/gui_spi_settings.rb +313 -313
  103. data/lib/gui/gui_spi_sniffer.rb +112 -112
  104. data/lib/gui/gui_swd_settings.rb +166 -166
  105. data/lib/gui/gui_uart_baudrate.rb +114 -114
  106. data/lib/gui/gui_uart_console.rb +164 -164
  107. data/lib/gui/gui_uart_settings.rb +243 -243
  108. data/lib/gui/gui_wire_helper.rb +99 -99
  109. data/lib/gui_designer/gui_chip_editor.ui +549 -549
  110. data/lib/gui_designer/gui_chip_management.ui +886 -886
  111. data/lib/gui_designer/gui_command_editor.ui +350 -350
  112. data/lib/gui_designer/gui_export.ui +171 -171
  113. data/lib/gui_designer/gui_export_manager.ui +115 -115
  114. data/lib/gui_designer/gui_generic_commands.ui +342 -342
  115. data/lib/gui_designer/gui_generic_export.ui +202 -202
  116. data/lib/gui_designer/gui_generic_import.ui +165 -165
  117. data/lib/gui_designer/gui_i2c_command.ui +148 -148
  118. data/lib/gui_designer/gui_i2c_settings.ui +292 -292
  119. data/lib/gui_designer/gui_import.ui +168 -168
  120. data/lib/gui_designer/gui_parallel_settings.ui +247 -247
  121. data/lib/gui_designer/gui_progress_bar.ui +86 -86
  122. data/lib/gui_designer/gui_signal_mapper.ui +179 -179
  123. data/lib/gui_designer/gui_signal_scanner.ui +261 -261
  124. data/lib/gui_designer/gui_spi_settings.ui +446 -446
  125. data/lib/gui_designer/gui_spi_sniffer.ui +156 -156
  126. data/lib/gui_designer/gui_swd_settings.ui +189 -189
  127. data/lib/gui_designer/gui_uart_baudrate.ui +161 -161
  128. data/lib/gui_designer/gui_uart_console.ui +284 -284
  129. data/lib/gui_designer/gui_uart_settings.ui +280 -280
  130. data/lib/gui_designer/gui_wire_helper.ui +117 -117
  131. data/lib/images/search.png +0 -0
  132. data/lib/logs/error.log +0 -63
  133. data/lib/models/bus.rb +19 -19
  134. data/lib/models/byte.rb +29 -29
  135. data/lib/models/chip.rb +41 -41
  136. data/lib/models/chip_type.rb +14 -14
  137. data/lib/models/command.rb +20 -20
  138. data/lib/models/i2c_setting.rb +41 -41
  139. data/lib/models/manufacturer.rb +14 -14
  140. data/lib/models/package.rb +26 -26
  141. data/lib/models/parallel_setting.rb +37 -37
  142. data/lib/models/pin.rb +14 -14
  143. data/lib/models/signall.rb +20 -20
  144. data/lib/models/spi_setting.rb +67 -67
  145. data/lib/models/swd_setting.rb +25 -25
  146. data/lib/models/uart_setting.rb +52 -52
  147. data/lib/models/use.rb +6 -6
  148. data/lib/startHardsploit.rb +10 -10
  149. 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