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.
- checksums.yaml +4 -4
- data/README.md +22 -22
- data/Rakefile +1 -1
- data/bin/hardsploit_gui +3 -3
- data/lib/Firmwares/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
- data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd +0 -0
- data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/VersionFPGA.rb +5 -5
- data/lib/Firmwares/UC/VersionUC.rb +12 -12
- data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -210
- data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -150
- data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -109
- data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -305
- data/lib/HardsploitAPI/Core/HardsploitAPI_PROGRESS.rb +28 -28
- data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -166
- data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -356
- data/lib/HardsploitAPI/Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb +206 -206
- data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -306
- data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -340
- data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -83
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -367
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -89
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -61
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_STM32.rb +121 -121
- data/lib/HardsploitAPI/Modules/TEST/HardsploitAPI_TEST_INTERACT.rb +98 -98
- data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -196
- data/lib/Hardsploit_gui.rb +96 -96
- data/lib/LICENSE.txt +674 -674
- data/lib/README.md +22 -22
- data/lib/TRADEMARK +2 -2
- data/lib/class/Chip_editor.rb +304 -304
- data/lib/class/Chip_management.rb +496 -496
- data/lib/class/Command_editor.rb +216 -216
- data/lib/class/Command_table.rb +233 -233
- data/lib/class/Console.rb +26 -26
- data/lib/class/ErrorMsg.rb +312 -312
- data/lib/class/Export.rb +140 -140
- data/lib/class/Export_manager.rb +124 -124
- data/lib/class/Firmware.rb +70 -70
- data/lib/class/Generic_commands.rb +260 -260
- data/lib/class/{i2c → I2C}/I2c_command.rb +51 -51
- data/lib/class/{i2c → I2C}/I2c_export.rb +95 -95
- data/lib/class/{i2c → I2C}/I2c_import.rb +117 -117
- data/lib/class/{i2c → I2C}/I2c_scanner.rb +114 -114
- data/lib/class/{i2c → I2C}/I2c_settings.rb +148 -148
- data/lib/class/Import.rb +193 -193
- data/lib/class/{parallel → PARALLEL}/Parallel_export.rb +118 -118
- data/lib/class/{parallel → PARALLEL}/Parallel_import.rb +113 -113
- data/lib/class/{parallel → PARALLEL}/Parallel_settings.rb +81 -81
- data/lib/class/Progress_bar.rb +32 -32
- data/lib/class/{spi → SPI}/Spi_export.rb +108 -108
- data/lib/class/{spi → SPI}/Spi_import.rb +159 -159
- data/lib/class/{spi → SPI}/Spi_settings.rb +108 -108
- data/lib/class/{spi → SPI}/Spi_sniffer.rb +101 -101
- data/lib/class/Signal_mapper.rb +120 -120
- data/lib/class/Wire_helper.rb +230 -230
- data/lib/class/swd/Swd.rb +125 -125
- data/lib/class/swd/Swd_scanner.rb +121 -121
- data/lib/class/swd/Swd_settings.rb +76 -76
- data/lib/class/uart/Uart_baudrate.rb +62 -62
- data/lib/class/uart/Uart_console.rb +115 -115
- data/lib/class/uart/Uart_settings.rb +102 -102
- data/lib/db/associations.rb +138 -138
- data/lib/db/database.rb +4 -4
- data/lib/db/development.sqlite3 +0 -0
- data/lib/db/migrate/004_create_manufacturers.rb +13 -13
- data/lib/db/migrate/005_create_packages.rb +13 -13
- data/lib/db/migrate/006_create_chip_types.rb +11 -11
- data/lib/db/migrate/007_create_buses.rb +11 -11
- data/lib/db/migrate/008_create_signals.rb +14 -14
- data/lib/db/migrate/009_create_chips.rb +25 -25
- data/lib/db/migrate/010_create_commands.rb +21 -21
- data/lib/db/migrate/011_create_bytes.rb +19 -19
- data/lib/db/migrate/012_create_i2c_settings.rb +21 -21
- data/lib/db/migrate/013_create_spi_settings.rb +26 -26
- data/lib/db/migrate/014_create_parallel_settings.rb +21 -21
- data/lib/db/migrate/015_create_pins.rb +19 -19
- data/lib/db/migrate/016_create_uses.rb +17 -17
- data/lib/db/migrate/017_create_swd_settings.rb +19 -19
- data/lib/db/migrate/018_create_uart_settings.rb +22 -22
- data/lib/db/schema.rb +157 -157
- data/lib/db/seeds.rb +161 -161
- data/lib/gui/gui_chip_editor.rb +349 -349
- data/lib/gui/gui_chip_management.rb +377 -377
- data/lib/gui/gui_command_editor.rb +219 -219
- data/lib/gui/gui_export.rb +132 -132
- data/lib/gui/gui_export_manager.rb +93 -93
- data/lib/gui/gui_generic_commands.rb +202 -202
- data/lib/gui/gui_generic_export.rb +164 -164
- data/lib/gui/gui_generic_import.rb +142 -142
- data/lib/gui/gui_i2c_command.rb +116 -116
- data/lib/gui/gui_i2c_settings.rb +230 -230
- data/lib/gui/gui_import.rb +131 -131
- data/lib/gui/gui_parallel_settings.rb +195 -195
- data/lib/gui/gui_progress_bar.rb +85 -85
- data/lib/gui/gui_signal_mapper.rb +121 -121
- data/lib/gui/gui_signal_scanner.rb +146 -146
- data/lib/gui/gui_spi_import.rb +126 -126
- data/lib/gui/gui_spi_settings.rb +313 -313
- data/lib/gui/gui_spi_sniffer.rb +112 -112
- data/lib/gui/gui_swd_settings.rb +166 -166
- data/lib/gui/gui_uart_baudrate.rb +114 -114
- data/lib/gui/gui_uart_console.rb +164 -164
- data/lib/gui/gui_uart_settings.rb +243 -243
- data/lib/gui/gui_wire_helper.rb +99 -99
- data/lib/gui_designer/gui_chip_editor.ui +549 -549
- data/lib/gui_designer/gui_chip_management.ui +886 -886
- data/lib/gui_designer/gui_command_editor.ui +350 -350
- data/lib/gui_designer/gui_export.ui +171 -171
- data/lib/gui_designer/gui_export_manager.ui +115 -115
- data/lib/gui_designer/gui_generic_commands.ui +342 -342
- data/lib/gui_designer/gui_generic_export.ui +202 -202
- data/lib/gui_designer/gui_generic_import.ui +165 -165
- data/lib/gui_designer/gui_i2c_command.ui +148 -148
- data/lib/gui_designer/gui_i2c_settings.ui +292 -292
- data/lib/gui_designer/gui_import.ui +168 -168
- data/lib/gui_designer/gui_parallel_settings.ui +247 -247
- data/lib/gui_designer/gui_progress_bar.ui +86 -86
- data/lib/gui_designer/gui_signal_mapper.ui +179 -179
- data/lib/gui_designer/gui_signal_scanner.ui +261 -261
- data/lib/gui_designer/gui_spi_settings.ui +446 -446
- data/lib/gui_designer/gui_spi_sniffer.ui +156 -156
- data/lib/gui_designer/gui_swd_settings.ui +189 -189
- data/lib/gui_designer/gui_uart_baudrate.ui +161 -161
- data/lib/gui_designer/gui_uart_console.ui +284 -284
- data/lib/gui_designer/gui_uart_settings.ui +280 -280
- data/lib/gui_designer/gui_wire_helper.ui +117 -117
- data/lib/images/search.png +0 -0
- data/lib/logs/error.log +0 -63
- data/lib/models/bus.rb +19 -19
- data/lib/models/byte.rb +29 -29
- data/lib/models/chip.rb +41 -41
- data/lib/models/chip_type.rb +14 -14
- data/lib/models/command.rb +20 -20
- data/lib/models/i2c_setting.rb +41 -41
- data/lib/models/manufacturer.rb +14 -14
- data/lib/models/package.rb +26 -26
- data/lib/models/parallel_setting.rb +37 -37
- data/lib/models/pin.rb +14 -14
- data/lib/models/signall.rb +20 -20
- data/lib/models/spi_setting.rb +67 -67
- data/lib/models/swd_setting.rb +25 -25
- data/lib/models/uart_setting.rb +52 -52
- data/lib/models/use.rb +6 -6
- data/lib/startHardsploit.rb +10 -10
- 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
|