hardsploit_gui 2.0

Sign up to get free protection for your applications and to get access to all the features.
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