hardsploit_gui 2.2 → 2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/bin/hardsploit_gui +2 -2
  3. data/lib/{Firmware → Firmwares}/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
  4. data/lib/{Firmware/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd → Firmwares/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd} +0 -0
  5. data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
  6. data/lib/{Firmware/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd → Firmwares/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd} +0 -0
  7. data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
  8. data/lib/{Firmware → Firmwares}/FPGA/TEST/TEST_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_TEST_INTERACT.rpd +0 -0
  9. data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
  10. data/lib/{Firmware → Firmwares}/FPGA/VersionFPGA.rb +1 -1
  11. data/lib/{Firmware → Firmwares}/UC/HARDSPLOIT_FIRMWARE_UC.bin +0 -0
  12. data/lib/{Firmware → Firmwares}/UC/VersionUC.rb +1 -1
  13. data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -0
  14. data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -0
  15. data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -0
  16. data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -0
  17. data/lib/HardsploitAPI/{HardsploitAPI_PROGRESS.rb → Core/HardsploitAPI_PROGRESS.rb} +0 -0
  18. data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -0
  19. data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -0
  20. data/lib/HardsploitAPI/{HardsploitAPI_NO_MUX_PARALLELE_MEMORY.rb → Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb} +26 -49
  21. data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -0
  22. data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -0
  23. data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -0
  24. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -0
  25. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -0
  26. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -0
  27. data/lib/HardsploitAPI/{SWD → Modules/SWD}/HardsploitAPI_SWD_STM32.rb +32 -15
  28. data/lib/HardsploitAPI/{HardsploitAPI_TEST_INTERACT.rb → Modules/TEST/HardsploitAPI_TEST_INTERACT.rb} +1 -1
  29. data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -0
  30. data/lib/Hardsploit_gui.rb +96 -0
  31. data/lib/class/Chip_editor.rb +186 -330
  32. data/lib/class/Chip_management.rb +496 -0
  33. data/lib/class/Command_editor.rb +130 -182
  34. data/lib/class/Command_table.rb +16 -22
  35. data/lib/class/Console.rb +0 -2
  36. data/lib/class/ErrorMsg.rb +312 -0
  37. data/lib/class/Export.rb +140 -0
  38. data/lib/class/Export_manager.rb +43 -43
  39. data/lib/class/Firmware.rb +52 -11
  40. data/lib/class/Generic_commands.rb +180 -190
  41. data/lib/class/Import.rb +193 -0
  42. data/lib/class/Progress_bar.rb +1 -0
  43. data/lib/class/Signal_mapper.rb +120 -0
  44. data/lib/class/Wire_helper.rb +132 -148
  45. data/lib/class/{I2C → i2c}/I2c_command.rb +16 -13
  46. data/lib/class/i2c/I2c_export.rb +95 -0
  47. data/lib/class/i2c/I2c_import.rb +117 -0
  48. data/lib/class/i2c/I2c_scanner.rb +114 -0
  49. data/lib/class/i2c/I2c_settings.rb +148 -0
  50. data/lib/class/parallel/Parallel_export.rb +118 -0
  51. data/lib/class/parallel/Parallel_import.rb +113 -0
  52. data/lib/class/parallel/Parallel_settings.rb +81 -0
  53. data/lib/class/spi/Spi_export.rb +108 -0
  54. data/lib/class/spi/Spi_import.rb +159 -0
  55. data/lib/class/spi/Spi_settings.rb +108 -0
  56. data/lib/class/spi/Spi_sniffer.rb +101 -0
  57. data/lib/class/swd/Swd.rb +125 -0
  58. data/lib/class/swd/Swd_scanner.rb +121 -0
  59. data/lib/class/swd/Swd_settings.rb +76 -0
  60. data/lib/class/uart/Uart_baudrate.rb +62 -0
  61. data/lib/class/uart/Uart_console.rb +115 -0
  62. data/lib/class/uart/Uart_settings.rb +102 -0
  63. data/lib/db/associations.rb +42 -29
  64. data/lib/db/database.rb +4 -0
  65. data/lib/db/development.sqlite3 +0 -0
  66. data/lib/db/migrate/004_create_manufacturers.rb +13 -0
  67. data/lib/db/migrate/005_create_packages.rb +13 -0
  68. data/lib/db/migrate/006_create_chip_types.rb +11 -0
  69. data/lib/db/migrate/007_create_buses.rb +11 -0
  70. data/lib/db/migrate/008_create_signals.rb +14 -0
  71. data/lib/db/migrate/009_create_chips.rb +25 -0
  72. data/lib/db/migrate/010_create_commands.rb +21 -0
  73. data/lib/db/migrate/011_create_bytes.rb +19 -0
  74. data/lib/db/migrate/012_create_i2c_settings.rb +21 -0
  75. data/lib/db/migrate/013_create_spi_settings.rb +26 -0
  76. data/lib/db/migrate/014_create_parallel_settings.rb +21 -0
  77. data/lib/db/migrate/015_create_pins.rb +19 -0
  78. data/lib/db/migrate/016_create_uses.rb +17 -0
  79. data/lib/db/migrate/017_create_swd_settings.rb +19 -0
  80. data/lib/db/migrate/018_create_uart_settings.rb +22 -0
  81. data/lib/db/schema.rb +157 -0
  82. data/lib/db/seeds.rb +161 -0
  83. data/lib/gui/gui_chip_editor.rb +23 -22
  84. data/lib/gui/gui_chip_management.rb +43 -38
  85. data/lib/gui/gui_command_editor.rb +2 -1
  86. data/lib/gui/gui_export.rb +132 -0
  87. data/lib/gui/gui_generic_commands.rb +69 -31
  88. data/lib/gui/gui_generic_export.rb +18 -2
  89. data/lib/gui/gui_generic_import.rb +18 -2
  90. data/lib/gui/gui_i2c_command.rb +2 -1
  91. data/lib/gui/gui_i2c_settings.rb +2 -2
  92. data/lib/gui/gui_import.rb +131 -0
  93. data/lib/gui/gui_parallel_settings.rb +2 -1
  94. data/lib/gui/gui_progress_bar.rb +2 -1
  95. data/lib/gui/gui_signal_mapper.rb +121 -0
  96. data/lib/gui/gui_signal_scanner.rb +146 -0
  97. data/lib/gui/gui_spi_settings.rb +6 -2
  98. data/lib/gui/gui_spi_sniffer.rb +112 -0
  99. data/lib/gui/gui_swd_settings.rb +166 -0
  100. data/lib/gui/gui_uart_baudrate.rb +114 -0
  101. data/lib/gui/gui_uart_console.rb +164 -0
  102. data/lib/gui/gui_uart_settings.rb +243 -0
  103. data/lib/gui_designer/gui_chip_editor.ui +9 -6
  104. data/lib/gui_designer/gui_chip_management.ui +79 -35
  105. data/lib/gui_designer/gui_command_editor.ui +3 -0
  106. data/lib/gui_designer/gui_export.ui +171 -0
  107. data/lib/gui_designer/gui_generic_commands.ui +274 -190
  108. data/lib/gui_designer/gui_generic_export.ui +24 -1
  109. data/lib/gui_designer/gui_generic_import.ui +25 -2
  110. data/lib/gui_designer/gui_i2c_command.ui +3 -0
  111. data/lib/gui_designer/gui_i2c_settings.ui +2 -2
  112. data/lib/gui_designer/gui_import.ui +168 -0
  113. data/lib/gui_designer/gui_parallel_settings.ui +4 -1
  114. data/lib/gui_designer/gui_progress_bar.ui +3 -0
  115. data/lib/gui_designer/gui_signal_mapper.ui +179 -0
  116. data/lib/gui_designer/gui_signal_scanner.ui +261 -0
  117. data/lib/gui_designer/gui_spi_settings.ui +15 -2
  118. data/lib/gui_designer/gui_spi_sniffer.ui +156 -0
  119. data/lib/gui_designer/gui_swd_settings.ui +189 -0
  120. data/lib/gui_designer/gui_uart_baudrate.ui +161 -0
  121. data/lib/gui_designer/gui_uart_console.ui +284 -0
  122. data/lib/gui_designer/gui_uart_settings.ui +280 -0
  123. data/lib/logs/error.log +63 -0
  124. data/lib/models/bus.rb +19 -0
  125. data/lib/models/byte.rb +29 -0
  126. data/lib/models/chip.rb +41 -0
  127. data/lib/models/chip_type.rb +14 -0
  128. data/lib/models/command.rb +20 -0
  129. data/lib/models/i2c_setting.rb +41 -0
  130. data/lib/models/manufacturer.rb +14 -0
  131. data/lib/models/package.rb +26 -0
  132. data/lib/models/parallel_setting.rb +37 -0
  133. data/lib/models/pin.rb +14 -0
  134. data/lib/models/signall.rb +20 -0
  135. data/lib/models/spi_setting.rb +67 -0
  136. data/lib/models/swd_setting.rb +25 -0
  137. data/lib/models/uart_setting.rb +52 -0
  138. data/lib/models/use.rb +6 -0
  139. data/lib/startHardsploit.rb +2 -2
  140. metadata +106 -41
  141. data/lib/Firmware/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
  142. data/lib/HardsploitAPI/HardsploitAPI.rb +0 -133
  143. data/lib/HardsploitAPI/HardsploitAPI_CONSTANT.rb +0 -145
  144. data/lib/HardsploitAPI/HardsploitAPI_ERROR.rb +0 -38
  145. data/lib/HardsploitAPI/HardsploitAPI_FIRMWARE.rb +0 -311
  146. data/lib/HardsploitAPI/HardsploitAPI_I2C.rb +0 -360
  147. data/lib/HardsploitAPI/HardsploitAPI_SPI.rb +0 -369
  148. data/lib/HardsploitAPI/HardsploitAPI_USB_COMMUNICATION.rb +0 -148
  149. data/lib/HardsploitAPI/LICENSE.txt +0 -674
  150. data/lib/HardsploitAPI/README.md +0 -22
  151. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD.rb +0 -249
  152. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_DEBUG.rb +0 -102
  153. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_MEM_AP.rb +0 -78
  154. data/lib/HardsploitAPI/TRADEMARK +0 -3
  155. data/lib/class/HardsploitGUI.rb +0 -463
  156. data/lib/class/I2C/I2c_export.rb +0 -118
  157. data/lib/class/I2C/I2c_import.rb +0 -79
  158. data/lib/class/I2C/I2c_settings.rb +0 -129
  159. data/lib/class/PARALLEL/Parallel_export.rb +0 -146
  160. data/lib/class/PARALLEL/Parallel_import.rb +0 -88
  161. data/lib/class/PARALLEL/Parallel_settings.rb +0 -102
  162. data/lib/class/SPI/Spi_export.rb +0 -138
  163. data/lib/class/SPI/Spi_import.rb +0 -113
  164. data/lib/class/SPI/Spi_settings.rb +0 -134
  165. data/lib/db/hs.db +0 -0
  166. data/lib/hardsploit.rb +0 -131
@@ -0,0 +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
@@ -0,0 +1,166 @@
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
+ require "benchmark"
10
+ class HardsploitAPI
11
+ public
12
+
13
+ # Obtain the number of hardsploit connected to PC
14
+ # Return number
15
+ def self.getNumberOfBoardAvailable
16
+ return LIBUSB::Context.new.devices(:idVendor => 0x0483, :idProduct => 0xFFFF).size
17
+ end
18
+
19
+ # Connect board and get an instance to work with
20
+ # Return USB_STATE
21
+ def connect
22
+ @usb = LIBUSB::Context.new
23
+ @devices = @usb.devices(:idVendor => 0x0483, :idProduct => 0xFFFF)
24
+
25
+ if @devices.size == 0 then
26
+ @device = nil
27
+ @dev = nil
28
+ raise ERROR::HARDSPLOIT_NOT_FOUND
29
+ else
30
+ if @@id >= @devices.size then
31
+ raise ERROR::HARDSPLOIT_NOT_FOUND
32
+ else
33
+ begin
34
+ if @dev == nil then
35
+ @dev = @devices[@@id].open
36
+ if RUBY_PLATFORM=~/linux/i && @dev.kernel_driver_active?(0)
37
+ @dev.detach_kernel_driver(0)
38
+ end
39
+ @dev.claim_interface(0)
40
+ end
41
+ self.startFPGA
42
+ sleep(0.1)
43
+ self.setStatutLed(led:USB_COMMAND::GREEN_LED,state:true);
44
+ rescue
45
+ raise ERROR::USB_ERROR
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ def reconncet
52
+ @usb = LIBUSB::Context.new
53
+ @devices = @usb.devices(:idVendor => 0x0483, :idProduct => 0xFFFF)
54
+ if @devices.size == 0 then
55
+ @device = nil
56
+ @dev = nil
57
+ raise ERROR::HARDSPLOIT_NOT_FOUND
58
+ else
59
+ begin
60
+ @dev = @devices[@@id].open
61
+ if RUBY_PLATFORM=~/linux/i && @dev.kernel_driver_active?(0)
62
+ @dev.detach_kernel_driver(0)
63
+ end
64
+ @dev.claim_interface(0)
65
+ self.startFPGA
66
+ sleep(0.1)
67
+ self.setStatutLed(led:USB_COMMAND::GREEN_LED,state:true);
68
+
69
+ rescue
70
+ raise ERROR::USB_ERROR
71
+ end
72
+ end
73
+ end
74
+
75
+ # Obtain low byte of a word
76
+ # * +word+:: 16 bit word
77
+ # Return low byte of the word
78
+ def self.lowByte(word:)
79
+ return word & 0xFF
80
+ end
81
+
82
+ # Obtain high byte of a word
83
+ # * +word+:: 16 bit word
84
+ # Return high byte of the word
85
+ def self.highByte(word:)
86
+ return (word & 0xFF00) >> 8
87
+ end
88
+
89
+ # Obtain high byte of a word
90
+ # * +lByte+:: low byte
91
+ # * +hByte+:: high byte
92
+ # Return 16 bits integer concatenate with low and high bytes
93
+ def self.BytesToInt(lByte:,hByte:)
94
+ return (lByte + (hByte<<8))
95
+ end
96
+
97
+
98
+ # Send data and wait to receive response
99
+ # * +packet_send+:: array of byte
100
+ # * +timeout+:: timeout to read response (ms)
101
+ # Return USB_STATE or array with response (improve soon with exception)
102
+ def sendAndReceiveDATA(packet_send,timeout)
103
+ time = Time.new
104
+ begin
105
+ sendPacket(packet_send)
106
+ received_data = @dev.bulk_transfer(:endpoint=>IN_ENDPOINT, :dataIn=>USB::USB_TRAME_SIZE, :timeout=>timeout)
107
+ consoleSpeed "RECEIVE #{((received_data.bytes.to_a.size/(Time.new-time))).round(2)}Bytes/s #{(received_data.bytes.to_a.size)}Bytes in #{(Time.new-time).round(4)} s"
108
+ return received_data.bytes.to_a
109
+ rescue LIBUSB::ERROR_NO_DEVICE
110
+ raise ERROR::HARDSPLOIT_NOT_FOUND
111
+ rescue
112
+ raise ERROR::USB_ERROR
113
+ end
114
+ end
115
+
116
+ # Wait to receive data
117
+ # * +timeout+:: timeout to read response (ms)
118
+ # Return USB_STATE or array with response (improve soon with exception)
119
+ def receiveDATA(timeout)
120
+ begin
121
+ received_data = @dev.bulk_transfer(:endpoint=>IN_ENDPOINT, :dataIn=>USB::USB_TRAME_SIZE, :timeout=>timeout)
122
+ return received_data
123
+ rescue LIBUSB::ERROR_NO_DEVICE
124
+ raise ERROR::USB_ERROR
125
+ rescue LIBUSB::ERROR_NO_DEVICE
126
+ raise ERROR::HARDSPLOIT_NOT_FOUND
127
+ end
128
+ end
129
+
130
+ # Send USB packet
131
+ # * +packet+:: array with bytes
132
+ # Return number of byte sent
133
+ def sendPacket(packet_send)
134
+
135
+ begin
136
+ if packet_send.size <= 8191 then
137
+
138
+ packet_send[0] = HardsploitAPI.lowByte(word:packet_send.size)
139
+ packet_send[1] = HardsploitAPI.highByte(word:packet_send.size)
140
+
141
+ #if a multiple of packet size add a value to explicit the end of trame
142
+ if packet_send.size % 64 ==0 then
143
+ packet_send.push 0
144
+ end
145
+
146
+ number_of_data_send = 0
147
+ time = Benchmark.realtime do
148
+ number_of_data_send = @dev.bulk_transfer(:endpoint=>OUT_ENDPOINT, :dataOut=>packet_send.pack('c*'),:timeout=>3000)
149
+ end
150
+ consoleSpeed "SEND #{((number_of_data_send/time)).round(2)}Bytes/s SEND #{(number_of_data_send)}Bytes in #{time.round(4)} s"
151
+ if number_of_data_send == packet_send.size then
152
+ return number_of_data_send
153
+ else
154
+ raise ERROR::USB_ERROR
155
+ end
156
+ else
157
+ raise ERROR::USB_ERROR
158
+ end
159
+ rescue LIBUSB::ERROR_NO_DEVICE
160
+ #TRY TO RECONNECT maybe error due to disconnecting and reconnecting board
161
+ reconncet
162
+ rescue
163
+ raise ERROR::USB_ERROR
164
+ end
165
+ end
166
+ end