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