hardsploit_gui 2.2 → 2.3

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 (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