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
@@ -1,360 +0,0 @@
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
- # Interact with I2C bus
12
- # * +speed+:: I2C::KHZ_100 , I2C::KHZ_400 , I2C::KHZ_1000
13
- # * +payload+:: payload to send
14
- def i2c_Interact(*args)
15
- parametters = HardsploitAPI.checkParametters(["speed","payload"],args)
16
- speed = parametters[:speed]
17
- payload = parametters[:payload]
18
-
19
- if (speed < 0) and (speed >3) then
20
- raise TypeError, 'Speed must be between 0 and 3'
21
- end
22
-
23
- if (payload.size > 4000) then
24
- raise TypeError, 'Size of the data need to be less than 4000'
25
- end
26
-
27
- packet = Array.new
28
- packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
29
- packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
30
- packet.push HardsploitAPI.lowByte(USB_COMMAND::FPGA_COMMAND)
31
- packet.push HardsploitAPI.highByte(USB_COMMAND::FPGA_COMMAND)
32
-
33
- packet.push 0x50 #Command RAW COMMUNICATION TO FPGA FIFO
34
-
35
- packet.push speed #Add speed
36
- packet.concat payload #Add data
37
-
38
- sendPacket packet
39
-
40
- tmp= receiveDATA(2000)
41
- case tmp
42
- when HardsploitAPI::USB_STATE::BUSY
43
- return USB_STATE::BUSY
44
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
45
- return USB_STATE::TIMEOUT_RECEIVE
46
- else
47
- #remove header (4 bytes 2 for size 2 for type of command)
48
- return tmp.bytes.drop(4)
49
- end
50
- end
51
-
52
- # Start I2C scan to find addresses
53
- # * +speed+:: I2C::KHZ_100 , I2C::KHZ_400 , I2C::KHZ_1000
54
- # * Return An array 256 value for each addresse if 0 not present if 1 present
55
- def i2c_Scan(*args)
56
- parametters = HardsploitAPI.checkParametters(["speed"],args)
57
- speed = parametters[:speed]
58
-
59
- if (speed < 0) and (speed >3) then
60
- raise TypeError, 'Speed must be between 0 and 3'
61
- end
62
-
63
- array_i2c_scan = Array.new
64
- result_scan = Array.new
65
- return_scan = Array.new
66
-
67
- #we want scan just read address it is a partial scan (fastest)
68
- for i in (1..255).step(2) do
69
- array_i2c_scan.push HardsploitAPI.lowByte(1) #Count Low Byte
70
- array_i2c_scan.push HardsploitAPI.highByte(1) #Count High Byte
71
- array_i2c_scan.push i
72
- end
73
-
74
- result_scan = i2c_Interact(speed,array_i2c_scan)
75
- if result_scan.size != 256 then
76
- raise TypeError, "FPGA send a wrong I2C scan result, try again , check power jumper, fix wiring , power on ? (reboot the board if needed)"
77
- end
78
-
79
- for i in (0..result_scan.size-1).step(2) do
80
- #Check if ACK_ERROR
81
- if result_scan[i] == 1 then
82
- return_scan.push 1 #For write
83
- return_scan.push 1 #For read
84
- else
85
- return_scan.push 0 #For write
86
- return_scan.push 0 #For read
87
- end
88
- end
89
- return return_scan
90
- end
91
-
92
- # Interact with I2C bus
93
- # * +speed+:: I2C::KHZ_100 , I2C::KHZ_400 , I2C::KHZ_1000
94
- # * +i2cBaseAddress+:: I2C base address / Write address (8bits)
95
- # * +startAddress+:: Start address (included)
96
- # * +stopAddress+:: Stop address (included)
97
- # * +sizeMax+:: Size max of memory (important to calculate automaticly the number of byte to set address)
98
- def i2c_Generic_Dump (*args)
99
- parametters = HardsploitAPI.checkParametters(["speed","i2cBaseAddress","startAddress","stopAddress","sizeMax"],args)
100
- speed = parametters[:speed]
101
- i2cBaseAddress = parametters[:i2cBaseAddress]
102
- startAddress = parametters[:startAddress]
103
- stopAddress = parametters[:stopAddress]
104
- sizeMax = parametters[:sizeMax]
105
-
106
- if ((startAddress < 0) or (startAddress > sizeMax-1)) then
107
- raise TypeError, "Start address can't be negative and not more than size max - 1"
108
- end
109
- if ((stopAddress < 0) or (stopAddress > (sizeMax-1))) then
110
- raise TypeError, "Stop address can't be negative and not more than size max-1 because start at 0"
111
- end
112
-
113
- if (stopAddress <= startAddress) then
114
- raise TypeError, "Stop address need to be greater than start address"
115
- end
116
-
117
- numberOfByteAddress = (((Math.log(sizeMax-1,2)).floor + 1) / 8.0).ceil
118
- if numberOfByteAddress > 4 then
119
- raise TypeError, "Size max must be less than 2^32 about 4Gb"
120
- end
121
-
122
- if numberOfByteAddress <= 0 then
123
- raise TypeError, "There is an issue with calculating of number of byte needed"
124
- end
125
- startTime = Time.now
126
- packet_size = 2000 - numberOfByteAddress - 1
127
- number_complet_packet = ( (stopAddress-startAddress+1) / packet_size).floor
128
- size_last_packet = (stopAddress-startAddress+1) % packet_size
129
-
130
- #SEND the first complete trame
131
- for i in 0..number_complet_packet-1 do
132
- packet = generate_i2c_read_command i2cBaseAddress,numberOfByteAddress+startAddress,i*packet_size,packet_size
133
- temp = i2c_Interact(speed,packet)
134
- case temp
135
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
136
- puts "PACKET_IS_TOO_LARGE max: #{HardsploitAPI::USB::USB_TRAME_SIZE}"
137
- when HardsploitAPI::USB_STATE::ERROR_SEND
138
- puts "ERROR_SEND\n"
139
- when HardsploitAPI::USB_STATE::BUSY
140
- puts "BUSY"
141
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
142
- puts "TIMEOUT_RECEIVE\n"
143
- else
144
- #Remove header, result of read command and numberOfByte Address too
145
- consoleData ( process_dump_i2c_result( temp ) )
146
- end
147
-
148
- consoleProgress(percent:100*(i+1)/(number_complet_packet+ (size_last_packet.zero? ? 0 : 1)),startTime:startTime,endTime:Time.new)
149
- end
150
-
151
- if(size_last_packet > 0 )then
152
- packet = generate_i2c_read_command i2cBaseAddress,numberOfByteAddress,number_complet_packet*packet_size+startAddress,size_last_packet
153
- temp = i2c_Interact(speed,packet)
154
- case temp
155
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
156
- puts "PACKET_IS_TOO_LARGE max: #{HardsploitAPI::USB::USB_TRAME_SIZE}"
157
- when HardsploitAPI::USB_STATE::ERROR_SEND
158
- puts "ERROR_SEND\n"
159
- when HardsploitAPI::USB_STATE::BUSY
160
- puts "BUSY"
161
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
162
- puts "TIMEOUT_RECEIVE\n"
163
- else
164
- #Remove header, result of read command and numberOfByte Address too
165
- consoleData ( process_dump_i2c_result ( temp ) )
166
- end
167
- consoleProgress(percent:100,startTime:startTime,endTime:Time.new)
168
- end
169
-
170
- delta = Time.now - startTime
171
- consoleSpeed "Write in #{delta.round(4)} sec"
172
- end
173
-
174
- #For the moment only with EEPROM (not need to erase or activate write)
175
- def i2c_Generic_Import (*args)
176
- parametters = HardsploitAPI.checkParametters(["speed","i2cBaseAddress","startAddress","pageSize","memorySize","dataFile","writePageLatency"],args)
177
- speed = parametters[:speed]
178
- i2cBaseAddress = parametters[:i2cBaseAddress]
179
- startAddress = parametters[:startAddress]
180
- pageSize = parametters[:pageSize]
181
- memorySize = parametters[:memorySize]
182
- dataFile = parametters[:dataFile]
183
- writePageLatency = parametters[:writePageLatency]
184
-
185
- startTime = Time.now
186
- begin
187
- file = File.open(dataFile, 'rb')
188
- sizeFile = file.size
189
- rescue Exception => e
190
- raise Error::FileIssue, e.message
191
- end
192
-
193
- if ((startAddress < 0) or (startAddress > memorySize-1)) then
194
- raise Error::WrongStartAddress
195
- end
196
-
197
- if ((pageSize <= 0) and (pageSize >1024)) then
198
- raise TypeError, "pageSize need to be greater than 0 and less than 1024"
199
- end
200
-
201
- numberOfByteAddress = (((Math.log(memorySize-1,2)).floor + 1) / 8.0).ceil
202
- if numberOfByteAddress > 4 then
203
- raise TypeError, "Size max must be less than 2^32 about 4Gb"
204
- end
205
-
206
- if numberOfByteAddress <= 0 then
207
- raise TypeError, "There is an issue with calculating of number of byte needed"
208
- end
209
-
210
- packet_size = pageSize
211
- number_complet_packet = (sizeFile / packet_size).floor
212
- size_last_packet = sizeFile % packet_size
213
-
214
- #SEND the first complete trame
215
- for i in 0..number_complet_packet-1 do
216
- packet = generate_i2c_write_command i2cBaseAddress,numberOfByteAddress,i*packet_size,file.read(packet_size).unpack("C*")
217
- temp = i2c_Interact(speed,packet)
218
- case temp
219
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
220
- puts "PACKET_IS_TOO_LARGE max: #{HardsploitAPI::USB::USB_TRAME_SIZE}"
221
- when HardsploitAPI::USB_STATE::ERROR_SEND
222
- puts "ERROR_SEND\n"
223
- when HardsploitAPI::USB_STATE::BUSY
224
- puts "BUSY"
225
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
226
- puts "TIMEOUT_RECEIVE\n"
227
- else
228
- #Remove header, result of read command and numberOfByte Address too
229
- process_import_i2c_result( temp )
230
- end
231
-
232
- consoleProgress(percent:100*(i+1)/(number_complet_packet+ (size_last_packet.zero? ? 0 : 1)),startTime:startTime,endTime:Time.new)
233
-
234
- #if too many error when write increase because we need to wait to write a full page
235
- sleep(writePageLatency)
236
- end
237
-
238
- if(size_last_packet > 0 )then
239
- packet = generate_i2c_write_command(i2cBaseAddress,numberOfByteAddress,number_complet_packet*packet_size+startAddress,file.read(size_last_packet).unpack("C*"))
240
- temp = i2c_Interact(speed,packet)
241
- case temp
242
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
243
- puts "PACKET_IS_TOO_LARGE max: #{HardsploitAPI::USB::USB_TRAME_SIZE}"
244
- when HardsploitAPI::USB_STATE::ERROR_SEND
245
- puts "ERROR_SEND\n"
246
- when HardsploitAPI::USB_STATE::BUSY
247
- puts "BUSY"
248
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
249
- puts "TIMEOUT_RECEIVE\n"
250
- else
251
- #Remove header, result of read command and numberOfByte Address too
252
- process_import_i2c_result ( temp )
253
- end
254
- consoleProgress(percent:100,startTime:startTime,endTime:Time.new)
255
- end
256
-
257
- delta = Time.now - startTime
258
- consoleSpeed "Write in #{delta.round(4)} sec"
259
- end
260
-
261
- private
262
-
263
- def process_import_i2c_result (packet)
264
- result = Array.new
265
- for i in (0..packet.size-1).step(2) do
266
- case packet[i]
267
- when 0 #Write ACK
268
- #Do nothing,don't save write ack
269
- else
270
- raise TypeError, "Error in I2C transaction (NACK), write failed "
271
- end
272
- end
273
- return result
274
- end
275
-
276
-
277
- def process_dump_i2c_result (packet)
278
- result = Array.new
279
- for i in (0..packet.size-1).step(2) do
280
- case packet[i]
281
- when 1 #Read ACK
282
- #Save read data
283
- result.push packet[i+1]
284
- when 0 #Write ACK
285
- #Do nothing,don't save write ack
286
- else
287
- raise TypeError, "Error in I2C transaction, I2C export seems to be wrong"
288
- end
289
- end
290
- return result
291
- end
292
-
293
- def generate_i2c_write_command ( i2cBaseAddress, numberOfByteAddress,startAddress,data)
294
- packet = Array.new
295
- #Push write command
296
- packet.push HardsploitAPI.lowByte(numberOfByteAddress+data.size) #size of write command
297
- packet.push HardsploitAPI.highByte(numberOfByteAddress+data.size) #size of write command
298
-
299
- packet.push i2cBaseAddress #push Write address
300
-
301
- case numberOfByteAddress
302
- when 1
303
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
304
- when 2
305
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
306
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart
307
- when 3
308
- packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
309
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
310
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
311
- when 4
312
- packet.push ((startAddress & 0xFF000000) >> 24 ) #AddStart3
313
- packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
314
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
315
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
316
- else
317
- raise TypeError, "Issue in generate_i2c_write_command function when parse number of byte address"
318
- end
319
-
320
- #Push data to write
321
- packet.push *data
322
- return packet
323
- end
324
-
325
- def generate_i2c_read_command ( i2cBaseAddress, numberOfByteAddress,startAddress,size)
326
- packet = Array.new
327
- #Push write command for start address
328
- packet.push HardsploitAPI.lowByte(numberOfByteAddress) #size of write command
329
- packet.push HardsploitAPI.highByte(numberOfByteAddress) #size of write command
330
-
331
- packet.push i2cBaseAddress #push Write address
332
-
333
- case numberOfByteAddress
334
- when 1
335
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
336
- when 2
337
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
338
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart
339
- when 3
340
- packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
341
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
342
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
343
- when 4
344
- packet.push ((startAddress & 0xFF000000) >> 24 ) #AddStart3
345
- packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
346
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
347
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
348
- else
349
- raise TypeError, "Issue in generate_spi_read_command function when parse number of byte address"
350
- end
351
-
352
- #Push read command to read size data
353
- packet.push HardsploitAPI.lowByte(size) #size of read command
354
- packet.push HardsploitAPI.highByte(size) #size of read command
355
- packet.push i2cBaseAddress+1 #push read address
356
-
357
- return packet
358
- end
359
-
360
- end
@@ -1,369 +0,0 @@
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
-
12
- # SPI interact
13
- # * +mode+:: SPI mode 0,1,2,3
14
- # * +speed+:: Range 1-255 SPI clock = 150Mhz / (2*speed) tested from 3 to 255 (25Mhz to about 0.3Khz)
15
- # * +payload+:: Byte array want to send
16
- # * Return SPI data received
17
- def spi_Interact(*args)
18
- parametters = HardsploitAPI.checkParametters(["mode","speed","payload"],args)
19
- mode = parametters[:mode]
20
- speed = parametters[:speed]
21
- payload = parametters[:payload]
22
-
23
- if (mode < 0) and (mode >3) then
24
- raise TypeError, 'Mode must be between 0 and 3'
25
- end
26
- if (speed <= 2) and (speed >256) then
27
- raise TypeError, 'Speed must be between 3 and 255'
28
- end
29
-
30
- if (payload.size > 4000) then
31
- raise TypeError, 'Size of the data need to be less than 4000'
32
- end
33
-
34
- packet = Array.new
35
- packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
36
- packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
37
- packet.push HardsploitAPI.lowByte(USB_COMMAND::FPGA_COMMAND)
38
- packet.push HardsploitAPI.highByte(USB_COMMAND::FPGA_COMMAND)
39
-
40
- packet.push 0x50 #Command RAW COMMUNICATION TO FPGA FIFO
41
-
42
- packet.push mode #Add mode
43
- packet.push speed #Add speed
44
- packet.concat payload #Add data
45
-
46
- sendPacket packet
47
-
48
- tmp= receiveDATA(1000)
49
- case tmp
50
- when HardsploitAPI::USB_STATE::BUSY
51
- return USB_STATE::BUSY
52
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
53
- return USB_STATE::TIMEOUT_RECEIVE
54
- else
55
- #remove header (4 bytes 2 for size 2 for type of command)
56
- return tmp.bytes.drop(4)
57
- end
58
- end
59
-
60
-
61
- # Spi generic Import
62
- # * +mode+:: SPI mode 0,1,2,3
63
- # * +speed+:: Range 1-255 SPI clock = 150Mhz / (2*speed) tested from 3 to 255 (25Mhz to about 0.3Khz)
64
- # * +writeSpiCommand+:: The write command
65
- # * +startAddress+:: Start address (included)
66
- # * +pageSize+:: Size of page
67
- # * +memorySize+:: Size max of memory in byte (important, to calculate automatically the number of byte to set address)
68
- # * +saveFile+:: File contain data
69
- # * +writePageLatency+:: Time to wait after each pages written
70
- # * +enableWriteSpiCommand+:: Enable write commad
71
- # * +clearSpiCommand+:: Bulk erase command
72
- # * +clearChipTime+:: Time to erase entire the memory (bulk erase) in case of flash memory, 240 seconds for a 512Mb spansion memory and 13 seconds for a 16Mb Micron memory, see the datasheet
73
- # * +isFLASH+:: True if it is a Flash memory (add clear content)
74
- def spi_Generic_Import (*args)
75
- parametters = HardsploitAPI.checkParametters(["mode","speed","startAddress","pageSize","memorySize","dataFile","writeSpiCommand","writePageLatency","enableWriteSpiCommand","clearSpiCommand","clearChipTime","isFLASH"],args)
76
- mode = parametters[:mode]
77
- speed = parametters[:speed]
78
- startAddress = parametters[:startAddress]
79
- pageSize = parametters[:pageSize]
80
- memorySize = parametters[:memorySize]
81
- dataFile = parametters[:dataFile]
82
- writePageLatency = parametters[:writePageLatency]
83
-
84
- #most of the time 0x02
85
- writeSpiCommand = parametters[:writeSpiCommand]
86
- writeSpiCommand
87
- #most of the time 0x06
88
- enableWriteSpiCommand = parametters[:enableWriteSpiCommand]
89
-
90
- #most of the time 0x60 chip eraseTime
91
- clearSpiCommand = parametters[:clearWriteSpiCommand]
92
-
93
- # in second
94
- clearChipTime = parametters[:clearChipTime]
95
-
96
- #if flash memory
97
- isFLASH = parametters[:isEEPROM]
98
-
99
- #Start time
100
- startTime = Time.now
101
- begin
102
- file = File.open(dataFile, 'rb')
103
- sizeFile = file.size
104
- rescue Exception => e
105
- raise Error::FileIssue, e.message
106
- end
107
-
108
- if (mode < 0) and (mode >3) then
109
- raise TypeError, 'Mode must be between 0 and 3'
110
- end
111
- if (speed <= 2) and (speed >256) then
112
- raise TypeError, 'Speed must be between 3 and 255'
113
- end
114
-
115
- if ((startAddress < 0) or (startAddress > memorySize-1)) then
116
- raise Error::WrongStartAddress
117
- end
118
-
119
- if ((pageSize <= 0) and (pageSize >2048)) then
120
- raise TypeError, "pageSize need to be greater than 0 and less than 2048"
121
- end
122
-
123
- numberOfByteAddress = (((Math.log(memorySize-1,2)).floor + 1) / 8.0).ceil
124
- if numberOfByteAddress > 4 then
125
- raise TypeError, "Size max must be less than 2^32 about 4Gb"
126
- end
127
-
128
- if numberOfByteAddress <= 0 then
129
- raise TypeError, "There is an issue with calculating of number of byte needed"
130
- end
131
-
132
- #if flash memory we need to erase it before and wait enought
133
- #time (erase cycle time in datasheet) or polling status register
134
- if isFLASH then
135
- spi_Interact(mode:mode,speed:speed,payload:[clearSpiCommand])
136
- sleep(clearChipTime)
137
- end
138
-
139
- startTime = Time.now
140
- packet_size = pageSize
141
- number_complet_packet = (sizeFile / packet_size).floor
142
- size_last_packet = sizeFile % packet_size
143
-
144
- #SEND the first complete trame
145
- for i in 0..number_complet_packet-1 do
146
- #Enable write latch
147
- spi_Interact(mode:mode,speed:speed,payload:[enableWriteSpiCommand])
148
- packet = generate_spi_write_command numberOfByteAddress,writeSpiCommand,i*packet_size+startAddress,file.read(packet_size).unpack("C*")
149
- temp = spi_Interact(mode,speed,packet)
150
- case temp
151
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
152
- puts "PACKET_IS_TOO_LARGE max: #{HardsploitAPI::USB::USB_TRAME_SIZE}"
153
- when HardsploitAPI::USB_STATE::ERROR_SEND
154
- puts "ERROR_SEND\n"
155
- when HardsploitAPI::USB_STATE::BUSY
156
- puts "BUSY"
157
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
158
- puts "TIMEOUT_RECEIVE\n"
159
- else
160
- #Remove header, result of read command and numberOfByte Address too
161
- #consoleData temp.drop(numberOfByteAddress+1)
162
- if packet.size != packet.size then
163
- raise HardsploitAPI::SpiError
164
- end
165
- end
166
-
167
- consoleProgress(percent:100*(i+1)/(number_complet_packet+ (size_last_packet.zero? ? 0 : 1)),startTime:startTime,endTime:Time.new)
168
- #if too many error when write increase because we need to wait to write a full page
169
- sleep(writePageLatency)
170
- end
171
-
172
- if(size_last_packet > 0 )then
173
- #Enable write latch
174
- spi_Interact(mode:mode,speed:speed,payload:[enableWriteSpiCommand])
175
- packet = generate_spi_write_command numberOfByteAddress,writeSpiCommand,number_complet_packet*packet_size+startAddress,file.read(size_last_packet).unpack("C*")
176
- temp = spi_Interact(mode,speed,packet)
177
- case temp
178
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
179
- puts "PACKET_IS_TOO_LARGE max: #{HardsploitAPI::USB::USB_TRAME_SIZE}"
180
- when HardsploitAPI::USB_STATE::ERROR_SEND
181
- puts "ERROR_SEND\n"
182
- when HardsploitAPI::USB_STATE::BUSY
183
- puts "BUSY"
184
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
185
- puts "TIMEOUT_RECEIVE\n"
186
- else
187
- #Remove header, result of write command and numberOfByte Address too
188
- #consoleData temp.drop(numberOfByteAddress+1)
189
- if packet.size != packet.size then
190
- raise HardsploitAPI::SpiError
191
- end
192
- end
193
- #Send 100% in case of last packet
194
- consoleProgress(percent:100,startTime:startTime,endTime:Time.now)
195
- end
196
- delta = Time.now - startTime
197
- consoleSpeed "Write in #{delta.round(4)} sec"
198
- end
199
-
200
-
201
- # Spi generic dump
202
- # * +mode+:: SPI mode 0,1,2,3
203
- # * +speed+:: Range 1-255 SPI clock = 150Mhz / (2*speed) tested from 3 to 255 (25Mhz to about 0.3Khz)
204
- # * +readSpiCommand+:: The read command
205
- # * +startAddress+:: Start address (included)
206
- # * +stopAddress+:: Stop address (included)
207
- # * +sizeMax+:: Size max of memory (important to calculate automaticly the number of byte to set address)
208
- def spi_Generic_Dump (*args)
209
- parametters = HardsploitAPI.checkParametters(["mode","speed","readSpiCommand","startAddress","stopAddress","sizeMax"],args)
210
- mode = parametters[:mode]
211
- speed = parametters[:speed]
212
- readSpiCommand = parametters[:readSpiCommand]
213
- startAddress = parametters[:startAddress]
214
- stopAddress = parametters[:stopAddress]
215
- sizeMax = parametters[:sizeMax]
216
-
217
-
218
- if (mode < 0) and (mode >3) then
219
- raise TypeError, 'Mode must be between 0 and 3'
220
- end
221
- if (speed <= 2) and (speed >256) then
222
- raise TypeError, 'Speed must be between 3 and 255'
223
- end
224
-
225
- if ((startAddress < 0) or (startAddress > sizeMax-1)) then
226
- raise TypeError, "Start address can't be negative and not more than size max - 1"
227
- end
228
- if ((stopAddress < 0) or (stopAddress > (sizeMax-1))) then
229
- raise TypeError, "Stop address can't be negative and not more than size max-1 because start at 0"
230
- end
231
-
232
- if (stopAddress < startAddress) then
233
- raise TypeError, "Stop address need to be greater than start address"
234
- end
235
-
236
- numberOfByteAddress = (((Math.log(sizeMax-1,2)).floor + 1) / 8.0).ceil
237
- if numberOfByteAddress > 4 then
238
- raise TypeError, "Size max must be less than 2^32 about 4Gb"
239
- end
240
-
241
- if numberOfByteAddress <= 0 then
242
- raise TypeError, "There is an issue with calculating of number of byte needed"
243
- end
244
-
245
- #Start time
246
- startTime = Time.now
247
- packet_size = 4000 - numberOfByteAddress - 1
248
- number_complet_packet = ( (stopAddress-startAddress+1) / packet_size).floor
249
- size_last_packet = (stopAddress-startAddress+1) % packet_size
250
-
251
- #SEND the first complete trame
252
- for i in 0..number_complet_packet-1 do
253
- packet = generate_spi_read_command numberOfByteAddress,readSpiCommand,i*packet_size+startAddress,packet_size
254
- temp = spi_Interact(mode,speed,packet)
255
- case temp
256
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
257
- puts "PACKET_IS_TOO_LARGE max: #{HardsploitAPI::USB::USB_TRAME_SIZE}"
258
- when HardsploitAPI::USB_STATE::ERROR_SEND
259
- puts "ERROR_SEND\n"
260
- when HardsploitAPI::USB_STATE::BUSY
261
- puts "BUSY"
262
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
263
- puts "TIMEOUT_RECEIVE\n"
264
- else
265
- #Remove header, result of read command and numberOfByte Address too
266
- #puts "receive real size #{temp.size}"
267
- consoleData temp.drop(numberOfByteAddress+1)
268
- end
269
- consoleProgress(percent:100*(i+1)/(number_complet_packet+ (size_last_packet.zero? ? 0 : 1)),startTime:startTime,endTime:Time.new)
270
- end
271
-
272
- if(size_last_packet > 0 )then
273
- packet = generate_spi_read_command numberOfByteAddress,readSpiCommand,number_complet_packet*packet_size+startAddress,size_last_packet
274
- temp = spi_Interact(mode,speed,packet)
275
- case temp
276
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
277
- puts "PACKET_IS_TOO_LARGE max: #{HardsploitAPI::USB::USB_TRAME_SIZE}"
278
- when HardsploitAPI::USB_STATE::ERROR_SEND
279
- puts "ERROR_SEND\n"
280
- when HardsploitAPI::USB_STATE::BUSY
281
- puts "BUSY"
282
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
283
- puts "TIMEOUT_RECEIVE\n"
284
- else
285
- #Remove header, result of read command and numberOfByte Address too
286
- #puts "receive real size #{temp.size}"
287
- consoleData temp.drop(numberOfByteAddress+1)
288
- consoleProgress(percent:100,startTime:startTime,endTime:Time.now)
289
- end
290
- end
291
- delta = Time.now - startTime
292
- consoleSpeed "Write in #{delta.round(4)} sec"
293
- end
294
-
295
- protected
296
- def generate_spi_read_command ( numberOfByteAddress,readSpiCommand,startAddress,size)
297
- packet = Array.new
298
-
299
- #Push read command
300
- packet.push readSpiCommand
301
-
302
- case numberOfByteAddress
303
- when 1
304
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
305
-
306
- when 2
307
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
308
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
309
-
310
- when 3
311
- packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
312
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
313
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
314
-
315
- when 4
316
- packet.push ((startAddress & 0xFF000000) >> 24 ) #AddStart3
317
- packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
318
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
319
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
320
- else
321
- raise TypeError, "Issue in generate_spi_read_command function when parse number of byte address"
322
-
323
- end
324
-
325
- #put N dummy byte to read size data
326
- packet.push *Array.new(size, 0)
327
- if packet.size > 4000 then
328
- raise TypeError, "Too many byte to send in spi mode not more than 4000 is needed"
329
- end
330
-
331
- return packet
332
- end
333
-
334
- def generate_spi_write_command ( numberOfByteAddress,writeSpiCommand,startAddress,data)
335
- packet = Array.new
336
- #Push write command
337
- packet.push writeSpiCommand
338
-
339
- case numberOfByteAddress
340
- when 1
341
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
342
-
343
- when 2
344
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
345
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
346
-
347
- when 3
348
- packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
349
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
350
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
351
-
352
- when 4
353
- packet.push ((startAddress & 0xFF000000) >> 24 ) #AddStart3
354
- packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
355
- packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
356
- packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
357
- else
358
- raise TypeError, "Issue in generate_spi_write_command function when parse number of byte address"
359
- end
360
-
361
- #Push data to write
362
- packet.push *data
363
- if packet.size > 4000 then
364
- raise TypeError, "Too many byte to send in spi mode not more than 4000 is needed"
365
- end
366
-
367
- return packet
368
- end
369
- end