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,28 @@
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
+ require 'date'
8
+ require_relative '../HardsploitAPI/HardsploitAPI'
9
+ require_relative '../class/Command_table'
10
+ require_relative '../gui/gui_command_editor'
11
+ class Console < Qt::TableWidget
12
+
13
+ def initialize(console)
14
+ super()
15
+ @console = console
16
+ end
17
+
18
+ def print(msg)
19
+ @console.insertRow(@console.rowCount)
20
+ time = Qt::TableWidgetItem.new("#{Time.now.strftime("%d/%m %H:%M")}")
21
+ time.setFlags(Qt::ItemIsEnabled)
22
+ msg = Qt::TableWidgetItem.new(msg)
23
+ msg.setFlags(Qt::ItemIsEnabled)
24
+ @console.setItem(@console.rowCount - 1, 0, time)
25
+ @console.setItem(@console.rowCount - 1, 1, msg)
26
+ @console.scrollToItem(time, Qt::AbstractItemView::EnsureVisible)
27
+ end
28
+ end
@@ -0,0 +1,124 @@
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 'csv'
9
+ class Export_manager < Qt::Widget
10
+ slots 'save_result()'
11
+
12
+ def initialize(bus, result, spiDataSended = [])
13
+ super()
14
+ @em = Ui_Export_manager.new
15
+ centerWindow(self)
16
+ @em.setupUi(self)
17
+ @bus = bus
18
+ # Check the bus type to adapt the table column
19
+ if bus == 'SPI'
20
+ create_result_table('SPI')
21
+ @em.cbx_export.hide
22
+ @em.tbl_result.setRowCount(result.length)
23
+ result.length.times do |i|
24
+ @em.tbl_result.setItem(i, 0, Qt::TableWidgetItem.new(spiDataSended[i].to_s))
25
+ @em.tbl_result.setItem(i, 1, Qt::TableWidgetItem.new(result[i].to_s))
26
+ end
27
+ @em.tbl_result.resizeColumnsToContents
28
+ @em.tbl_result.resizeRowsToContents
29
+ @em.tbl_result.horizontalHeader.stretchLastSection = true
30
+ else
31
+ create_result_table('I2C')
32
+ @em.tbl_result.setRowCount(result.length / 2)
33
+ (0..result.length - 1).step(2).each_with_index do |i, v|
34
+ case result[i]
35
+ when 0
36
+ @em.tbl_result.setItem(v, 0, Qt::TableWidgetItem.new('Write'))
37
+ @em.tbl_result.setItem(v, 1, Qt::TableWidgetItem.new('ACK'))
38
+ @em.tbl_result.setItem(v, 2, Qt::TableWidgetItem.new(result[i + 1].to_s))
39
+ when 1
40
+ @em.tbl_result.setItem(v, 0, Qt::TableWidgetItem.new('Read'))
41
+ @em.tbl_result.setItem(v, 1, Qt::TableWidgetItem.new('ACK'))
42
+ @em.tbl_result.setItem(v, 2, Qt::TableWidgetItem.new(result[i + 1].to_s))
43
+ when 2
44
+ @em.tbl_result.setItem(v, 0, Qt::TableWidgetItem.new('Write'))
45
+ @em.tbl_result.setItem(v, 1, Qt::TableWidgetItem.new('NACK'))
46
+ @em.tbl_result.setItem(v, 2, Qt::TableWidgetItem.new(result[i + 1].to_s))
47
+ else
48
+ @em.tbl_result.setItem(v, 0, Qt::TableWidgetItem.new('Write'))
49
+ @em.tbl_result.setItem(v, 1, Qt::TableWidgetItem.new('NACK'))
50
+ @em.tbl_result.setItem(v, 2, Qt::TableWidgetItem.new(result[i + 1].to_s))
51
+ end
52
+ end
53
+ @em.tbl_result.resizeColumnsToContents
54
+ @em.tbl_result.resizeRowsToContents
55
+ @em.tbl_result.horizontalHeader.stretchLastSection = true
56
+ end
57
+ end
58
+
59
+ def create_result_table(bus)
60
+ if bus == 'SPI'
61
+ @em.tbl_result.insertColumn(0)
62
+ @em.tbl_result.setHorizontalHeaderItem(0, Qt::TableWidgetItem.new('Data send'))
63
+ @em.tbl_result.insertColumn(1)
64
+ @em.tbl_result.setHorizontalHeaderItem(1, Qt::TableWidgetItem.new('Data receive'))
65
+ else
66
+ @em.tbl_result.insertColumn(0)
67
+ @em.tbl_result.setHorizontalHeaderItem(0, Qt::TableWidgetItem.new('R/W'))
68
+ @em.tbl_result.insertColumn(1)
69
+ @em.tbl_result.setHorizontalHeaderItem(1, Qt::TableWidgetItem.new('(N)ACK)'))
70
+ @em.tbl_result.insertColumn(2)
71
+ @em.tbl_result.setHorizontalHeaderItem(2, Qt::TableWidgetItem.new('DATA'))
72
+ end
73
+ end
74
+
75
+ def save_result
76
+ result_file = Qt::FileDialog.getSaveFileName(self, tr('Create a file'), '/', tr('All files (*)'))
77
+ unless result_file.nil?
78
+ if @bus == 'I2C'
79
+ if @em.cbx_export.currentIndex == 0
80
+ save_i2c_csv(result_file)
81
+ else
82
+ save_i2c(result_file)
83
+ end
84
+ else
85
+ save_spi(result_file)
86
+ end
87
+ end
88
+ rescue Exception => msg
89
+ logger = Logger.new($logFilePath)
90
+ logger.error msg
91
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while saving the results. Consult the logs for more details').exec
92
+ end
93
+
94
+ def save_i2c_csv(result_file)
95
+ CSV.open("#{result_file}.csv", 'wb', :col_sep => ';') do |csv|
96
+ csv << ['R/W', '(N)ACK', 'DATA']
97
+ @em.tbl_result.rowCount.times do |i|
98
+ csv << [@em.tbl_result.item(i, 0).text, @em.tbl_result.item(i, 1).text, @em.tbl_result.item(i, 2).text]
99
+ end
100
+ end
101
+ end
102
+
103
+ def save_i2c(result_file)
104
+ file = File.open("#{result_file}", 'w')
105
+ result = []
106
+ @em.tbl_result.rowCount.times do |i|
107
+ if @em.tbl_result.item(i, 0).text == 'Read' && @em.tbl_result.item(i, 1).text == 'ACK'
108
+ result.push(@em.tbl_result.item(i, 2).text.to_i)
109
+ end
110
+ end
111
+ file.write(result.pack('C*'))
112
+ file.close
113
+ end
114
+
115
+ def save_spi(result_file)
116
+ file = File.open("#{result_file}", 'w')
117
+ result = []
118
+ @em.tbl_result.rowCount.times do |i|
119
+ result.push(@em.tbl_result.item(i, 1).text.to_i)
120
+ end
121
+ file.write(result.pack('C*'))
122
+ file.close
123
+ end
124
+ end
@@ -0,0 +1,29 @@
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
+ class Firmware
9
+ def initialize(api, firmware)
10
+ if $currentFirmware != firmware
11
+ case firmware
12
+ when 'I2C'
13
+ p "Upload Firmware check : #{api.uploadFirmware(File.expand_path(File.dirname(__FILE__)) + "/../Firmware/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd", false)}"
14
+ when 'SPI'
15
+ p "Upload Firmware check : #{api.uploadFirmware(File.expand_path(File.dirname(__FILE__)) + '/../Firmware/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd', false)}"
16
+ when 'Parallel'
17
+ p "Upload Firmware check : #{api.uploadFirmware(File.expand_path(File.dirname(__FILE__)) + "/../Firmware/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd", false)}"
18
+ when 'SWD'
19
+ p "Upload Firmware check : #{api.uploadFirmware(File.expand_path(File.dirname(__FILE__)) + "/../Firmware/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd", false)}"
20
+ end
21
+ $currentFirmware = firmware
22
+ sleep(2)
23
+ end
24
+ rescue Exception => msg
25
+ logger = Logger.new($logFilePath)
26
+ logger.error msg
27
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error while loading the firmware. Consult the log for more details').exec
28
+ end
29
+ end
@@ -0,0 +1,275 @@
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 '../gui/gui_generic_commands'
10
+ require_relative '../gui/gui_export_manager'
11
+ require_relative '../class/I2C/I2c_command'
12
+ require_relative '../class/Export_manager'
13
+ require_relative '../class/Command_editor'
14
+
15
+
16
+ class Generic_commands < Qt::Widget
17
+ slots 'feed_cmd_array()'
18
+ slots 'exec_action()'
19
+ slots 'open_cmd_form()'
20
+
21
+ def initialize(api, chip, bus_name)
22
+ super()
23
+ @generic_command_gui = Ui_Generic_commands.new
24
+ centerWindow(self)
25
+ @generic_command_gui.setupUi(self)
26
+ @generic_command_gui.lbl_chip.setText(chip.chip_reference)
27
+ @generic_command_gui.lbl_search.setPixmap(Qt::Pixmap.new('images/search.png'))
28
+ inputRestrict(@generic_command_gui.lie_search, 2)
29
+ @generic_command_gui.check_result.setChecked(true)
30
+ @api = api
31
+ @chip = chip
32
+ @bus_name = bus_name
33
+ @bus_id = Bus.find_by(bus_name: bus_name).bus_id
34
+ select_chip_settings(bus_name)
35
+ feed_cmd_array
36
+ end
37
+
38
+ def feed_cmd_array
39
+ @generic_command_gui.tbl_cmd.clearContents
40
+ cmd = @chip.cmd.where(cmd_bus: @bus_id)
41
+ unless @generic_command_gui.lie_search.text.empty?
42
+ cmd = cmd.where('cmd_name LIKE ?', "%#{@generic_command_gui.lie_search.text}%")
43
+ end
44
+ @generic_command_gui.tbl_cmd.setRowCount(cmd.count);
45
+ cmd.to_enum.with_index(0).each do |c, i|
46
+ it1 = Qt::TableWidgetItem.new(c.cmd_name)
47
+ it1.setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled)
48
+ it2 = Qt::TableWidgetItem.new(c.cmd_desc)
49
+ it2.setFlags(Qt::ItemIsEnabled)
50
+ @generic_command_gui.tbl_cmd.setItem(i, 0, it1);
51
+ @generic_command_gui.tbl_cmd.setItem(i, 1, it2);
52
+ end
53
+ @generic_command_gui.tbl_cmd.resizeColumnsToContents
54
+ @generic_command_gui.tbl_cmd.resizeRowsToContents
55
+ @generic_command_gui.tbl_cmd.horizontalHeader.stretchLastSection = true
56
+ rescue Exception => msg
57
+ logger = Logger.new($logFilePath)
58
+ logger.error msg
59
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error while loading the command array. Consult the log for more details').exec
60
+ end
61
+
62
+ def select_chip_settings(bus)
63
+ case bus
64
+ when 'SPI'
65
+ @chip_settings = Spi.find_by(spi_chip: @chip.chip_id)
66
+ @speeds = {
67
+ '25.00' => 3,
68
+ '18.75' => 4,
69
+ '15.00' => 5,
70
+ '12.50' => 6,
71
+ '10.71' => 7,
72
+ '9.38' => 8,
73
+ '7.50' => 10,
74
+ '5.00' => 15,
75
+ '3.95' => 19,
76
+ '3.00' => 25,
77
+ '2.03' => 37,
78
+ '1.00' => 75,
79
+ '0.50' => 150,
80
+ '0.29' => 255
81
+ }
82
+ @generic_command_gui.cbx_action.insertItem(3, 'Concatenate')
83
+ when 'I2C'
84
+ @chip_settings = I2C.find_by(i2c_chip: @chip.chip_id)
85
+ end
86
+ end
87
+
88
+ # Execute action
89
+ def exec_action
90
+ if @generic_command_gui.tbl_cmd.currentItem.nil?
91
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Missing command', 'Select a command in the array first').exec
92
+ return 0
93
+ end
94
+ case @generic_command_gui.cbx_action.currentText
95
+ when 'Execute'
96
+ cmd_array = prepare_cmd
97
+ result = exec_cmd(@bus_name, cmd_array)
98
+ if @generic_command_gui.check_result.isChecked
99
+ export_manager = Export_manager.new(@bus_name, result, cmd_array)
100
+ export_manager.setWindowModality(Qt::ApplicationModal)
101
+ export_manager.show
102
+ end
103
+ when 'Template'
104
+ open_cmd_form(:option_1 => 'temp')
105
+ when 'Edit'
106
+ open_cmd_form(:option_1 => 'edit')
107
+ when 'Concatenate'
108
+ concatenate_cmds
109
+ when 'Delete'
110
+ delete_cmd
111
+ else
112
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Wrong option', 'Please choose a correct action').exec
113
+ end
114
+ rescue Exception => msg
115
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while executing the action. Consult the logs for more details').exec
116
+ logger = Logger.new($logFilePath)
117
+ logger.error msg
118
+ end
119
+
120
+ def prepare_cmd
121
+ byte_list = Byte.where(byte_cmd: Cmd.find_by(cmd_name: @generic_command_gui.tbl_cmd.currentItem.text))
122
+ array_sent = Array.new
123
+ byte_list.each do |bl|
124
+ if bl.byte_iteration != 0 && !bl.byte_iteration.nil?
125
+ for i in 1..bl.byte_iteration.to_i do
126
+ array_sent.push(bl.byte_value.to_i(16))
127
+ end
128
+ else
129
+ array_sent.push(bl.byte_value.to_i(16))
130
+ end
131
+ end
132
+ return array_sent
133
+ rescue Exception => msg
134
+ logger = Logger.new($logFilePath)
135
+ logger.error msg
136
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured when preparing the command. Consult the log for more details').exec
137
+ end
138
+
139
+ def exec_cmd(bus, array_sent)
140
+ Firmware.new(@api, @bus_name)
141
+ case bus
142
+ when 'SPI'
143
+ return check_send_and_received_data(@api.spi_Interact(@chip_settings.spi_mode, @speeds[@chip_settings.spi_frequency], array_sent))
144
+ when 'I2C'
145
+ return check_send_and_received_data(@api.i2c_Interact(@chip_settings.i2c_frequency, array_sent))
146
+ end
147
+ rescue Exception => msg
148
+ logger = Logger.new($logFilePath)
149
+ logger.error msg
150
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured when executing the command. Consult the log for more details').exec
151
+ end
152
+
153
+ def delete_cmd
154
+ msg = Qt::MessageBox.new
155
+ msg.setWindowTitle('Delete command')
156
+ msg.setText('Confirm the delete command action ?')
157
+ msg.setIcon(Qt::MessageBox::Question)
158
+ msg.setStandardButtons(Qt::MessageBox::Cancel | Qt::MessageBox::Ok)
159
+ msg.setDefaultButton(Qt::MessageBox::Cancel)
160
+ if msg.exec == Qt::MessageBox::Ok
161
+ @chip.cmd.find_by(cmd_name: @generic_command_gui.tbl_cmd.currentItem.text).destroy
162
+ feed_cmd_array
163
+ end
164
+ rescue Exception => msg
165
+ logger = Logger.new($logFilePath)
166
+ logger.error msg
167
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured when deleting the command. Consult the log for more details').exec
168
+ end
169
+
170
+ def concatenate_cmds
171
+ if @generic_command_gui.tbl_cmd.selectedItems.count != 2
172
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Wrong selection', 'Select two commands in the table to concatenate them').exec
173
+ return 0
174
+ end
175
+ bytesCmd1 = Byte.where(byte_cmd: Cmd.find_by(cmd_name: @generic_command_gui.tbl_cmd.selectedItems[0].text).cmd_id)
176
+ bytesCmd2 = Byte.where(byte_cmd: Cmd.find_by(cmd_name: @generic_command_gui.tbl_cmd.selectedItems[1].text).cmd_id)
177
+ if check_concatenation_size(bytesCmd1, bytesCmd2)
178
+ return 0
179
+ end
180
+ # Save cmd
181
+ cmd = Cmd.new
182
+ cmd.cmd_name = 'New concatenation'
183
+ cmd.cmd_desc = "Concatenation of #{@generic_command_gui.tbl_cmd.selectedItems[0].text} and #{@generic_command_gui.tbl_cmd.selectedItems[1].text} commands"
184
+ cmd.cmd_bus = @bus_id
185
+ cmd.cmd_chip = @chip.chip_id
186
+ cmd.save
187
+ # Save cmd bytes
188
+ bytesCmd1.each do |b1|
189
+ byte = Byte.new
190
+ byte.byte_index = b1.byte_index
191
+ byte.byte_value = b1.byte_value
192
+ checkSize.push(b1.byte_value)
193
+ byte.byte_description = b1.byte_description
194
+ byte.byte_iteration = b1.byte_iteration
195
+ byte.byte_cmd = Cmd.ids.last
196
+ byte.byte_type = 1
197
+ byte.save
198
+ end
199
+ bytesCmd2.each do |b2|
200
+ byte2 = Byte.new
201
+ byte2.byte_index = Byte.last.byte_index + 1
202
+ byte2.byte_value = b2.byte_value
203
+ checkSize.push(b2.byte_value)
204
+ byte2.byte_description = b2.byte_description
205
+ byte2.byte_iteration = b2.byte_iteration
206
+ byte2.byte_cmd = Cmd.ids.last
207
+ byte2.byte_type = 1
208
+ byte2.save
209
+ end
210
+ feed_cmd_array
211
+ rescue Exception => msg
212
+ logger = Logger.new($logFilePath)
213
+ logger.error msg
214
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured when concatenating the command. Consult the log for more details').exec
215
+ end
216
+
217
+ def check_concatenation_size(bytesCmd1, bytesCmd2)
218
+ checkSize = Array.new
219
+ bytesCmd1.each do |b1|
220
+ checkSize.push(b1.byte_value)
221
+ end
222
+ bytesCmd2.each do |b2|
223
+ checkSize.push(b2.byte_value)
224
+ end
225
+ count = 0
226
+ i = 0
227
+ while i <= (checkSize.size) - 1 do
228
+ lowByte = checkSize[i]
229
+ highByte = checkSize[i + 1]
230
+ commandType = checkSize[i + 2]
231
+ count = count + (@api.BytesToInt(lowByte.to_i(16), highByte.to_i(16)))
232
+ if commandType.to_i(16) % 2 == 0 #WRITE
233
+ i = (i + ((@api.BytesToInt(lowByte.to_i(16), highByte.to_i(16))) + 3))
234
+ else #READ
235
+ i = (i + 3)
236
+ end
237
+ end
238
+ if count > 2000
239
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Command too big: unable to concatenate').exec
240
+ return false
241
+ end
242
+ return true
243
+ end
244
+
245
+ def open_cmd_form(options={})
246
+ if options[:option_1].nil?
247
+ if @bus_name == 'I2C'
248
+ cmdBase = I2c_command.new(@api, @chip, @bus_id, self)
249
+ else
250
+ cmdBase = Command_editor.new(0, nil, @chip, @bus_id, self, @api)
251
+ end
252
+ else
253
+ if options[:option_1] == 'temp'
254
+ cmdBase = Command_editor.new(1, @generic_command_gui.tbl_cmd.currentItem.text, @chip, @bus_id, self, @api)
255
+ else
256
+ cmdBase = Command_editor.new(2, @generic_command_gui.tbl_cmd.currentItem.text, @chip, @bus_id, self, @api)
257
+ end
258
+ end
259
+ cmdBase.setWindowModality(Qt::ApplicationModal)
260
+ cmdBase.show
261
+ end
262
+
263
+ def check_send_and_received_data(value)
264
+ case value
265
+ when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
266
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', "PACKET_IS_TOO_LARGE max: #{HardsploitAPI::USB::USB_TRAME_SIZE}").exec
267
+ when HardsploitAPI::USB_STATE::ERROR_SEND
268
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'ERROR_SEND').exec
269
+ when HardsploitAPI::USB_STATE::BUSY
270
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'BUSY', 'Device busy').exec
271
+ else
272
+ return value
273
+ end
274
+ end
275
+ end