hardsploit_gui 2.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 (81) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +22 -0
  3. data/Rakefile +1 -0
  4. data/bin/hardsploit_gui +3 -0
  5. data/lib/Firmware/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
  6. data/lib/Firmware/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
  7. data/lib/Firmware/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
  8. data/lib/Firmware/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
  9. data/lib/Firmware/FPGA/TEST/TEST_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_TEST_INTERACT.rpd +0 -0
  10. data/lib/Firmware/FPGA/VersionFPGA.rb +5 -0
  11. data/lib/Firmware/UC/HARDSPLOIT_FIRMWARE_UC.bin +0 -0
  12. data/lib/Firmware/UC/VersionUC.rb +12 -0
  13. data/lib/HardsploitAPI/HardsploitAPI.rb +134 -0
  14. data/lib/HardsploitAPI/HardsploitAPI_CONSTANT.rb +145 -0
  15. data/lib/HardsploitAPI/HardsploitAPI_FIRMWARE.rb +311 -0
  16. data/lib/HardsploitAPI/HardsploitAPI_I2C.rb +218 -0
  17. data/lib/HardsploitAPI/HardsploitAPI_NO_MUX_PARALLELE_MEMORY.rb +229 -0
  18. data/lib/HardsploitAPI/HardsploitAPI_SPI.rb +179 -0
  19. data/lib/HardsploitAPI/HardsploitAPI_TEST_INTERACT.rb +98 -0
  20. data/lib/HardsploitAPI/HardsploitAPI_USB_COMMUNICATION.rb +149 -0
  21. data/lib/HardsploitAPI/LICENSE.txt +674 -0
  22. data/lib/HardsploitAPI/README.md +22 -0
  23. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD.rb +249 -0
  24. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_DEBUG.rb +102 -0
  25. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_MEM_AP.rb +78 -0
  26. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_STM32.rb +104 -0
  27. data/lib/HardsploitAPI/TRADEMARK +3 -0
  28. data/lib/LICENSE.txt +674 -0
  29. data/lib/README.md +22 -0
  30. data/lib/TRADEMARK +3 -0
  31. data/lib/class/Chip_editor.rb +448 -0
  32. data/lib/class/Command_editor.rb +268 -0
  33. data/lib/class/Command_table.rb +239 -0
  34. data/lib/class/Console.rb +28 -0
  35. data/lib/class/Export_manager.rb +124 -0
  36. data/lib/class/Firmware.rb +29 -0
  37. data/lib/class/Generic_commands.rb +275 -0
  38. data/lib/class/HardsploitGUI.rb +462 -0
  39. data/lib/class/I2C/I2c_command.rb +48 -0
  40. data/lib/class/I2C/I2c_export.rb +121 -0
  41. data/lib/class/I2C/I2c_import.rb +92 -0
  42. data/lib/class/I2C/I2c_settings.rb +117 -0
  43. data/lib/class/PARALLEL/Parallel_export.rb +146 -0
  44. data/lib/class/PARALLEL/Parallel_import.rb +88 -0
  45. data/lib/class/PARALLEL/Parallel_settings.rb +102 -0
  46. data/lib/class/SPI/Spi_export.rb +141 -0
  47. data/lib/class/SPI/Spi_import.rb +112 -0
  48. data/lib/class/SPI/Spi_settings.rb +90 -0
  49. data/lib/class/Wire_helper.rb +246 -0
  50. data/lib/db/associations.rb +125 -0
  51. data/lib/db/hs.db +0 -0
  52. data/lib/gui/gui_chip_editor.rb +355 -0
  53. data/lib/gui/gui_chip_management.rb +372 -0
  54. data/lib/gui/gui_command_editor.rb +218 -0
  55. data/lib/gui/gui_export_manager.rb +93 -0
  56. data/lib/gui/gui_generic_commands.rb +164 -0
  57. data/lib/gui/gui_generic_export.rb +148 -0
  58. data/lib/gui/gui_generic_import.rb +126 -0
  59. data/lib/gui/gui_i2c_command.rb +115 -0
  60. data/lib/gui/gui_i2c_settings.rb +201 -0
  61. data/lib/gui/gui_parallel_settings.rb +194 -0
  62. data/lib/gui/gui_spi_import.rb +126 -0
  63. data/lib/gui/gui_spi_settings.rb +187 -0
  64. data/lib/gui/gui_wire_helper.rb +99 -0
  65. data/lib/gui_designer/gui_chip_editor.ui +553 -0
  66. data/lib/gui_designer/gui_chip_management.ui +842 -0
  67. data/lib/gui_designer/gui_command_editor.ui +347 -0
  68. data/lib/gui_designer/gui_export_manager.ui +115 -0
  69. data/lib/gui_designer/gui_generic_commands.ui +258 -0
  70. data/lib/gui_designer/gui_generic_export.ui +179 -0
  71. data/lib/gui_designer/gui_generic_import.ui +142 -0
  72. data/lib/gui_designer/gui_i2c_command.ui +145 -0
  73. data/lib/gui_designer/gui_i2c_settings.ui +261 -0
  74. data/lib/gui_designer/gui_parallel_settings.ui +244 -0
  75. data/lib/gui_designer/gui_processing.ui +81 -0
  76. data/lib/gui_designer/gui_spi_settings.ui +321 -0
  77. data/lib/gui_designer/gui_wire_helper.ui +117 -0
  78. data/lib/hardsploit.rb +122 -0
  79. data/lib/images/search.png +0 -0
  80. data/lib/logs/error.log +0 -0
  81. metadata +236 -0
@@ -0,0 +1,268 @@
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
+ require_relative '../HardsploitAPI/HardsploitAPI'
9
+ require_relative '../class/Command_table'
10
+ require_relative '../gui/gui_command_editor'
11
+ class Command_editor < Qt::Widget
12
+ slots 'add_cmd()'
13
+ slots 'edit_cmd()'
14
+ slots 'add_row()'
15
+ slots 'clone_row()'
16
+ slots 'remove_row()'
17
+ slots 'check_cell_content(QTableWidgetItem*)'
18
+
19
+ def initialize(action, cmd_name, chip, bus_id, parent, api, bus_param={})
20
+ super()
21
+ @cmd_editor_gui = Ui_Command_editor.new
22
+ centerWindow(self)
23
+ @cmd_editor_gui.setupUi(self)
24
+ @bus = Bus.find_by(bus_id: bus_id)
25
+ @chip_id = chip.chip_id
26
+ @cmd_name = cmd_name
27
+ @bus_id = bus_id
28
+ @parent = parent
29
+ @api = api
30
+ @cmd_table = Command_table.new(@api, @cmd_editor_gui.tbl_bytes, @bus.bus_name)
31
+
32
+ inputRestrict(@cmd_editor_gui.lie_name, 2)
33
+ inputRestrict(@cmd_editor_gui.lie_description, 2)
34
+ @cmd_editor_gui.lbl_chip_val.setText(chip.chip_reference)
35
+
36
+ @cmd_table.resize_to_content
37
+ case @bus.bus_name
38
+ when 'SPI'
39
+ @cmd_table.build_spi
40
+ end
41
+ @cmd_editor_gui.lie_text_2_bytes.hide if @bus.bus_name != 'SPI'
42
+
43
+ case action
44
+ when 0
45
+ # Add
46
+ @cmd_editor_gui.lbl_cmd_val.text = '-'
47
+ Qt::Object.connect(@cmd_editor_gui.btn_validate, SIGNAL('clicked()'), self, SLOT('add_cmd()'))
48
+ when 1
49
+ # Temp
50
+ @cmd_editor_gui.lbl_cmd_val.text = cmd_name
51
+ feed_editor_form
52
+ @cmd_editor_gui.lie_name.setText('')
53
+ Qt::Object.connect(@cmd_editor_gui.btn_validate, SIGNAL('clicked()'), self, SLOT('add_cmd()'))
54
+ else
55
+ # Edit
56
+ @cmd_editor_gui.lbl_cmd_val.text = "#{cmd_name}"
57
+ feed_editor_form
58
+ @cmd_editor_gui.btn_validate.setText('Edit')
59
+ Qt::Object.connect(@cmd_editor_gui.btn_validate, SIGNAL('clicked()'), self, SLOT('edit_cmd()'))
60
+ end
61
+ unless bus_param.empty?
62
+ feed_i2c_cmd_array(bus_param)
63
+ end
64
+ rescue Exception => msg
65
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while loading the GUI. Consult the logs for more details').exec
66
+ logger = Logger.new($logFilePath)
67
+ logger.error msg
68
+ end
69
+
70
+ def check_cell_content(item)
71
+ case @cmd_editor_gui.tbl_bytes.horizontalHeaderItem(item.column).text
72
+ when 'Order', 'Repetition'
73
+ if item.text.to_i < 0
74
+ item.setData(0, Qt::Variant.new(0))
75
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Wrong data', 'Only positive values are accepted in this cell').exec
76
+ end
77
+ when 'Byte (Hexa)'
78
+ reg = Qt::RegExp.new("^[A-Fa-f0-9]{2}")
79
+ reg_val = Qt::RegExpValidator.new(reg, self)
80
+ if reg_val.validate(item.text, item.text.length) == 0
81
+ item.setText('')
82
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Wrong data', 'Only hexadecimal values are accepted in this cell').exec
83
+ end
84
+ when 'Description'
85
+ unless item.text.nil?
86
+ reg = Qt::RegExp.new("^[a-zA-Z0-9_@-\s]+$")
87
+ reg_val = Qt::RegExpValidator.new(reg, self)
88
+ if reg_val.validate(item.text, item.text.length) == 0
89
+ item.setText('')
90
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Wrong data', 'Wrong characters in this cell').exec
91
+ end
92
+ end
93
+ end
94
+ rescue Exception => msg
95
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while verifying the command byte column. Consult the logs for more details').exec
96
+ logger = Logger.new($logFilePath)
97
+ logger.error msg
98
+ end
99
+
100
+ def is_cmd_size_valid?
101
+ # SPI
102
+ if @bus.bus_name == 'SPI'
103
+ if (@cmd_editor_gui.tbl_bytes.rowCount + @cmd_table.count_total_repetition) > 4000
104
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'SPI command invalid', 'SPI command size is to big (> 4000)').exec
105
+ return false
106
+ else
107
+ return true
108
+ end
109
+ # I2C
110
+ elsif @bus.bus_name == 'I2C'
111
+ count = 0
112
+ i = 0
113
+ while i <= (@cmd_editor_gui.tbl_bytes.rowCount) - 1 do
114
+ if @cmd_editor_gui.tbl_bytes.item(i, 1).nil?
115
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Command error', 'Payload size invalid or payload size (low) missing').exec
116
+ return false
117
+ else
118
+ lowByte = @cmd_editor_gui.tbl_bytes.item(i, 1).text
119
+ end
120
+ if @cmd_editor_gui.tbl_bytes.item(i + 1, 1).nil?
121
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Command error', 'Payload size invalid or payload size (high) missing').exec
122
+ return false
123
+ else
124
+ highByte = @cmd_editor_gui.tbl_bytes.item(i + 1, 1).text
125
+ end
126
+ if @cmd_editor_gui.tbl_bytes.item(i + 2, 1).nil?
127
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Command error', 'Payload size invalid or Read / Write address missing').exec
128
+ return false
129
+ else
130
+ commandType = @cmd_editor_gui.tbl_bytes.item(i + 2, 1).text
131
+ end
132
+ count = count + (HardsploitAPI.BytesToInt(lowByte.to_i(16), highByte.to_i(16)))
133
+ if commandType.to_i(16) % 2 == 0 #WRITE
134
+ i = (i + ((HardsploitAPI.BytesToInt(lowByte.to_i(16), highByte.to_i(16))) + 3))
135
+ else #READ
136
+ i = (i + 3)
137
+ end
138
+ end
139
+ if i != @cmd_editor_gui.tbl_bytes.rowCount
140
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Command error', 'I2C command incorrectly formated: The payload size does not match with the row number').exec
141
+ return false
142
+ end
143
+ if count > 2000
144
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'I2C command invalid', 'Your payload is too big (> 2000)').exec
145
+ return false
146
+ else
147
+ return true
148
+ end
149
+ else
150
+ return false
151
+ end
152
+ rescue Exception => msg
153
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while verifying the command size. Consult the logs for more details').exec
154
+ logger = Logger.new($logFilePath)
155
+ logger.error msg
156
+ end
157
+
158
+ def feed_i2c_cmd_array(bus_param)
159
+ if bus_param[:mode] == 'w'
160
+ @cmd_table.i2c_write_cmd(bus_param[:addr], bus_param[:size].to_i)
161
+ else
162
+ @cmd_table.i2c_read_cmd(bus_param[:addr], bus_param[:size].to_i)
163
+ end
164
+ end
165
+
166
+ def add_cmd
167
+ if @cmd_table.empty_data_exist? || is_cmd_size_valid? == false
168
+ return false
169
+ end
170
+ if @cmd_editor_gui.lie_name.text.empty? || @cmd_editor_gui.lie_description.text.empty?
171
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Information missing', 'Name or description empty').exec
172
+ return false
173
+ end
174
+ cmd = Cmd.new
175
+ cmd.cmd_name = @cmd_editor_gui.lie_name.text
176
+ cmd.cmd_desc = @cmd_editor_gui.lie_description.text
177
+ cmd.cmd_bus = @bus_id
178
+ cmd.cmd_chip = @chip_id
179
+ cmd.save
180
+ @cmd_editor_gui.tbl_bytes.sortItems(0, Qt::AscendingOrder)
181
+ @cmd_editor_gui.tbl_bytes.rowCount.times do |i|
182
+ byte = Byte.new
183
+ byte.byte_index = i + 1
184
+ byte.byte_value = @cmd_editor_gui.tbl_bytes.item(i, 1).text
185
+ if @bus.bus_name == 'SPI'
186
+ byte.byte_iteration = @cmd_editor_gui.tbl_bytes.item(i, 2).text
187
+ byte.byte_description = @cmd_editor_gui.tbl_bytes.item(i, 3).text
188
+ else
189
+ byte.byte_description = @cmd_editor_gui.tbl_bytes.item(i, 2).text
190
+ end
191
+ byte.byte_cmd = Cmd.ids.last
192
+ byte.save
193
+ end
194
+ @parent.feed_cmd_array
195
+ close
196
+ rescue Exception => msg
197
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while adding the command. Consult the logs for more details').exec
198
+ logger = Logger.new($logFilePath)
199
+ logger.error msg
200
+ end
201
+
202
+ def edit_cmd
203
+ if @cmd_table.empty_data_exist? && !is_cmd_size_valid?
204
+ return false
205
+ end
206
+ if @cmd_editor_gui.lie_name.text.empty? || @cmd_editor_gui.lie_description.text.empty?
207
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Information missing', 'Name or description empty').exec
208
+ return false
209
+ end
210
+ cmd = Cmd.find_by(cmd_name: @cmd_name, cmd_chip: @chip_id)
211
+ if cmd.cmd_name != @cmd_editor_gui.lie_name.text
212
+ cmd.update(cmd_name: @cmd_editor_gui.lie_name.text)
213
+ end
214
+ if cmd.cmd_desc != @cmd_editor_gui.lie_description.text
215
+ cmd.update(cmd_desc: @cmd_editor_gui.lie_description.text)
216
+ end
217
+ @cmd_editor_gui.tbl_bytes.sortItems(0, Qt::AscendingOrder)
218
+ bytes = Byte.where(byte_cmd: cmd.cmd_id)
219
+ bytes.destroy_all
220
+ @cmd_editor_gui.tbl_bytes.rowCount.times do |i|
221
+ byte = Byte.new
222
+ byte.byte_index = i + 1
223
+ byte.byte_value = @cmd_editor_gui.tbl_bytes.item(i, 1).text
224
+ if @bus.bus_name == 'SPI'
225
+ byte.byte_iteration = @cmd_editor_gui.tbl_bytes.item(i, 2).text
226
+ byte.byte_description = @cmd_editor_gui.tbl_bytes.item(i, 3).text
227
+ else
228
+ byte.byte_description = @cmd_editor_gui.tbl_bytes.item(i, 2).text
229
+ end
230
+ byte.byte_cmd = cmd.cmd_id
231
+ byte.save
232
+ end
233
+ @parent.feed_cmd_array
234
+ close
235
+ rescue Exception => msg
236
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while editing the command. Consult the logs for more details').exec
237
+ logger = Logger.new($logFilePath)
238
+ logger.error msg
239
+ end
240
+
241
+ def feed_editor_form
242
+ cmd = Cmd.find_by(cmd_name: @cmd_name)
243
+ @cmd_editor_gui.lie_name.setText(@cmd_name)
244
+ @cmd_editor_gui.lie_description.setText(cmd.cmd_desc)
245
+ @cmd_table.fill_byte_table(cmd.byte)
246
+ rescue Exception => msg
247
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured when loading the command. Consult the logs for more details').exec
248
+ logger = Logger.new($logFilePath)
249
+ logger.error msg
250
+ end
251
+
252
+ def add_row
253
+ if @cmd_editor_gui.lie_text_2_bytes.text.empty?
254
+ @cmd_table.add_row
255
+ else
256
+ @cmd_table.add_text_rows(@cmd_editor_gui.lie_text_2_bytes.text)
257
+ @cmd_editor_gui.lie_text_2_bytes.setText('')
258
+ end
259
+ end
260
+
261
+ def clone_row
262
+ @cmd_table.clone_rows
263
+ end
264
+
265
+ def remove_row
266
+ @cmd_table.remove_rows
267
+ end
268
+ end
@@ -0,0 +1,239 @@
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
+ require_relative '../HardsploitAPI/HardsploitAPI'
9
+
10
+ class Command_table < Qt::Widget
11
+
12
+ def initialize(api, cmd_table, bus)
13
+ super()
14
+ @cmd_table = cmd_table
15
+ @bus = bus
16
+ @api = api
17
+ cmd_table.insertColumn(0)
18
+ cmd_table.setHorizontalHeaderItem(0, Qt::TableWidgetItem.new('Order'))
19
+ cmd_table.insertColumn(1)
20
+ cmd_table.setHorizontalHeaderItem(1, Qt::TableWidgetItem.new('Byte (Hexa)'))
21
+ cmd_table.insertColumn(2)
22
+ cmd_table.setHorizontalHeaderItem(2, Qt::TableWidgetItem.new('Description'))
23
+ end
24
+
25
+ def build_spi
26
+ @cmd_table.insertColumn(2)
27
+ @cmd_table.setHorizontalHeaderItem(2, Qt::TableWidgetItem.new('Repetition'))
28
+ end
29
+
30
+ def fill_byte_table(byte_list)
31
+ byte_list.to_enum.with_index(0).each do |b, i|
32
+ @cmd_table.insertRow(@cmd_table.rowCount)
33
+ @cmd_table.setItem(i, 1, Qt::TableWidgetItem.new(b.byte_value))
34
+ if @bus == 'SPI'
35
+ item = Qt::TableWidgetItem.new
36
+ item.setData(0, Qt::Variant.new(b.byte_iteration))
37
+ @cmd_table.setItem(i, 2, item)
38
+ @cmd_table.setItem(i, 3, Qt::TableWidgetItem.new(b.byte_description))
39
+ else
40
+ @cmd_table.setItem(i, 2, Qt::TableWidgetItem.new(b.byte_description))
41
+ end
42
+ item = Qt::TableWidgetItem.new
43
+ item.setData(0, Qt::Variant.new(b.byte_index))
44
+ @cmd_table.setItem(i, 0, item)
45
+ end
46
+ end
47
+
48
+ def add_row
49
+ @cmd_table.insertRow(@cmd_table.rowCount)
50
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 1, Qt::TableWidgetItem.new('00'))
51
+ if @bus == 'SPI'
52
+ item = Qt::TableWidgetItem.new
53
+ item.setData(0, Qt::Variant.new(0))
54
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, item)
55
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 3, Qt::TableWidgetItem.new)
56
+ else
57
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, Qt::TableWidgetItem.new)
58
+ end
59
+ item = Qt::TableWidgetItem.new
60
+ item.setData(0, Qt::Variant.new(@cmd_table.rowCount))
61
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 0, item)
62
+ end
63
+
64
+ def add_text_rows(txt)
65
+ if txt.ascii_only?
66
+ txt.each_byte do |x|
67
+ @cmd_table.insertRow(@cmd_table.rowCount)
68
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 1, Qt::TableWidgetItem.new(x.to_s(16)))
69
+ item = Qt::TableWidgetItem.new
70
+ item.setData(0, Qt::Variant.new(0))
71
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, item)
72
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 3, Qt::TableWidgetItem.new(x.chr))
73
+ item = Qt::TableWidgetItem.new
74
+ item.setData(0, Qt::Variant.new(@cmd_table.rowCount))
75
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 0, item)
76
+ end
77
+ else
78
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'String error', 'Only ASCII characters can be specified').exec
79
+ end
80
+ end
81
+
82
+ def clone_rows
83
+ return 0 if @cmd_table.currentItem.nil?
84
+ rows_to_delete = []
85
+ @cmd_table.selectedItems.each do |item|
86
+ rows_to_delete.push item.row
87
+ end
88
+ rows_to_delete.uniq!
89
+ rows_to_delete.each_with_index do |row, i|
90
+ @cmd_table.insertRow(@cmd_table.rowCount)
91
+ unless @cmd_table.item(row, 1).nil?
92
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 1, Qt::TableWidgetItem.new(@cmd_table.item(row, 1).text))
93
+ end
94
+ if @bus == 'SPI'
95
+ unless @cmd_table.item(row, 2).nil?
96
+ repetition_item = Qt::TableWidgetItem.new
97
+ repetition_item.setData(0, Qt::Variant.new(@cmd_table.item(row, 2).text.to_i))
98
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, repetition_item)
99
+ end
100
+ unless @cmd_table.item(row, 3).nil?
101
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 3, Qt::TableWidgetItem.new(@cmd_table.item(row, 3).text))
102
+ end
103
+ else
104
+ unless @cmd_table.item(row, 2).nil?
105
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 2, Qt::TableWidgetItem.new(@cmd_table.item(row, 3).text))
106
+ end
107
+ end
108
+ unless @cmd_table.item(row, 0).nil?
109
+ order_item = Qt::TableWidgetItem.new
110
+ order_item.setData(0, Qt::Variant.new(@cmd_table.item(row, 0).text.to_i))
111
+ @cmd_table.setItem(@cmd_table.rowCount - 1, 0, order_item)
112
+ end
113
+ end
114
+ end
115
+
116
+ def remove_rows
117
+ return 0 if @cmd_table.currentItem.nil?
118
+ rows_to_delete = []
119
+ @cmd_table.selectedItems.each do |item|
120
+ rows_to_delete.push item.row
121
+ end
122
+ rows_to_delete.uniq!
123
+ rows_to_delete.each_with_index do |row, i|
124
+ @cmd_table.removeRow(row - i)
125
+ end
126
+ end
127
+
128
+ def i2c_read_cmd(write_address, cmd_size)
129
+ # Byte array size
130
+ @cmd_table.setRowCount(3)
131
+ # Size 1
132
+ @cmd_table.setItem(0, 1, Qt::TableWidgetItem.new(HardsploitAPI.lowByte(cmd_size).to_s(16).upcase))
133
+ @cmd_table.setItem(0, 2, Qt::TableWidgetItem.new('Payload size - low'))
134
+ # Index
135
+ item = Qt::TableWidgetItem.new
136
+ item.setData(0, Qt::Variant.new(1))
137
+ @cmd_table.setItem(0, 0, item)
138
+ # Size 2
139
+ @cmd_table.setItem(1, 1, Qt::TableWidgetItem.new(HardsploitAPI.highByte(cmd_size).to_s(16).upcase))
140
+ @cmd_table.setItem(1, 2, Qt::TableWidgetItem.new('Payload size - high'))
141
+ # Index
142
+ item = Qt::TableWidgetItem.new
143
+ item.setData(0, Qt::Variant.new(2))
144
+ @cmd_table.setItem(1, 0, item)
145
+ # Address
146
+ @cmd_table.setItem(2, 1, Qt::TableWidgetItem.new(write_address))
147
+ @cmd_table.setItem(2, 2, Qt::TableWidgetItem.new('Read address (control byte)'))
148
+ # Index
149
+ item = Qt::TableWidgetItem.new
150
+ item.setData(0, Qt::Variant.new(3))
151
+ @cmd_table.setItem(2, 0, item)
152
+ end
153
+
154
+ def i2c_write_cmd(write_address, cmd_size)
155
+ # Byte array size
156
+ @cmd_table.setRowCount(3 + cmd_size)
157
+ # Payload size low
158
+ # -byte
159
+ itemLB1 = Qt::TableWidgetItem.new(HardsploitAPI.lowByte(cmd_size).to_s(16).upcase)
160
+ @cmd_table.setItem(0, 1, itemLB1)
161
+ # -description
162
+ itemLB3 = Qt::TableWidgetItem.new('Payload size - low')
163
+ @cmd_table.setItem(0, 2, itemLB3)
164
+ # -order
165
+ itemLB0 = Qt::TableWidgetItem.new
166
+ itemLB0.setData(0, Qt::Variant.new(1))
167
+ @cmd_table.setItem(0, 0, itemLB0)
168
+ # Payload size high
169
+ # -byte
170
+ itemHB1 = Qt::TableWidgetItem.new(HardsploitAPI.highByte(cmd_size).to_s(16).upcase)
171
+ @cmd_table.setItem(1, 1, itemHB1)
172
+ # -description
173
+ itemHB3 = Qt::TableWidgetItem.new('Payload size - high')
174
+ @cmd_table.setItem(1, 2, itemHB3)
175
+ # -order
176
+ itemHB0 = Qt::TableWidgetItem.new
177
+ itemHB0.setData(0, Qt::Variant.new(2))
178
+ @cmd_table.setItem(1, 0, itemHB0)
179
+ # Address
180
+ # -byte
181
+ itemA1 = Qt::TableWidgetItem.new(write_address)
182
+ @cmd_table.setItem(2, 1, itemA1)
183
+ # -description
184
+ itemA3 = Qt::TableWidgetItem.new('Write address (control byte)')
185
+ @cmd_table.setItem(2, 2, itemA3)
186
+ # -order
187
+ itemA0 = Qt::TableWidgetItem.new
188
+ itemA0.setData(0, Qt::Variant.new(3))
189
+ @cmd_table.setItem(2, 0, itemA0)
190
+ # Payload bytes
191
+ for i in 3...(cmd_size + 3) do
192
+ @cmd_table.setItem(i, 1, Qt::TableWidgetItem.new(''))
193
+ @cmd_table.setItem(i, 2, Qt::TableWidgetItem.new('Payload byte'))
194
+ # Index
195
+ item = Qt::TableWidgetItem.new
196
+ item.setData(0, Qt::Variant.new((i + 1)))
197
+ @cmd_table.setItem(i, 0, item)
198
+ end
199
+ end
200
+
201
+ def resize_to_content
202
+ @cmd_table.resizeColumnsToContents
203
+ @cmd_table.resizeRowsToContents
204
+ @cmd_table.horizontalHeader.stretchLastSection = true
205
+ end
206
+
207
+ def count_total_repetition
208
+ repetitionValue = 0
209
+ @cmd_table.rowCount.times do |i|
210
+ repetitionValue += @cmd_table.item(i, 2).text.to_i
211
+ end
212
+ return repetitionValue
213
+ end
214
+
215
+ def empty_data_exist?
216
+ # ARRAY SIZE
217
+ if @cmd_table.rowCount == 0
218
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Bytes array empty', 'The bytes array is empty').exec
219
+ return true
220
+ end
221
+ @cmd_table.rowCount.times do |i|
222
+ # EMPTY BYTE CELL
223
+ if @cmd_table.item(i, 1).text == ''
224
+ @cmd_table.setCurrentItem(@cmd_table.item(i, 1))
225
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Empty byte', 'Empty byte cell detected').exec
226
+ return true
227
+ end
228
+ if @bus == 'SPI'
229
+ # EMPTY REPETITION CELL
230
+ if @cmd_table.item(i, 2).text == ''
231
+ @cmd_table.setCurrentItem(@cmd_table.item(i, 2))
232
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Empty repetition', 'Empty repetition cell detected').exec
233
+ return true
234
+ end
235
+ end
236
+ end
237
+ return false
238
+ end
239
+ end