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.
- checksums.yaml +7 -0
- data/README.md +22 -0
- data/Rakefile +1 -0
- data/bin/hardsploit_gui +3 -0
- data/lib/Firmware/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
- data/lib/Firmware/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
- data/lib/Firmware/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
- data/lib/Firmware/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
- data/lib/Firmware/FPGA/TEST/TEST_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_TEST_INTERACT.rpd +0 -0
- data/lib/Firmware/FPGA/VersionFPGA.rb +5 -0
- data/lib/Firmware/UC/HARDSPLOIT_FIRMWARE_UC.bin +0 -0
- data/lib/Firmware/UC/VersionUC.rb +12 -0
- data/lib/HardsploitAPI/HardsploitAPI.rb +134 -0
- data/lib/HardsploitAPI/HardsploitAPI_CONSTANT.rb +145 -0
- data/lib/HardsploitAPI/HardsploitAPI_FIRMWARE.rb +311 -0
- data/lib/HardsploitAPI/HardsploitAPI_I2C.rb +218 -0
- data/lib/HardsploitAPI/HardsploitAPI_NO_MUX_PARALLELE_MEMORY.rb +229 -0
- data/lib/HardsploitAPI/HardsploitAPI_SPI.rb +179 -0
- data/lib/HardsploitAPI/HardsploitAPI_TEST_INTERACT.rb +98 -0
- data/lib/HardsploitAPI/HardsploitAPI_USB_COMMUNICATION.rb +149 -0
- data/lib/HardsploitAPI/LICENSE.txt +674 -0
- data/lib/HardsploitAPI/README.md +22 -0
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD.rb +249 -0
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_DEBUG.rb +102 -0
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_MEM_AP.rb +78 -0
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_STM32.rb +104 -0
- data/lib/HardsploitAPI/TRADEMARK +3 -0
- data/lib/LICENSE.txt +674 -0
- data/lib/README.md +22 -0
- data/lib/TRADEMARK +3 -0
- data/lib/class/Chip_editor.rb +448 -0
- data/lib/class/Command_editor.rb +268 -0
- data/lib/class/Command_table.rb +239 -0
- data/lib/class/Console.rb +28 -0
- data/lib/class/Export_manager.rb +124 -0
- data/lib/class/Firmware.rb +29 -0
- data/lib/class/Generic_commands.rb +275 -0
- data/lib/class/HardsploitGUI.rb +462 -0
- data/lib/class/I2C/I2c_command.rb +48 -0
- data/lib/class/I2C/I2c_export.rb +121 -0
- data/lib/class/I2C/I2c_import.rb +92 -0
- data/lib/class/I2C/I2c_settings.rb +117 -0
- data/lib/class/PARALLEL/Parallel_export.rb +146 -0
- data/lib/class/PARALLEL/Parallel_import.rb +88 -0
- data/lib/class/PARALLEL/Parallel_settings.rb +102 -0
- data/lib/class/SPI/Spi_export.rb +141 -0
- data/lib/class/SPI/Spi_import.rb +112 -0
- data/lib/class/SPI/Spi_settings.rb +90 -0
- data/lib/class/Wire_helper.rb +246 -0
- data/lib/db/associations.rb +125 -0
- data/lib/db/hs.db +0 -0
- data/lib/gui/gui_chip_editor.rb +355 -0
- data/lib/gui/gui_chip_management.rb +372 -0
- data/lib/gui/gui_command_editor.rb +218 -0
- data/lib/gui/gui_export_manager.rb +93 -0
- data/lib/gui/gui_generic_commands.rb +164 -0
- data/lib/gui/gui_generic_export.rb +148 -0
- data/lib/gui/gui_generic_import.rb +126 -0
- data/lib/gui/gui_i2c_command.rb +115 -0
- data/lib/gui/gui_i2c_settings.rb +201 -0
- data/lib/gui/gui_parallel_settings.rb +194 -0
- data/lib/gui/gui_spi_import.rb +126 -0
- data/lib/gui/gui_spi_settings.rb +187 -0
- data/lib/gui/gui_wire_helper.rb +99 -0
- data/lib/gui_designer/gui_chip_editor.ui +553 -0
- data/lib/gui_designer/gui_chip_management.ui +842 -0
- data/lib/gui_designer/gui_command_editor.ui +347 -0
- data/lib/gui_designer/gui_export_manager.ui +115 -0
- data/lib/gui_designer/gui_generic_commands.ui +258 -0
- data/lib/gui_designer/gui_generic_export.ui +179 -0
- data/lib/gui_designer/gui_generic_import.ui +142 -0
- data/lib/gui_designer/gui_i2c_command.ui +145 -0
- data/lib/gui_designer/gui_i2c_settings.ui +261 -0
- data/lib/gui_designer/gui_parallel_settings.ui +244 -0
- data/lib/gui_designer/gui_processing.ui +81 -0
- data/lib/gui_designer/gui_spi_settings.ui +321 -0
- data/lib/gui_designer/gui_wire_helper.ui +117 -0
- data/lib/hardsploit.rb +122 -0
- data/lib/images/search.png +0 -0
- data/lib/logs/error.log +0 -0
- 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
|