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,88 @@
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_import'
10
+
11
+ class Parallel_import < Qt::Widget
12
+ slots 'import()'
13
+ slots 'select_import_file()'
14
+
15
+ def initialize(api, chip)
16
+ super()
17
+ @parallel_import_gui = Ui_Generic_import.new
18
+ centerWindow(self)
19
+ @parallel_import_gui.setupUi(self)
20
+ @parallel_import_gui.lbl_chip.setText(chip.chip_reference)
21
+ inputRestrict(@parallel_import_gui.lie_start, 0)
22
+ @api = api
23
+ @chip_settings = Parallel.find_by(parallel_chip: chip.chip_id)
24
+ end
25
+
26
+ def select_import_file
27
+ @filepath = Qt::FileDialog.getOpenFileName(self, tr('Select a file'), '/', tr('Bin file (*.bin)'))
28
+ unless @filepath.nil?
29
+ $file = File.open("#{@filepath}", 'w')
30
+ @parallel_import_gui.btn_import.setEnabled(true)
31
+ end
32
+ rescue Exception => msg
33
+ logger = Logger.new($logFilePath)
34
+ logger.error msg
35
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while openning the export file. Consult the logs for more details').exec
36
+ end
37
+
38
+ def close_file
39
+ unless $file.nil?
40
+ $file.close
41
+ end
42
+ rescue Exception => msg
43
+ logger = Logger.new($logFilePath)
44
+ logger.error msg
45
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while closing the export file. Consult the logs for more details').exec
46
+ end
47
+
48
+ def import
49
+ return 0 if control_import_settings.zero?
50
+ start = @parallel_import_gui.lie_start.text.to_i
51
+ Firmware.new(@api, 'PARALLEL')
52
+ time = Time.new
53
+ # API COMMAND GOES HERE
54
+ rescue Exception => msg
55
+ logger = Logger.new($logFilePath)
56
+ logger.error msg
57
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while partial import operation. Consult the logs for more details').exec
58
+ end
59
+
60
+ def control_import_settings
61
+ file_size = File.size("#{@filepath}")
62
+ if @chip_settings.nil?
63
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing parallel settings', 'No settings saved for this chip').exec
64
+ return 0
65
+ end
66
+ if @chip_settings.parallel_total_size.nil? || @chip_settings.parallel_word_size.nil?
67
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing parallel settings', 'Total size or word size settings missing').exec
68
+ return 0
69
+ end
70
+ if @chip_settings.parallel_page_size.nil? || @chip_settings.parallel_write_latency.nil?
71
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing parallel settings', 'Page size or write latency settings missing').exec
72
+ return 0
73
+ end
74
+ if @parallel_import_gui.lie_start.text.empty?
75
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing start address', 'Please fill the start address field').exec
76
+ return 0
77
+ end
78
+ if file_size > @chip_settings.parallel_total_size
79
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Incorrect file size', 'The file size is superior to the chip capacity').exec
80
+ return 0
81
+ end
82
+ if file_size > (@chip_settings.parallel_total_size - @parallel_import_gui.lie_start)
83
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Incorrect file size', 'Starting at this address, the file size is superior to the chip capacity').exec
84
+ return 0
85
+ end
86
+ return 1
87
+ end
88
+ end
@@ -0,0 +1,102 @@
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 '../../gui/gui_parallel_settings'
9
+ class Parallel_settings < Qt::Widget
10
+ slots 'save_settings()'
11
+
12
+ def initialize(chip)
13
+ super()
14
+ @parallel_settings_gui = Ui_Parallel_settings.new
15
+ centerWindow(self)
16
+ @parallel_settings_gui.setupUi(self)
17
+ @parallel_settings_gui.lbl_chip.setText(chip.chip_reference)
18
+ inputRestrict(@parallel_settings_gui.lie_total_size, 0)
19
+ inputRestrict(@parallel_settings_gui.lie_write_latency, 0)
20
+ inputRestrict(@parallel_settings_gui.lie_read_latency, 0)
21
+ inputRestrict(@parallel_settings_gui.lie_page_size, 0)
22
+ @chip_settings = Parallel.find_by(parallel_chip: chip.chip_id)
23
+ @chip = chip
24
+ feed_settings_form
25
+ end
26
+
27
+ def save_settings
28
+ if @chip_settings.nil?
29
+ create
30
+ else
31
+ @chip_settings = Parallel.find_by(parallel_chip: @chip.chip_id)
32
+ update
33
+ end
34
+ end
35
+
36
+ def feed_settings_form
37
+ unless @chip_settings.nil?
38
+ @parallel_settings_gui.lie_read_latency.setText(@chip_settings.parallel_read_latency.to_s)
39
+ @parallel_settings_gui.lie_write_latency.setText(@chip_settings.parallel_write_latency.to_s)
40
+ @parallel_settings_gui.lie_page_size.setText(@chip_settings.parallel_page_size.to_s)
41
+ @parallel_settings_gui.lie_total_size.setText(@chip_settings.parallel_total_size.to_s)
42
+ if @chip_settings.parallel_word_size.zero?
43
+ @parallel_settings_gui.rbn_8b.setChecked(true)
44
+ else
45
+ @parallel_settings_gui.rbn_16b.setChecked(true)
46
+ end
47
+ end
48
+ rescue Exception => msg
49
+ logger = Logger.new($logFilePath)
50
+ logger.error msg
51
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error while loading the form. Consult the log for more details').exec
52
+ end
53
+
54
+ def create
55
+ if @parallel_settings_gui.rbn_8b.isChecked
56
+ word_size = 0
57
+ else
58
+ word_size = 1
59
+ end
60
+ @chip_settings = Parallel.create(
61
+ parallel_word_size: word_size,
62
+ parallel_write_latency: @parallel_settings_gui.lie_write_latency,
63
+ parallel_read_latency: @parallel_settings_gui.lie_read_latency.text,
64
+ parallel_page_size: @parallel_settings_gui.lie_page_size.text,
65
+ parallel_total_size: @parallel_settings_gui.lie_total_size.text,
66
+ parallel_chip: @chip.chip_id
67
+ )
68
+ Qt::MessageBox.new(Qt::MessageBox::Information, 'Succes', 'Parallel parameters created successfully').exec
69
+ rescue Exception => msg
70
+ logger = Logger.new($logFilePath)
71
+ logger.error msg
72
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured when saving the parallel parameters. Consult the log for more details').exec
73
+ end
74
+
75
+ def update
76
+ if @parallel_settings_gui.rbn_8b.isChecked
77
+ word_size = 0
78
+ else
79
+ word_size = 1
80
+ end
81
+ if @chip_settings.parallel_page_size != @parallel_settings_gui.lie_page_size
82
+ @chip_settings.update(parallel_page_size: @parallel_settings_gui.lie_page_size.text)
83
+ end
84
+ if @chip_settings.parallel_total_size != @parallel_settings_gui.lie_total_size
85
+ @chip_settings.update(parallel_total_size: @parallel_settings_gui.lie_total_size.text)
86
+ end
87
+ if @chip_settings.parallel_read_latency != @parallel_settings_gui.lie_read_latency
88
+ @chip_settings.update(parallel_read_latency: @parallel_settings_gui.lie_read_latency.text)
89
+ end
90
+ if @chip_settings.parallel_write_latency != @parallel_settings_gui.lie_write_latency
91
+ @chip_settings.update(parallel_write_latency: @parallel_settings_gui.lie_write_latency.text)
92
+ end
93
+ if @chip_settings.parallel_word_size != word_size
94
+ @chip_settings.update(parallel_word_size: word_size)
95
+ end
96
+ Qt::MessageBox.new(Qt::MessageBox::Information, 'Succes', 'Parallel parameters saved successfully').exec
97
+ rescue Exception => msg
98
+ logger = Logger.new($logFilePath)
99
+ logger.error msg
100
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured when saving the parallel parameters. Consult the log for more details').exec
101
+ end
102
+ end
@@ -0,0 +1,141 @@
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_export'
10
+
11
+ class Spi_export < Qt::Widget
12
+ slots 'export()'
13
+ slots 'select_export_file()'
14
+
15
+ def initialize(api, chip)
16
+ super()
17
+ @spi_export_gui = Ui_Generic_export.new
18
+ centerWindow(self)
19
+ @spi_export_gui.setupUi(self)
20
+ @spi_export_gui.lbl_chip.setText(chip.chip_reference)
21
+ inputRestrict(@spi_export_gui.lie_start, 0)
22
+ inputRestrict(@spi_export_gui.lie_stop, 0)
23
+ @api = api
24
+ @chip_settings = Spi.find_by(spi_chip: chip.chip_id)
25
+ @speeds = {
26
+ '25.00' => 3,
27
+ '18.75' => 4,
28
+ '15.00' => 5,
29
+ '12.50' => 6,
30
+ '10.71' => 7,
31
+ '9.38' => 8,
32
+ '7.50' => 10,
33
+ '5.00' => 15,
34
+ '3.95' => 19,
35
+ '3.00' => 25,
36
+ '2.03' => 37,
37
+ '1.00' => 75,
38
+ '0.50' => 150,
39
+ '0.29' => 255
40
+ }
41
+ end
42
+
43
+ def select_export_file
44
+ @filepath = Qt::FileDialog.getSaveFileName(self, tr('Select a file'), '/', tr('Bin file (*.bin)'))
45
+ unless @filepath.nil?
46
+ $file = File.open("#{@filepath}", 'w')
47
+ @spi_export_gui.btn_export.setEnabled(true)
48
+ @spi_export_gui.btn_full_export.setEnabled(true)
49
+ end
50
+ rescue Exception => msg
51
+ logger = Logger.new($logFilePath)
52
+ logger.error msg
53
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while openning the export file. Consult the logs for more details').exec
54
+ end
55
+
56
+ def close_file
57
+ unless $file.nil?
58
+ $file.close
59
+ end
60
+ rescue Exception => msg
61
+ logger = Logger.new($logFilePath)
62
+ logger.error msg
63
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while closing the export file. Consult the logs for more details').exec
64
+ end
65
+
66
+ def export
67
+ if sender.objectName == 'btn_full_export'
68
+ return 0 if control_export_settings('full').zero?
69
+ else
70
+ return 0 if control_export_settings('partial').zero?
71
+ end
72
+ Firmware.new(@api, 'SPI')
73
+ time = Time.new
74
+ if sender.objectName == 'btn_full_export'
75
+ @api.spi_Generic_Dump(@chip_settings.spi_mode, @speeds[@chip_settings.spi_frequency], @chip_settings.spi_command_read, 0, @chip_settings.spi_total_size - 1, @chip_settings.spi_total_size.to_i)
76
+ close_file
77
+ control_export_result('full', @chip_settings.spi_total_size - 1, time)
78
+ else
79
+ @api.spi_Generic_Dump(@chip_settings.spi_mode, @speeds[@chip_settings.spi_frequency], @chip_settings.spi_command_read, @spi_export_gui.lie_start.text.to_i, @spi_export_gui.lie_stop.text.to_i, @chip_settings.spi_total_size.to_i)
80
+ close_file
81
+ control_export_result('partial', @spi_export_gui.lie_stop.text.to_i, time)
82
+ end
83
+ @spi_export_gui.btn_export.setEnabled(false)
84
+ @spi_export_gui.btn_full_export.setEnabled(false)
85
+ rescue Exception => msg
86
+ logger = Logger.new($logFilePath)
87
+ logger.error msg
88
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while full export operation. Consult the logs for more details').exec
89
+ end
90
+
91
+ def control_export_result(type, stop, time)
92
+ time = Time.new - time
93
+ if type == 'partial'
94
+ toCompare = ((stop - @spi_export_gui.lie_start.text.to_i) + 1)
95
+ else
96
+ toCompare = @chip_settings.spi_total_size
97
+ end
98
+ file_size = File.size(@filepath)
99
+ if toCompare == file_size
100
+ Qt::MessageBox.new(Qt::MessageBox::Information, 'Information', "Dump finished at #{((file_size / time)).round(2)}Bytes/s (#{(file_size)} Bytes in #{time.round(4)} s)").exec
101
+ else
102
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Error', 'Dump error: Size does not match').exec
103
+ end
104
+ p "DUMP #{((file_size / time)).round(2)}Bytes/s (#{(file_size)}Bytes in #{time.round(4)} s)"
105
+ end
106
+
107
+ def control_export_settings(type)
108
+ if @chip_settings.nil?
109
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'No settings saved for this chip').exec
110
+ return 0
111
+ end
112
+ if @chip_settings.spi_command_read.nil? || @chip_settings.spi_frequency.nil?
113
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'Read command or frequency settings missing').exec
114
+ return 0
115
+ end
116
+ if @chip_settings.spi_mode.nil?
117
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI setting', 'Mode setting missing').exec
118
+ return 0
119
+ end
120
+ if type == 'full'
121
+ if @chip_settings.spi_total_size.zero? || @chip_settings.spi_total_size.nil?
122
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Empty field', 'Full size setting missing or equal 0').exec
123
+ return 0
124
+ end
125
+ else
126
+ if @spi_export_gui.lie_start.text.empty? || @spi_export_gui.lie_stop.text.empty?
127
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Empty field', 'Start and stop address must be filled').exec
128
+ return 0
129
+ end
130
+ if @spi_export_gui.lie_start.text.to_i > @spi_export_gui.lie_stop.text.to_i
131
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Wrong value', 'Start address must be inforior to the stop address').exec
132
+ return 0
133
+ end
134
+ if @spi_export_gui.lie_start.text.to_i > (@chip_settings.spi_total_size - 1) || @spi_export_gui.lie_stop.text.to_i > (@chip_settings.spi_total_size - 1)
135
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Wrong value', 'Start and stop address must be inforior to the chip total size').exec
136
+ return 0
137
+ end
138
+ end
139
+ return 1
140
+ end
141
+ end
@@ -0,0 +1,112 @@
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_import'
10
+
11
+ class Spi_import < Qt::Widget
12
+ slots 'import()'
13
+ slots 'select_import_file()'
14
+
15
+ def initialize(api, chip)
16
+ super()
17
+ @spi_import_gui = Ui_Generic_import.new
18
+ centerWindow(self)
19
+ @spi_import_gui.setupUi(self)
20
+ @spi_import_gui.lbl_chip.setText(chip.chip_reference)
21
+ inputRestrict(@spi_import_gui.lie_start, 0)
22
+ @api = api
23
+ @chip_settings = Spi.find_by(spi_chip: chip.chip_id)
24
+ @speeds = {
25
+ '25.00' => 3,
26
+ '18.75' => 4,
27
+ '15.00' => 5,
28
+ '12.50' => 6,
29
+ '10.71' => 7,
30
+ '9.38' => 8,
31
+ '7.50' => 10,
32
+ '5.00' => 15,
33
+ '3.95' => 19,
34
+ '3.00' => 25,
35
+ '2.03' => 37,
36
+ '1.00' => 75,
37
+ '0.50' => 150,
38
+ '0.29' => 255
39
+ }
40
+ end
41
+
42
+ def select_import_file
43
+ @filepath = Qt::FileDialog.getOpenFileName(self, tr('Select a file'), '/', tr('Bin file (*.bin)'))
44
+ unless @filepath.nil?
45
+ $file = File.open("#{@filepath}", 'w')
46
+ @spi_import_gui.btn_import.setEnabled(true)
47
+ end
48
+ rescue Exception => msg
49
+ logger = Logger.new($logFilePath)
50
+ logger.error msg
51
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while openning the export file. Consult the logs for more details').exec
52
+ end
53
+
54
+ def close_file
55
+ unless $file.nil?
56
+ $file.close
57
+ end
58
+ rescue Exception => msg
59
+ logger = Logger.new($logFilePath)
60
+ logger.error msg
61
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while closing the export file. Consult the logs for more details').exec
62
+ end
63
+
64
+ def import
65
+ return 0 if control_import_settings.zero?
66
+ start = @spi_import_gui.lie_start.text.to_i
67
+ Firmware.new(@api, 'SPI')
68
+ time = Time.new
69
+ @api.spi_Generic_Dump(@chip_settings.spi_mode, @speeds[@chip_settings.spi_frequency], @chip_settings.spi_command_read, @spi_import_gui.lie_start.text.to_i, @chip_settings.spi_total_size.to_i)
70
+ rescue Exception => msg
71
+ logger = Logger.new($logFilePath)
72
+ logger.error msg
73
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured while partial import operation. Consult the logs for more details').exec
74
+ end
75
+
76
+ def control_import_result(type, stop, pathfile, time)
77
+ # TO COME
78
+ end
79
+
80
+ def control_import_settings
81
+ file_size = File.size("#{@filepath}")
82
+ if @chip_settings.nil?
83
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'No settings saved for this chip').exec
84
+ return 0
85
+ end
86
+ if @chip_settings.spi_total_size.nil? || @chip_settings.spi_page_size.nil?
87
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'Total size or page size settings missing').exec
88
+ return 0
89
+ end
90
+ if @chip_settings.spi_read_command.nil? || @chip_settings.spi_frequency.nil?
91
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI settings', 'Read command or frequency settings missing').exec
92
+ return 0
93
+ end
94
+ if @chip_settings.spi_mode.nil?
95
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing SPI setting', 'Mode setting missing').exec
96
+ return 0
97
+ end
98
+ if @spi_import_gui.lie_start.text.empty?
99
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Missing start address', 'Please fill the Start address field').exec
100
+ return 0
101
+ end
102
+ if file_size > @chip_settings.spi_total_size
103
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Incorrect file size', 'The file size is superior to the chip capacity').exec
104
+ return 0
105
+ end
106
+ if file_size > (@chip_settings.spi_total_size - @spi_import_gui.lie_start)
107
+ Qt::MessageBox.new(Qt::MessageBox::Warning, 'Incorrect file size', 'Starting at this address, the file size is superior to the chip capacity').exec
108
+ return 0
109
+ end
110
+ return 1
111
+ end
112
+ end
@@ -0,0 +1,90 @@
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 '../../gui/gui_spi_settings'
9
+ class Spi_settings < Qt::Widget
10
+ slots 'save_settings()'
11
+
12
+ def initialize(chip)
13
+ super()
14
+ @spi_settings_gui = Ui_Spi_settings.new
15
+ centerWindow(self)
16
+ @spi_settings_gui.setupUi(self)
17
+ @spi_settings_gui.lbl_chip.setText(chip.chip_reference)
18
+ inputRestrict(@spi_settings_gui.lie_total_size, 0)
19
+ inputRestrict(@spi_settings_gui.lie_cmd_read, 0)
20
+ inputRestrict(@spi_settings_gui.lie_page_size, 0)
21
+ @chip_settings = Spi.find_by(spi_chip: chip.chip_id)
22
+ @chip = chip
23
+ feed_settings_form
24
+ end
25
+
26
+ def save_settings
27
+ if @chip_settings.nil?
28
+ create
29
+ else
30
+ @chip_settings = Spi.find_by(spi_chip: @chip.chip_id)
31
+ update
32
+ end
33
+ end
34
+
35
+ def feed_settings_form
36
+ unless @chip_settings.nil?
37
+ @spi_settings_gui.cbx_mode.setCurrentIndex(@spi_settings_gui.cbx_mode.findText(@chip_settings.spi_mode.to_s))
38
+ @spi_settings_gui.cbx_frequency.setCurrentIndex(@spi_settings_gui.cbx_frequency.findText(@chip_settings.spi_frequency))
39
+ @spi_settings_gui.lie_cmd_read.setText(@chip_settings.spi_command_read.to_s)
40
+ @spi_settings_gui.lie_page_size.setText(@chip_settings.spi_page_size.to_s)
41
+ @spi_settings_gui.lie_total_size.setText(@chip_settings.spi_total_size.to_s)
42
+ end
43
+ rescue Exception => msg
44
+ logger = Logger.new($logFilePath)
45
+ logger.error msg
46
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error while loading the form. Consult the log for more details').exec
47
+ end
48
+
49
+ def create
50
+ @chip_settings = Spi.create(
51
+ spi_mode: @spi_settings_gui.cbx_mode.currentText,
52
+ spi_frequency: @spi_settings_gui.cbx_frequency.currentText,
53
+ spi_command_read: @spi_settings_gui.lie_cmd_read.text,
54
+ spi_page_size: @spi_settings_gui.lie_page_size.text,
55
+ spi_total_size: @spi_settings_gui.lie_total_size.text,
56
+ spi_chip: @chip.chip_id
57
+ )
58
+ Qt::MessageBox.new(Qt::MessageBox::Information, 'Succes', 'SPI parameters created successfully').exec
59
+ rescue Exception => msg
60
+ logger = Logger.new($logFilePath)
61
+ logger.error msg
62
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured when saving the SPI parameters. Consult the log for more details').exec
63
+ end
64
+
65
+ def update
66
+ if @chip_settings.spi_mode != @spi_settings_gui.cbx_mode.currentText.to_i
67
+ @chip_settings.update(spi_mode: @spi_settings_gui.cbx_mode.currentText.to_i)
68
+ end
69
+ if @chip_settings.spi_frequency != @spi_settings_gui.cbx_frequency.currentText
70
+ @chip_settings.update(spi_frequency: @spi_settings_gui.cbx_frequency.currentText)
71
+ end
72
+ if @chip_settings.spi_command_read != @spi_settings_gui.lie_cmd_read.text
73
+ if @spi_settings_gui.lie_cmd_read.text.empty?
74
+ @spi_settings_gui.lie_cmd_read.setText('3')
75
+ end
76
+ @chip_settings.update(spi_command_read: @spi_settings_gui.lie_cmd_read.text)
77
+ end
78
+ if @chip_settings.spi_page_size != @spi_settings_gui.lie_page_size.text
79
+ @chip_settings.update(spi_page_size: @spi_settings_gui.lie_page_size.text)
80
+ end
81
+ if @chip_settings.spi_total_size != @spi_settings_gui.lie_total_size.text
82
+ @chip_settings.update(spi_total_size: @spi_settings_gui.lie_total_size.text)
83
+ end
84
+ Qt::MessageBox.new(Qt::MessageBox::Information, 'Succes', 'SPI parameters saved successfully').exec
85
+ rescue Exception => msg
86
+ logger = Logger.new($logFilePath)
87
+ logger.error msg
88
+ Qt::MessageBox.new(Qt::MessageBox::Critical, 'Critical error', 'Error occured when saving the SPI parameters. Consult the log for more details').exec
89
+ end
90
+ end