hardsploit_gui 2.3 → 2.4.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 (149) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +22 -22
  3. data/Rakefile +1 -1
  4. data/bin/hardsploit_gui +3 -3
  5. data/lib/Firmwares/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
  6. data/lib/Firmwares/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
  7. data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
  8. data/lib/Firmwares/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd +0 -0
  9. data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
  10. data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
  11. data/lib/Firmwares/FPGA/VersionFPGA.rb +5 -5
  12. data/lib/Firmwares/UC/VersionUC.rb +12 -12
  13. data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -210
  14. data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -150
  15. data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -109
  16. data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -305
  17. data/lib/HardsploitAPI/Core/HardsploitAPI_PROGRESS.rb +28 -28
  18. data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -166
  19. data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -356
  20. data/lib/HardsploitAPI/Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb +206 -206
  21. data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -306
  22. data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -340
  23. data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -83
  24. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -367
  25. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -89
  26. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -61
  27. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_STM32.rb +121 -121
  28. data/lib/HardsploitAPI/Modules/TEST/HardsploitAPI_TEST_INTERACT.rb +98 -98
  29. data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -196
  30. data/lib/Hardsploit_gui.rb +96 -96
  31. data/lib/LICENSE.txt +674 -674
  32. data/lib/README.md +22 -22
  33. data/lib/TRADEMARK +2 -2
  34. data/lib/class/Chip_editor.rb +304 -304
  35. data/lib/class/Chip_management.rb +496 -496
  36. data/lib/class/Command_editor.rb +216 -216
  37. data/lib/class/Command_table.rb +233 -233
  38. data/lib/class/Console.rb +26 -26
  39. data/lib/class/ErrorMsg.rb +312 -312
  40. data/lib/class/Export.rb +140 -140
  41. data/lib/class/Export_manager.rb +124 -124
  42. data/lib/class/Firmware.rb +70 -70
  43. data/lib/class/Generic_commands.rb +260 -260
  44. data/lib/class/{i2c → I2C}/I2c_command.rb +51 -51
  45. data/lib/class/{i2c → I2C}/I2c_export.rb +95 -95
  46. data/lib/class/{i2c → I2C}/I2c_import.rb +117 -117
  47. data/lib/class/{i2c → I2C}/I2c_scanner.rb +114 -114
  48. data/lib/class/{i2c → I2C}/I2c_settings.rb +148 -148
  49. data/lib/class/Import.rb +193 -193
  50. data/lib/class/{parallel → PARALLEL}/Parallel_export.rb +118 -118
  51. data/lib/class/{parallel → PARALLEL}/Parallel_import.rb +113 -113
  52. data/lib/class/{parallel → PARALLEL}/Parallel_settings.rb +81 -81
  53. data/lib/class/Progress_bar.rb +32 -32
  54. data/lib/class/{spi → SPI}/Spi_export.rb +108 -108
  55. data/lib/class/{spi → SPI}/Spi_import.rb +159 -159
  56. data/lib/class/{spi → SPI}/Spi_settings.rb +108 -108
  57. data/lib/class/{spi → SPI}/Spi_sniffer.rb +101 -101
  58. data/lib/class/Signal_mapper.rb +120 -120
  59. data/lib/class/Wire_helper.rb +230 -230
  60. data/lib/class/swd/Swd.rb +125 -125
  61. data/lib/class/swd/Swd_scanner.rb +121 -121
  62. data/lib/class/swd/Swd_settings.rb +76 -76
  63. data/lib/class/uart/Uart_baudrate.rb +62 -62
  64. data/lib/class/uart/Uart_console.rb +115 -115
  65. data/lib/class/uart/Uart_settings.rb +102 -102
  66. data/lib/db/associations.rb +138 -138
  67. data/lib/db/database.rb +4 -4
  68. data/lib/db/development.sqlite3 +0 -0
  69. data/lib/db/migrate/004_create_manufacturers.rb +13 -13
  70. data/lib/db/migrate/005_create_packages.rb +13 -13
  71. data/lib/db/migrate/006_create_chip_types.rb +11 -11
  72. data/lib/db/migrate/007_create_buses.rb +11 -11
  73. data/lib/db/migrate/008_create_signals.rb +14 -14
  74. data/lib/db/migrate/009_create_chips.rb +25 -25
  75. data/lib/db/migrate/010_create_commands.rb +21 -21
  76. data/lib/db/migrate/011_create_bytes.rb +19 -19
  77. data/lib/db/migrate/012_create_i2c_settings.rb +21 -21
  78. data/lib/db/migrate/013_create_spi_settings.rb +26 -26
  79. data/lib/db/migrate/014_create_parallel_settings.rb +21 -21
  80. data/lib/db/migrate/015_create_pins.rb +19 -19
  81. data/lib/db/migrate/016_create_uses.rb +17 -17
  82. data/lib/db/migrate/017_create_swd_settings.rb +19 -19
  83. data/lib/db/migrate/018_create_uart_settings.rb +22 -22
  84. data/lib/db/schema.rb +157 -157
  85. data/lib/db/seeds.rb +161 -161
  86. data/lib/gui/gui_chip_editor.rb +349 -349
  87. data/lib/gui/gui_chip_management.rb +377 -377
  88. data/lib/gui/gui_command_editor.rb +219 -219
  89. data/lib/gui/gui_export.rb +132 -132
  90. data/lib/gui/gui_export_manager.rb +93 -93
  91. data/lib/gui/gui_generic_commands.rb +202 -202
  92. data/lib/gui/gui_generic_export.rb +164 -164
  93. data/lib/gui/gui_generic_import.rb +142 -142
  94. data/lib/gui/gui_i2c_command.rb +116 -116
  95. data/lib/gui/gui_i2c_settings.rb +230 -230
  96. data/lib/gui/gui_import.rb +131 -131
  97. data/lib/gui/gui_parallel_settings.rb +195 -195
  98. data/lib/gui/gui_progress_bar.rb +85 -85
  99. data/lib/gui/gui_signal_mapper.rb +121 -121
  100. data/lib/gui/gui_signal_scanner.rb +146 -146
  101. data/lib/gui/gui_spi_import.rb +126 -126
  102. data/lib/gui/gui_spi_settings.rb +313 -313
  103. data/lib/gui/gui_spi_sniffer.rb +112 -112
  104. data/lib/gui/gui_swd_settings.rb +166 -166
  105. data/lib/gui/gui_uart_baudrate.rb +114 -114
  106. data/lib/gui/gui_uart_console.rb +164 -164
  107. data/lib/gui/gui_uart_settings.rb +243 -243
  108. data/lib/gui/gui_wire_helper.rb +99 -99
  109. data/lib/gui_designer/gui_chip_editor.ui +549 -549
  110. data/lib/gui_designer/gui_chip_management.ui +886 -886
  111. data/lib/gui_designer/gui_command_editor.ui +350 -350
  112. data/lib/gui_designer/gui_export.ui +171 -171
  113. data/lib/gui_designer/gui_export_manager.ui +115 -115
  114. data/lib/gui_designer/gui_generic_commands.ui +342 -342
  115. data/lib/gui_designer/gui_generic_export.ui +202 -202
  116. data/lib/gui_designer/gui_generic_import.ui +165 -165
  117. data/lib/gui_designer/gui_i2c_command.ui +148 -148
  118. data/lib/gui_designer/gui_i2c_settings.ui +292 -292
  119. data/lib/gui_designer/gui_import.ui +168 -168
  120. data/lib/gui_designer/gui_parallel_settings.ui +247 -247
  121. data/lib/gui_designer/gui_progress_bar.ui +86 -86
  122. data/lib/gui_designer/gui_signal_mapper.ui +179 -179
  123. data/lib/gui_designer/gui_signal_scanner.ui +261 -261
  124. data/lib/gui_designer/gui_spi_settings.ui +446 -446
  125. data/lib/gui_designer/gui_spi_sniffer.ui +156 -156
  126. data/lib/gui_designer/gui_swd_settings.ui +189 -189
  127. data/lib/gui_designer/gui_uart_baudrate.ui +161 -161
  128. data/lib/gui_designer/gui_uart_console.ui +284 -284
  129. data/lib/gui_designer/gui_uart_settings.ui +280 -280
  130. data/lib/gui_designer/gui_wire_helper.ui +117 -117
  131. data/lib/images/search.png +0 -0
  132. data/lib/logs/error.log +0 -63
  133. data/lib/models/bus.rb +19 -19
  134. data/lib/models/byte.rb +29 -29
  135. data/lib/models/chip.rb +41 -41
  136. data/lib/models/chip_type.rb +14 -14
  137. data/lib/models/command.rb +20 -20
  138. data/lib/models/i2c_setting.rb +41 -41
  139. data/lib/models/manufacturer.rb +14 -14
  140. data/lib/models/package.rb +26 -26
  141. data/lib/models/parallel_setting.rb +37 -37
  142. data/lib/models/pin.rb +14 -14
  143. data/lib/models/signall.rb +20 -20
  144. data/lib/models/spi_setting.rb +67 -67
  145. data/lib/models/swd_setting.rb +25 -25
  146. data/lib/models/uart_setting.rb +52 -52
  147. data/lib/models/use.rb +6 -6
  148. data/lib/startHardsploit.rb +10 -10
  149. metadata +14 -14
@@ -1,305 +1,305 @@
1
- #!/usr/bin/ruby
2
- #===================================================
3
- # Hardsploit API - By Opale Security
4
- # www.opale-security.com || www.hardsploit.io
5
- # License: GNU General Public License v3
6
- # License URI: http://www.gnu.org/licenses/gpl.txt
7
- #===================================================
8
-
9
- class HardsploitAPI
10
- public
11
- def loadFirmware(firmware)
12
- base_path = File.expand_path(File.dirname(__FILE__)) + '/../../Firmwares/FPGA/'
13
- case firmware
14
- when 'I2C'
15
- firmware_path = base_path + 'I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd'
16
- HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
17
- when 'SPI'
18
- firmware_path = base_path + 'SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd'
19
- HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
20
- when 'SPI_SNIFFER'
21
- firmware_path = base_path + 'SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd'
22
- HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
23
- when 'PARALLEL'
24
- firmware_path = base_path + 'PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd'
25
- HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
26
- when 'SWD'
27
- firmware_path = base_path + 'SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd'
28
- HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
29
- when 'UART'
30
- firmware_path = base_path + 'UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd'
31
- HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
32
- when 'uC'
33
- system("dfu-util -D 0483:df11 -a 0 -s 0x08000000 -R --download #{File.expand_path(File.dirname(__FILE__))}'/../Firmwares/UC/HARDSPLOIT_FIRMWARE_UC.bin'")
34
- end
35
- end
36
-
37
- # Wait to receive data
38
- # * +pathFirmware+:: path of rpd file (vhdl)
39
- # * +checkFirmware+:: boolean if check is needed (recommended false, in case issue true to check)
40
- # Return true if firmware write == firmware read (slow because read the firmware for check)
41
- def uploadFirmware(pathFirmware:,checkFirmware:)
42
- stopFPGA
43
- eraseFirmware
44
- firmwarewrite = self.writeFirmware(pathFirmware)#return array of bytes write
45
- if checkFirmware == true then
46
- firmwareRead = self.readFirmware(firmwarewrite.length) #return array of bytes read
47
- startFPGA
48
- sleep(1)
49
- return (firmwarewrite == firmwareRead)
50
- else
51
- startFPGA
52
- sleep(1)
53
- return true
54
- end
55
- end
56
-
57
- def startFPGA
58
- packet = Array.new
59
- packet.push HardsploitAPI.lowByte(word:4)
60
- packet.push HardsploitAPI.highByte(word:4)
61
- packet.push HardsploitAPI.lowByte(word:USB_COMMAND::START_FPGA)
62
- packet.push HardsploitAPI.highByte(word:USB_COMMAND::START_FPGA)
63
- self.sendPacket(packet)
64
- end
65
- def stopFPGA
66
- packet = Array.new
67
- packet.push HardsploitAPI.lowByte(word:4)
68
- packet.push HardsploitAPI.highByte(word:4)
69
- packet.push HardsploitAPI.lowByte(word:USB_COMMAND::STOP_FPGA)
70
- packet.push HardsploitAPI.highByte(word:USB_COMMAND::STOP_FPGA)
71
- self.sendPacket(packet)
72
- end
73
-
74
-
75
- protected
76
- def eraseFirmware
77
- usbPacket = Array.new
78
- usbPacket.push HardsploitAPI.lowByte(word:4) #length of trame
79
- usbPacket.push HardsploitAPI.highByte(word:4)
80
- usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::ERASE_FIRMWARE)
81
- usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::ERASE_FIRMWARE)
82
-
83
- consoleInfo "Start to erase Firmware\n"
84
- t1 = Time.now
85
-
86
- #Timeout very high to detect the end of erasing
87
- received_data = sendAndReceiveDATA(usbPacket,15000)
88
-
89
- t2 = Time.now
90
- delta = t2 - t1
91
- consoleSpeed "Firmware erased in #{delta.round(4)} sec\n\n"
92
-
93
- end
94
-
95
- #Just path of file and wait. is a blocking function until firmware has been uploaded
96
- def writeFirmware (file_path)
97
- t1 = Time.now
98
- consoleInfo "Upload firmware in progress\n"
99
-
100
- usbPacket= Array.new
101
- file = File.read(file_path,:encoding => 'iso-8859-1').unpack('C*') #string to array byte
102
- puts "Date of last modification of the firmware #{File.mtime(file_path)}"
103
-
104
- consoleInfo "FIRMARE Write #{file.size} bytes\n"
105
-
106
- nbFullPage = file.size/256
107
- nbLastByte = file.size%256
108
-
109
- nbFullPacket = nbFullPage/31
110
- nbLastPagePacket = nbFullPage%31
111
- nbSuppressBytesAtLast = 256-nbLastByte
112
- #complete last page with the last alone byte ( without full page)
113
- if nbLastByte > 0 then
114
- for i in 0.. (nbSuppressBytesAtLast-1)
115
- file.push 0xFF
116
- end
117
- nbFullPage = nbFullPage+1
118
- nbLastByte = 0
119
-
120
- #recalculating packet after complete half page to a full page
121
- nbFullPacket = nbFullPage/31
122
- nbLastPagePacket = nbFullPage%31
123
- else
124
- nbSuppressBytesAtLast = 0
125
- end
126
-
127
- consoleInfo "REAL Write #{file.size} bytes\n"
128
-
129
- #Now only full page but maybe a half packet
130
- #Prepare the full packet (31 pages of 256 byte each)
131
- for ipacket in 0..nbFullPacket-1
132
- usbPacket= Array.new
133
- usbPacket.push 0 #lenght of trame modify by sendUSBPacket
134
- usbPacket.push 0
135
- usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::WRITE_PAGE_FIRMWARE)
136
- usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::WRITE_PAGE_FIRMWARE)
137
- usbPacket.push HardsploitAPI.lowByte(word:(ipacket)*31) # low byte Nb of the first page
138
- usbPacket.push HardsploitAPI.highByte(word:(ipacket)*31) # high byte Nb of the first page
139
- usbPacket.push 31 #Nb of pages sent
140
-
141
- start = (ipacket)*31*256
142
- stop = (ipacket+1)*31*256 -1 #array start at index = 0
143
-
144
- for iFile in start..stop
145
- usbPacket.push HardsploitAPI.reverseBit(file[iFile])
146
- end
147
-
148
- percent = ipacket *100 / (nbFullPacket-1)
149
- begin
150
- sendPacket(usbPacket)
151
- consoleSpeed "UPLOAD AT : #{ipacket} / #{(nbFullPacket-1)} (#{percent}) %\n"
152
- HardsploitAPI.instance.consoleProgress(
153
- percent: percent,
154
- startTime:t1,
155
- endTime: Time.new
156
- )
157
- rescue
158
- raise USB_ERROR
159
- end
160
- end
161
-
162
- #Prepare the last packet with the rest of data
163
- if nbLastPagePacket >0 then
164
- usbPacket= Array.new
165
- usbPacket.push 0 #lenght of trame modify by sendUSBPacket
166
- usbPacket.push 0
167
- usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::WRITE_PAGE_FIRMWARE)
168
- usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::WRITE_PAGE_FIRMWARE)
169
-
170
- if nbFullPacket == 0 then
171
- usbPacket.push HardsploitAPI.lowByte(word:(nbFullPacket)*31) # low byte Nb of the first page
172
- usbPacket.push HardsploitAPI.highByte(word:(nbFullPacket)*31) # high byte Nb of the first page
173
- else
174
- usbPacket.push HardsploitAPI.lowByte(word:(nbFullPacket)*31 + 1 ) # low byte Nb of the first page
175
- usbPacket.push HardsploitAPI.highByte(word:(nbFullPacket)*31+ 1 ) # high byte Nb of the first page
176
- end
177
-
178
- usbPacket.push nbLastPagePacket # nb of page < 31
179
-
180
- start = (nbFullPacket)*31*256
181
- stop = (nbFullPacket)*31*256 + nbLastPagePacket*256 -1
182
-
183
- for iFile in start..stop
184
- #inverted LSB MSB
185
- usbPacket.push HardsploitAPI.reverseBit(file[iFile])
186
- end
187
- begin
188
- sendPacket(usbPacket)
189
- consoleSpeed "UPLOAD AT : 100 %\n"
190
- HardsploitAPI.instance.consoleProgress(
191
- percent: 100,
192
- startTime:t1,
193
- endTime: Time.new
194
- )
195
- rescue
196
- raise ERROR::USB_ERROR
197
- end
198
- end
199
-
200
- t2 = Time.now
201
- delta = t2 - t1
202
- consoleSpeed "FIRMWARE WAS WRITTEN in #{delta.round(4)} sec\n"
203
- file.pop(nbSuppressBytesAtLast)
204
- return file
205
- end
206
-
207
- #Read firmware
208
- def readFirmware(size)
209
- consoleSpeed "START READ FIRMWARE \n"
210
- readFirmware = Array.new
211
- t1 = Time.now
212
-
213
- nbFullPage = size/256
214
- nbLastByte = size%256
215
-
216
-
217
- nbFullPacket = nbFullPage/31
218
- nbLastPagePacket = nbFullPage%31
219
-
220
- if nbLastByte > 0 then
221
- nbSuppressBytesAtLast = 256-nbLastByte
222
-
223
- nbFullPage = nbFullPage+1
224
- nbLastByte = 0
225
-
226
- nbFullPacket = nbFullPage/31
227
- nbLastPagePacket = nbFullPage%31
228
- else
229
- nbSuppressBytesAtLast = 0
230
-
231
- end
232
-
233
- for ipacket in 0..nbFullPacket-1
234
- usbPacket= Array.new
235
- usbPacket.push 7
236
- usbPacket.push 0
237
- usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::READ_PAGE_FIRMWARE)
238
- usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::READ_PAGE_FIRMWARE)
239
- usbPacket.push HardsploitAPI.lowByte(word:(ipacket)*31) # low byte Nb of the first page
240
- usbPacket.push HardsploitAPI.highByte(word:(ipacket)*31) # high byte Nb of the first page
241
- usbPacket.push 31 # nb of page max 31 per packet
242
-
243
- received_data = sendAndReceiveDATA(usbPacket,3000)
244
- #remove header
245
- received_data = received_data.drop(7)
246
-
247
- #reverse byte
248
- received_data = received_data.collect {|x| HardsploitAPI.reverseBit(x) }
249
- readFirmware.push *received_data
250
- if nbFullPacket == 1 then
251
- consoleSpeed "READ AT : 1 / 2 50 %\n"
252
- HardsploitAPI.instance.consoleProgress(
253
- percent: 50,
254
- startTime:t1,
255
- endTime: Time.new
256
- )
257
- else
258
- percent = ipacket *100 / (nbFullPacket-1)
259
- consoleSpeed "READ AT : #{ipacket} / #{(nbFullPacket-1)} (#{percent} %) \n"
260
- HardsploitAPI.instance.consoleProgress(
261
- percent: percent,
262
- startTime:t1,
263
- endTime: Time.new
264
- )
265
- end
266
- end
267
-
268
- #Prepare the last packet with the rest of data
269
- if nbLastPagePacket >0 then
270
- usbPacket= Array.new
271
- usbPacket.push 7
272
- usbPacket.push 0
273
- usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::READ_PAGE_FIRMWARE)
274
- usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::READ_PAGE_FIRMWARE)
275
-
276
- #Increase nb of page to add the last byte
277
- if nbFullPacket == 0 then
278
- usbPacket.push HardsploitAPI.lowByte(word:(nbFullPacket)*31) # low byte Nb of the first page
279
- usbPacket.push HardsploitAPI.highByte(word:(nbFullPacket)*31) # high byte Nb of the first page
280
- else
281
- usbPacket.push HardsploitAPI.lowByte(word:(nbFullPacket)*31 + 1 ) # low byte Nb of the first page
282
- usbPacket.push HardsploitAPI.highByte(word:(nbFullPacket)*31+ 1 ) # high byte Nb of the first page
283
- end
284
-
285
- usbPacket.push nbLastPagePacket
286
-
287
- received_data = sendAndReceiveDATA(usbPacket,15000)
288
- #remove header
289
- received_data = received_data.drop(7)
290
- #reverse byte
291
- received_data = received_data.collect {|x| HardsploitAPI.reverseBit(x) }
292
- readFirmware.push *received_data
293
-
294
- consoleSpeed "READ AT 100%\n"
295
- end
296
-
297
- #remove a fake byte at last of reading just for transmiting
298
- readFirmware.pop(nbSuppressBytesAtLast)
299
-
300
- t2 = Time.now
301
- delta = t2 - t1
302
- consoleSpeed "READ FIRMWARE FINISH in #{delta.round(4)} sec\n"
303
- return readFirmware
304
- end
305
- end
1
+ #!/usr/bin/ruby
2
+ #===================================================
3
+ # Hardsploit API - By Opale Security
4
+ # www.opale-security.com || www.hardsploit.io
5
+ # License: GNU General Public License v3
6
+ # License URI: http://www.gnu.org/licenses/gpl.txt
7
+ #===================================================
8
+
9
+ class HardsploitAPI
10
+ public
11
+ def loadFirmware(firmware)
12
+ base_path = File.expand_path(File.dirname(__FILE__)) + '/../../Firmwares/FPGA/'
13
+ case firmware
14
+ when 'I2C'
15
+ firmware_path = base_path + 'I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd'
16
+ HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
17
+ when 'SPI'
18
+ firmware_path = base_path + 'SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd'
19
+ HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
20
+ when 'SPI_SNIFFER'
21
+ firmware_path = base_path + 'SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd'
22
+ HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
23
+ when 'PARALLEL'
24
+ firmware_path = base_path + 'PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd'
25
+ HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
26
+ when 'SWD'
27
+ firmware_path = base_path + 'SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd'
28
+ HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
29
+ when 'UART'
30
+ firmware_path = base_path + 'UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd'
31
+ HardsploitAPI.instance.uploadFirmware(pathFirmware: firmware_path, checkFirmware: false)
32
+ when 'uC'
33
+ system("dfu-util -D 0483:df11 -a 0 -s 0x08000000 -R --download #{File.expand_path(File.dirname(__FILE__))}'/../Firmwares/UC/HARDSPLOIT_FIRMWARE_UC.bin'")
34
+ end
35
+ end
36
+
37
+ # Wait to receive data
38
+ # * +pathFirmware+:: path of rpd file (vhdl)
39
+ # * +checkFirmware+:: boolean if check is needed (recommended false, in case issue true to check)
40
+ # Return true if firmware write == firmware read (slow because read the firmware for check)
41
+ def uploadFirmware(pathFirmware:,checkFirmware:)
42
+ stopFPGA
43
+ eraseFirmware
44
+ firmwarewrite = self.writeFirmware(pathFirmware)#return array of bytes write
45
+ if checkFirmware == true then
46
+ firmwareRead = self.readFirmware(firmwarewrite.length) #return array of bytes read
47
+ startFPGA
48
+ sleep(1)
49
+ return (firmwarewrite == firmwareRead)
50
+ else
51
+ startFPGA
52
+ sleep(1)
53
+ return true
54
+ end
55
+ end
56
+
57
+ def startFPGA
58
+ packet = Array.new
59
+ packet.push HardsploitAPI.lowByte(word:4)
60
+ packet.push HardsploitAPI.highByte(word:4)
61
+ packet.push HardsploitAPI.lowByte(word:USB_COMMAND::START_FPGA)
62
+ packet.push HardsploitAPI.highByte(word:USB_COMMAND::START_FPGA)
63
+ self.sendPacket(packet)
64
+ end
65
+ def stopFPGA
66
+ packet = Array.new
67
+ packet.push HardsploitAPI.lowByte(word:4)
68
+ packet.push HardsploitAPI.highByte(word:4)
69
+ packet.push HardsploitAPI.lowByte(word:USB_COMMAND::STOP_FPGA)
70
+ packet.push HardsploitAPI.highByte(word:USB_COMMAND::STOP_FPGA)
71
+ self.sendPacket(packet)
72
+ end
73
+
74
+
75
+ protected
76
+ def eraseFirmware
77
+ usbPacket = Array.new
78
+ usbPacket.push HardsploitAPI.lowByte(word:4) #length of trame
79
+ usbPacket.push HardsploitAPI.highByte(word:4)
80
+ usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::ERASE_FIRMWARE)
81
+ usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::ERASE_FIRMWARE)
82
+
83
+ consoleInfo "Start to erase Firmware\n"
84
+ t1 = Time.now
85
+
86
+ #Timeout very high to detect the end of erasing
87
+ received_data = sendAndReceiveDATA(usbPacket,15000)
88
+
89
+ t2 = Time.now
90
+ delta = t2 - t1
91
+ consoleSpeed "Firmware erased in #{delta.round(4)} sec\n\n"
92
+
93
+ end
94
+
95
+ #Just path of file and wait. is a blocking function until firmware has been uploaded
96
+ def writeFirmware (file_path)
97
+ t1 = Time.now
98
+ consoleInfo "Upload firmware in progress\n"
99
+
100
+ usbPacket= Array.new
101
+ file = File.read(file_path,:encoding => 'iso-8859-1').unpack('C*') #string to array byte
102
+ puts "Date of last modification of the firmware #{File.mtime(file_path)}"
103
+
104
+ consoleInfo "FIRMARE Write #{file.size} bytes\n"
105
+
106
+ nbFullPage = file.size/256
107
+ nbLastByte = file.size%256
108
+
109
+ nbFullPacket = nbFullPage/31
110
+ nbLastPagePacket = nbFullPage%31
111
+ nbSuppressBytesAtLast = 256-nbLastByte
112
+ #complete last page with the last alone byte ( without full page)
113
+ if nbLastByte > 0 then
114
+ for i in 0.. (nbSuppressBytesAtLast-1)
115
+ file.push 0xFF
116
+ end
117
+ nbFullPage = nbFullPage+1
118
+ nbLastByte = 0
119
+
120
+ #recalculating packet after complete half page to a full page
121
+ nbFullPacket = nbFullPage/31
122
+ nbLastPagePacket = nbFullPage%31
123
+ else
124
+ nbSuppressBytesAtLast = 0
125
+ end
126
+
127
+ consoleInfo "REAL Write #{file.size} bytes\n"
128
+
129
+ #Now only full page but maybe a half packet
130
+ #Prepare the full packet (31 pages of 256 byte each)
131
+ for ipacket in 0..nbFullPacket-1
132
+ usbPacket= Array.new
133
+ usbPacket.push 0 #lenght of trame modify by sendUSBPacket
134
+ usbPacket.push 0
135
+ usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::WRITE_PAGE_FIRMWARE)
136
+ usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::WRITE_PAGE_FIRMWARE)
137
+ usbPacket.push HardsploitAPI.lowByte(word:(ipacket)*31) # low byte Nb of the first page
138
+ usbPacket.push HardsploitAPI.highByte(word:(ipacket)*31) # high byte Nb of the first page
139
+ usbPacket.push 31 #Nb of pages sent
140
+
141
+ start = (ipacket)*31*256
142
+ stop = (ipacket+1)*31*256 -1 #array start at index = 0
143
+
144
+ for iFile in start..stop
145
+ usbPacket.push HardsploitAPI.reverseBit(file[iFile])
146
+ end
147
+
148
+ percent = ipacket *100 / (nbFullPacket-1)
149
+ begin
150
+ sendPacket(usbPacket)
151
+ consoleSpeed "UPLOAD AT : #{ipacket} / #{(nbFullPacket-1)} (#{percent}) %\n"
152
+ HardsploitAPI.instance.consoleProgress(
153
+ percent: percent,
154
+ startTime:t1,
155
+ endTime: Time.new
156
+ )
157
+ rescue
158
+ raise USB_ERROR
159
+ end
160
+ end
161
+
162
+ #Prepare the last packet with the rest of data
163
+ if nbLastPagePacket >0 then
164
+ usbPacket= Array.new
165
+ usbPacket.push 0 #lenght of trame modify by sendUSBPacket
166
+ usbPacket.push 0
167
+ usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::WRITE_PAGE_FIRMWARE)
168
+ usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::WRITE_PAGE_FIRMWARE)
169
+
170
+ if nbFullPacket == 0 then
171
+ usbPacket.push HardsploitAPI.lowByte(word:(nbFullPacket)*31) # low byte Nb of the first page
172
+ usbPacket.push HardsploitAPI.highByte(word:(nbFullPacket)*31) # high byte Nb of the first page
173
+ else
174
+ usbPacket.push HardsploitAPI.lowByte(word:(nbFullPacket)*31 + 1 ) # low byte Nb of the first page
175
+ usbPacket.push HardsploitAPI.highByte(word:(nbFullPacket)*31+ 1 ) # high byte Nb of the first page
176
+ end
177
+
178
+ usbPacket.push nbLastPagePacket # nb of page < 31
179
+
180
+ start = (nbFullPacket)*31*256
181
+ stop = (nbFullPacket)*31*256 + nbLastPagePacket*256 -1
182
+
183
+ for iFile in start..stop
184
+ #inverted LSB MSB
185
+ usbPacket.push HardsploitAPI.reverseBit(file[iFile])
186
+ end
187
+ begin
188
+ sendPacket(usbPacket)
189
+ consoleSpeed "UPLOAD AT : 100 %\n"
190
+ HardsploitAPI.instance.consoleProgress(
191
+ percent: 100,
192
+ startTime:t1,
193
+ endTime: Time.new
194
+ )
195
+ rescue
196
+ raise ERROR::USB_ERROR
197
+ end
198
+ end
199
+
200
+ t2 = Time.now
201
+ delta = t2 - t1
202
+ consoleSpeed "FIRMWARE WAS WRITTEN in #{delta.round(4)} sec\n"
203
+ file.pop(nbSuppressBytesAtLast)
204
+ return file
205
+ end
206
+
207
+ #Read firmware
208
+ def readFirmware(size)
209
+ consoleSpeed "START READ FIRMWARE \n"
210
+ readFirmware = Array.new
211
+ t1 = Time.now
212
+
213
+ nbFullPage = size/256
214
+ nbLastByte = size%256
215
+
216
+
217
+ nbFullPacket = nbFullPage/31
218
+ nbLastPagePacket = nbFullPage%31
219
+
220
+ if nbLastByte > 0 then
221
+ nbSuppressBytesAtLast = 256-nbLastByte
222
+
223
+ nbFullPage = nbFullPage+1
224
+ nbLastByte = 0
225
+
226
+ nbFullPacket = nbFullPage/31
227
+ nbLastPagePacket = nbFullPage%31
228
+ else
229
+ nbSuppressBytesAtLast = 0
230
+
231
+ end
232
+
233
+ for ipacket in 0..nbFullPacket-1
234
+ usbPacket= Array.new
235
+ usbPacket.push 7
236
+ usbPacket.push 0
237
+ usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::READ_PAGE_FIRMWARE)
238
+ usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::READ_PAGE_FIRMWARE)
239
+ usbPacket.push HardsploitAPI.lowByte(word:(ipacket)*31) # low byte Nb of the first page
240
+ usbPacket.push HardsploitAPI.highByte(word:(ipacket)*31) # high byte Nb of the first page
241
+ usbPacket.push 31 # nb of page max 31 per packet
242
+
243
+ received_data = sendAndReceiveDATA(usbPacket,3000)
244
+ #remove header
245
+ received_data = received_data.drop(7)
246
+
247
+ #reverse byte
248
+ received_data = received_data.collect {|x| HardsploitAPI.reverseBit(x) }
249
+ readFirmware.push *received_data
250
+ if nbFullPacket == 1 then
251
+ consoleSpeed "READ AT : 1 / 2 50 %\n"
252
+ HardsploitAPI.instance.consoleProgress(
253
+ percent: 50,
254
+ startTime:t1,
255
+ endTime: Time.new
256
+ )
257
+ else
258
+ percent = ipacket *100 / (nbFullPacket-1)
259
+ consoleSpeed "READ AT : #{ipacket} / #{(nbFullPacket-1)} (#{percent} %) \n"
260
+ HardsploitAPI.instance.consoleProgress(
261
+ percent: percent,
262
+ startTime:t1,
263
+ endTime: Time.new
264
+ )
265
+ end
266
+ end
267
+
268
+ #Prepare the last packet with the rest of data
269
+ if nbLastPagePacket >0 then
270
+ usbPacket= Array.new
271
+ usbPacket.push 7
272
+ usbPacket.push 0
273
+ usbPacket.push HardsploitAPI.lowByte(word:USB_COMMAND::READ_PAGE_FIRMWARE)
274
+ usbPacket.push HardsploitAPI.highByte(word:USB_COMMAND::READ_PAGE_FIRMWARE)
275
+
276
+ #Increase nb of page to add the last byte
277
+ if nbFullPacket == 0 then
278
+ usbPacket.push HardsploitAPI.lowByte(word:(nbFullPacket)*31) # low byte Nb of the first page
279
+ usbPacket.push HardsploitAPI.highByte(word:(nbFullPacket)*31) # high byte Nb of the first page
280
+ else
281
+ usbPacket.push HardsploitAPI.lowByte(word:(nbFullPacket)*31 + 1 ) # low byte Nb of the first page
282
+ usbPacket.push HardsploitAPI.highByte(word:(nbFullPacket)*31+ 1 ) # high byte Nb of the first page
283
+ end
284
+
285
+ usbPacket.push nbLastPagePacket
286
+
287
+ received_data = sendAndReceiveDATA(usbPacket,15000)
288
+ #remove header
289
+ received_data = received_data.drop(7)
290
+ #reverse byte
291
+ received_data = received_data.collect {|x| HardsploitAPI.reverseBit(x) }
292
+ readFirmware.push *received_data
293
+
294
+ consoleSpeed "READ AT 100%\n"
295
+ end
296
+
297
+ #remove a fake byte at last of reading just for transmiting
298
+ readFirmware.pop(nbSuppressBytesAtLast)
299
+
300
+ t2 = Time.now
301
+ delta = t2 - t1
302
+ consoleSpeed "READ FIRMWARE FINISH in #{delta.round(4)} sec\n"
303
+ return readFirmware
304
+ end
305
+ end