hardsploit_gui 2.3 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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