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,133 +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
- require 'libusb'
10
- require_relative 'HardsploitAPI_CONSTANT'
11
- require_relative 'HardsploitAPI_USB_COMMUNICATION'
12
- require_relative 'HardsploitAPI_FIRMWARE'
13
- require_relative 'HardsploitAPI_NO_MUX_PARALLELE_MEMORY'
14
- require_relative 'HardsploitAPI_I2C'
15
- require_relative 'HardsploitAPI_SPI'
16
- require_relative 'HardsploitAPI_TEST_INTERACT'
17
- require_relative 'SWD/HardsploitAPI_SWD'
18
- require_relative 'HardsploitAPI_ERROR'
19
-
20
- require 'thread'
21
-
22
- class HardsploitAPI
23
- public
24
-
25
- attr_accessor :dev
26
-
27
- include USB
28
- include USB_STATE
29
- include USB_COMMAND
30
-
31
- # Initialize the HARDSPLOIT API
32
- # * +callbackData+:: callback to return data for dump function
33
- # * +callbackInfo+:: callback to get back general information
34
- # * +callbackError+:: callback not used for the moment and transform into progressCallback soon
35
- # * +callbackSpeedOfTransfert+:: callback to get back +information about speed+
36
- def initialize(*args)
37
- parametters = HardsploitAPI.checkParametters(["callbackData","callbackInfo","callbackProgress","callbackSpeedOfTransfert"],args)
38
- @callbackData = parametters[:callbackData]
39
- @callbackInfo = parametters[:callbackInfo]
40
- @callbackProgress = parametters[:callbackProgress]
41
- @callbackSpeedOfTransfert = parametters[:callbackSpeedOfTransfert]
42
-
43
- @packet_send = Array.new
44
- @usb = LIBUSB::Context.new
45
- @device = nil
46
- end
47
-
48
- # Set custom value to wiring led
49
- # * +value+:: 64 bits (8x8 Bytes) values to represent led (PortH PortG PortF PortE PortD PortC PortB PortA)
50
- def setWiringLeds(*args)
51
- parametters = HardsploitAPI.checkParametters(["value"],args)
52
- val = parametters[:value]
53
-
54
- packet = Array.new
55
- packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
56
- packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
57
- packet.push HardsploitAPI.lowByte(USB_COMMAND::FPGA_COMMAND)
58
- packet.push HardsploitAPI.highByte(USB_COMMAND::FPGA_COMMAND)
59
-
60
- packet.push 0x23 #Command SPI write wiring led
61
-
62
- packet.push HardsploitAPI.reverseBit((val & 0x00000000000000FF) >> 0)
63
- packet.push HardsploitAPI.reverseBit((val & 0x000000000000FF00) >> 8 )
64
- packet.push HardsploitAPI.reverseBit((val & 0x0000000000FF0000) >> 16 )
65
- packet.push HardsploitAPI.reverseBit((val & 0x00000000FF000000) >> 24 )
66
- packet.push HardsploitAPI.reverseBit((val & 0x000000FF00000000) >> 32 )
67
- packet.push HardsploitAPI.reverseBit((val & 0x0000FF0000000000) >> 40 )
68
- packet.push HardsploitAPI.reverseBit((val & 0x00FF000000000000) >> 48 )
69
- packet.push HardsploitAPI.reverseBit((val & 0xFF00000000000000) >> 56 )
70
-
71
- return self.sendPacket(packet)
72
- end
73
-
74
- # Obtaint the version number of the board
75
- def getVersionNumber
76
- packet = Array.new
77
- packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
78
- packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
79
- packet.push HardsploitAPI.lowByte(USB_COMMAND::GET_VERSION_NUMBER)
80
- packet.push HardsploitAPI.highByte(USB_COMMAND::GET_VERSION_NUMBER)
81
-
82
- #remove header
83
- version_number = sendAndReceiveDATA(packet,1000).drop(4)
84
- if version_number.size < 20 then #if size more thant 20 char error when reading version number
85
- return version_number.pack('U*')
86
- else
87
- return "BAD VERSION NUMBER"
88
- end
89
-
90
- end
91
-
92
- def self.reverseBit(byte)
93
- return byte.to_s(2).rjust(8, "0").reverse.to_i(2)
94
- end
95
-
96
- def self.checkParametters(arr_parametters,*args)
97
- params = Hash.new
98
- if args[0][0].class == Hash then
99
- hash_args = args[0][0]
100
- arr_parametters.each do |param|
101
- if hash_args[param.to_sym] == nil then
102
- raise "Wrong parametters, you need to specify #{param.to_sym}"
103
- else
104
- params[param.to_sym] = hash_args[param.to_sym]
105
- end
106
- end
107
- else
108
- if args[0].length == arr_parametters.size then
109
- args[0].each_with_index do |value,key|
110
- params[arr_parametters[key].to_sym] = value
111
- end
112
- else
113
- raise "Error : method need #{arr_parametters.size} parametters"
114
- end
115
- end
116
- return params
117
- end
118
-
119
- def consoleProgress(percent:,startTime:,endTime:)
120
- @callbackProgress.call(percent:percent,startTime:startTime,endTime:endTime)
121
- end
122
- def consoleData(value)
123
- @callbackData.call(value)
124
- end
125
- def consoleSpeed(value)
126
- @callbackSpeedOfTransfert.call(value)
127
- end
128
- def consoleInfo(value)
129
- @callbackInfo.call(value)
130
- end
131
-
132
-
133
- end
@@ -1,145 +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
- # Power on the led for each signal specified
13
- # Params:
14
- # +signal+:: Name of signal you want visual help (set the led)
15
- def signalHelpingWiring(*args)
16
- parametters = HardsploitAPI.checkParametters(["signal"],args)
17
- signal = parametters[:signal]
18
-
19
- wires = Hash.new
20
-
21
- #Parallel module
22
- wires["A0"] = 0
23
- wires["A1"] = 1
24
- wires["A2"] = 2
25
- wires["A3"] = 3
26
- wires["A4"] = 4
27
- wires["A5"] = 5
28
- wires["A6"] = 6
29
- wires["A7"] = 7
30
- wires["A8"] = 8
31
- wires["A9"] = 9
32
- wires["A10"] = 10
33
- wires["A11"] = 11
34
- wires["A12"] = 12
35
- wires["A13"] = 13
36
- wires["A14"] = 14
37
- wires["A15"] = 15
38
- wires["A16"] = 16
39
- wires["A17"] = 17
40
- wires["A18"] = 18
41
- wires["A19"] = 19
42
- wires["A20"] = 20
43
- wires["A21"] = 21
44
- wires["A22"] = 22
45
- wires["A23"] = 23
46
- wires["A24"] = 24
47
- wires["A25"] = 25
48
- wires["A26"] = 26
49
- wires["A27"] = 27
50
- wires["A28"] = 28
51
- wires["A29"] = 29
52
- wires["A30"] = 30
53
- wires["A31"] = 31
54
-
55
- wires["D0"] = 32
56
- wires["D1"] = 33
57
- wires["D2"] = 34
58
- wires["D3"] = 35
59
- wires["D4"] = 36
60
- wires["D5"] = 37
61
- wires["D6"] = 38
62
- wires["D7"] = 39
63
- wires["D8"] = 40
64
- wires["D9"] = 41
65
- wires["D10"] = 42
66
- wires["D11"] = 43
67
- wires["D12"] = 44
68
- wires["D13"] = 45
69
- wires["D14"] = 46
70
- wires["D15"] = 47
71
-
72
- wires["RST"] = 48
73
- wires["CE"] = 49
74
- wires["OE"] = 50
75
- wires["WE"] = 51
76
- wires["CLK"] = 52
77
- wires["WP"] = 53
78
- wires["ADV"] = 54
79
-
80
-
81
- #SPI module
82
- wires["CS"] = 0
83
- wires["SPI_CLK"] = 1
84
- wires["MOSI"] = 2
85
- wires["MISO"] = 3
86
-
87
- #I2C module
88
- wires["I2C_CLK"] = 0
89
- wires["SDA"] = 1
90
-
91
- begin
92
- setWiringLeds(2**wires[signal])
93
- rescue Exception => e
94
- raise 'UNKNOWN SIGNAL'
95
- end
96
- end
97
-
98
- module USB_COMMAND
99
- GREEN_LED = 0
100
- RED_LED = 1
101
- LOOPBACK = 2
102
- ERASE_FIRMWARE = 3
103
- WRITE_PAGE_FIRMWARE = 4
104
- READ_PAGE_FIRMWARE = 5
105
- READ_ID_FLASH = 6
106
- START_FPGA = 7
107
- STOP_FPGA = 8
108
- FPGA_COMMAND = 9
109
- FPGA_DATA = 10
110
- STOP_FPGA_DATA = 11
111
- START_FPGA_DATA = 12
112
- GET_SERIAL_NUMBER = 13
113
- GET_VERSION_NUMBER = 14
114
- VCP_ERROR = 0xFFFF
115
- end
116
-
117
- module I2C
118
- KHZ_100 = 0
119
- KHZ_400 = 1
120
- KHZ_1000 = 2
121
- end
122
-
123
- module USB
124
- OUT_ENDPOINT = 0X02
125
- IN_ENDPOINT = 0X81
126
- USB_TRAME_SIZE = 8191
127
- end
128
- module VERSION
129
- API = "1.2.1"
130
- end
131
- module USB_STATE
132
- public
133
- UNKNOWN_STATE = -2
134
- BUSY = -1
135
- NOT_CONNECTED = 0
136
- CONNECTED = 1
137
- UNKNOWN_CONNECTED = 2
138
- SUCCESSFUL_SEND = 3
139
- PACKET_IS_TOO_LARGE = 4
140
- ERROR_SEND = 5
141
- SUCCESSFUL_RECEIVE = 6
142
- TIMEOUT_RECEIVE = 7
143
-
144
- end
145
- end
@@ -1,38 +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
- module Error
11
- class Standard < StandardError; end
12
-
13
- class FileIssue < Standard
14
- def initialize(msg="Issue with file")
15
- super(msg)
16
- end
17
- end
18
-
19
-
20
- class I2CWrongSpeed < Standard
21
- def initialize(msg="Uknown speed")
22
- super(msg)
23
- end
24
- end
25
-
26
- class WrongStartAddress < Standard
27
- def initialize(msg="Start address can't be negative and not more than size max - 1")
28
- super(msg)
29
- end
30
- end
31
-
32
- class SpiError < Standard
33
- def initialize(msg="Error during SPI processing")
34
- super(msg)
35
- end
36
- end
37
- end
38
- end
@@ -1,311 +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
- # Wait to receive data
13
- # * +pathFirmware+:: path of rpd file (vhdl)
14
- # * +checkFirmware+:: boolean if check is needed (recommended false, in case issue true to check)
15
- # Return true if firmware write == firmware read (slow because read the firmware for check)
16
- def uploadFirmware(*args)
17
- parametters = HardsploitAPI.checkParametters(["pathFirmware","checkFirmware"],args)
18
- pathFirmware = parametters[:pathFirmware]
19
- checkFirmware = parametters[:checkFirmware]
20
-
21
- stopFPGA
22
- eraseFirmware
23
- firmwarewrite = self.writeFirmware(pathFirmware)#return array of bytes write
24
- if checkFirmware == true then
25
- firmwareRead = self.readFirmware(firmwarewrite.length) #return array of bytes read
26
- startFPGA
27
- return (firmwarewrite == firmwareRead)
28
- else
29
- startFPGA
30
- return true
31
- end
32
- end
33
-
34
- def startFPGA
35
- packet = Array.new
36
- packet.push HardsploitAPI.lowByte(4)
37
- packet.push HardsploitAPI.highByte(4)
38
- packet.push HardsploitAPI.lowByte(USB_COMMAND::START_FPGA)
39
- packet.push HardsploitAPI.highByte(USB_COMMAND::START_FPGA)
40
- self.sendPacket(packet)
41
- end
42
- def stopFPGA
43
- packet = Array.new
44
- packet.push HardsploitAPI.lowByte(4)
45
- packet.push HardsploitAPI.highByte(4)
46
- packet.push HardsploitAPI.lowByte(USB_COMMAND::STOP_FPGA)
47
- packet.push HardsploitAPI.highByte(USB_COMMAND::STOP_FPGA)
48
- self.sendPacket(packet)
49
- end
50
-
51
-
52
- protected
53
- def eraseFirmware
54
- usbPacket = Array.new
55
- usbPacket.push HardsploitAPI.lowByte(4) #length of trame
56
- usbPacket.push HardsploitAPI.highByte(4)
57
- usbPacket.push HardsploitAPI.lowByte(USB_COMMAND::ERASE_FIRMWARE)
58
- usbPacket.push HardsploitAPI.highByte(USB_COMMAND::ERASE_FIRMWARE)
59
-
60
- consoleInfo "Start to erase Firmware\n"
61
- t1 = Time.now
62
- received_data = sendAndReceiveDATA(usbPacket,15000)
63
-
64
- case received_data
65
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
66
- return HardsploitAPI::USB_STATE::ERROR_SEND
67
- when HardsploitAPI::USB_STATE::ERROR_SEND
68
- return HardsploitAPI::USB_STATE::ERROR_SEND
69
- when HardsploitAPI::USB_STATE::BUSY
70
- return HardsploitAPI::USB_STATE::ERROR_SEND
71
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
72
- p "TIMEOUT_RECEIVE"
73
- return HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
74
- else
75
- t2 = Time.now
76
- delta = t2 - t1
77
- consoleSpeed "Firmware erased in #{delta.round(4)} sec\n\n"
78
- end
79
- end
80
-
81
- #Just path of file and wait. is a blocking function until firmware has been uploaded
82
- def writeFirmware (file_path)
83
- t1 = Time.now
84
- consoleInfo "Upload firmware in progress\n"
85
-
86
- usbPacket= Array.new
87
- file = File.read(file_path,:encoding => 'iso-8859-1').unpack('C*') #string to array byte
88
- #file = file.drop(168) #remove header of pof file
89
- #file.pop(52+355000) #remove footer of pof file + about 355k of unused memory
90
-
91
- consoleInfo "FIRMARE Write #{file.size} bytes\n"
92
-
93
- #firmwareFile = file.clone #copy the file in other variable to return it not just egal because copy pointer and after is the same array we want a copy -> clone
94
-
95
- nbFullPage = file.size/256
96
- nbLastByte = file.size%256
97
-
98
- nbFullPacket = nbFullPage/31
99
- nbLastPagePacket = nbFullPage%31
100
-
101
- #complete last page with the last alone byte ( without full page)
102
- if nbLastByte > 0 then
103
- for i in 0.. (256-nbLastByte)
104
- file.push 0xFF
105
- end
106
- nbFullPage = nbFullPage+1
107
- nbLastByte = 0
108
-
109
- #recalculating packet after complete half page to a full page
110
- nbFullPacket = nbFullPage/31
111
- nbLastPagePacket = nbFullPage%31
112
- end
113
-
114
- consoleInfo "REAL Write #{file.size} bytes\n"
115
-
116
- #Now only full page but maybe a half packet
117
- #Prepare the full packet (31 pages of 256 byte each)
118
- for ipacket in 0..nbFullPacket-1
119
- usbPacket= Array.new
120
- usbPacket.push 0 #lenght of trame modify by sendUSBPacket
121
- usbPacket.push 0
122
- usbPacket.push HardsploitAPI.lowByte(USB_COMMAND::WRITE_PAGE_FIRMWARE)
123
- usbPacket.push HardsploitAPI.highByte(USB_COMMAND::WRITE_PAGE_FIRMWARE)
124
- usbPacket.push HardsploitAPI.lowByte((ipacket)*31) # low byte Nb of the first page
125
- usbPacket.push HardsploitAPI.highByte((ipacket)*31) # high byte Nb of the first page
126
- usbPacket.push 31 #Nb of pages sent
127
-
128
- start = (ipacket)*31*256
129
- stop = (ipacket+1)*31*256 -1 #array start at index = 0
130
-
131
- for iFile in start..stop
132
- usbPacket.push HardsploitAPI.reverseBit(file[iFile])
133
- #usbPacket.push file[iFile]
134
- end
135
-
136
- percent = ipacket *100 / (nbFullPacket-1)
137
-
138
- case self.sendPacket(usbPacket)
139
- when USB_STATE::SUCCESSFUL_SEND
140
- consoleSpeed "UPLOAD AT : #{ipacket} / #{(nbFullPacket-1)} (#{percent}) %\n"
141
- when USB_STATE::PACKET_IS_TOO_LARGE
142
- return USB_STATE::PACKET_IS_TOO_LARGE
143
- when USB_STATE::ERROR_SEND
144
- return USB_STATE::ERROR_SEND
145
- else
146
- return USB_STATE::ERROR_SEND
147
- end
148
- end
149
-
150
- #Prepare the last packet with the rest of data
151
- if nbLastPagePacket >0 then
152
- usbPacket= Array.new
153
- usbPacket.push 0 #lenght of trame modify by sendUSBPacket
154
- usbPacket.push 0
155
- usbPacket.push HardsploitAPI.lowByte(USB_COMMAND::WRITE_PAGE_FIRMWARE)
156
- usbPacket.push HardsploitAPI.highByte(USB_COMMAND::WRITE_PAGE_FIRMWARE)
157
-
158
- if nbFullPacket == 0 then
159
- usbPacket.push HardsploitAPI.lowByte((nbFullPacket)*31) # low byte Nb of the first page
160
- usbPacket.push HardsploitAPI.highByte((nbFullPacket)*31) # high byte Nb of the first page
161
- else
162
- usbPacket.push HardsploitAPI.lowByte((nbFullPacket)*31 + 1 ) # low byte Nb of the first page
163
- usbPacket.push HardsploitAPI.highByte((nbFullPacket)*31+ 1 ) # high byte Nb of the first page
164
- end
165
-
166
- usbPacket.push nbLastPagePacket # nb of page < 31
167
-
168
- start = (nbFullPacket)*31*256
169
- stop = (nbFullPacket)*31*256 + nbLastPagePacket*256 -1
170
-
171
- for iFile in start..stop
172
- #inverted LSB MSB
173
- usbPacket.push HardsploitAPI.reverseBit(file[iFile])
174
- end
175
-
176
- case self.sendPacket(usbPacket)
177
- when USB_STATE::SUCCESSFUL_SEND
178
- consoleSpeed "UPLOAD AT : 100 %\n"
179
- when USB_STATE::PACKET_IS_TOO_LARGE
180
- return USB_STATE::PACKET_IS_TOO_LARGE
181
- when USB_STATE::ERROR_SEND
182
- return USB_STATE::ERROR_SEND
183
- else
184
- return USB_STATE::ERROR_SEND
185
- end
186
- end
187
-
188
- t2 = Time.now
189
- delta = t2 - t1
190
- consoleSpeed "FIRMWARE WAS WRITTEN in #{delta.round(4)} sec\n"
191
- return file
192
- end
193
-
194
-
195
- #Read firmware
196
- def readFirmware(size)
197
- consoleSpeed "START READ FIRMWARE \n"
198
- readFirmware = Array.new
199
- t1 = Time.now
200
-
201
- nbFullPage = size/256
202
- nbLastByte = size%256
203
-
204
-
205
- nbFullPacket = nbFullPage/31
206
- nbLastPagePacket = nbFullPage%31
207
-
208
- if nbLastByte > 0 then
209
- nbSuppressBytesAtLast = 256-nbLastByte
210
-
211
- nbFullPage = nbFullPage+1
212
- nbLastByte = 0
213
-
214
- nbFullPacket = nbFullPage/31
215
- nbLastPagePacket = nbFullPage%31
216
- else
217
- nbSuppressBytesAtLast = 0
218
-
219
- end
220
-
221
- for ipacket in 0..nbFullPacket-1
222
- usbPacket= Array.new
223
- usbPacket.push 7
224
- usbPacket.push 0
225
- usbPacket.push HardsploitAPI.lowByte(USB_COMMAND::READ_PAGE_FIRMWARE)
226
- usbPacket.push HardsploitAPI.highByte(USB_COMMAND::READ_PAGE_FIRMWARE)
227
- usbPacket.push HardsploitAPI.lowByte((ipacket)*31) # low byte Nb of the first page
228
- usbPacket.push HardsploitAPI.highByte((ipacket)*31) # high byte Nb of the first page
229
- usbPacket.push 31 # nb of page max 31 per packet
230
-
231
- received_data = sendAndReceiveDATA(usbPacket,3000)
232
- #p received_data
233
- case received_data
234
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
235
- return HardsploitAPI::USB_STATE::ERROR_SEND
236
- when HardsploitAPI::USB_STATE::ERROR_SEND
237
- return HardsploitAPI::USB_STATE::ERROR_SEND
238
- when HardsploitAPI::USB_STATE::BUSY
239
- return HardsploitAPI::USB_STATE::ERROR_SEND
240
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
241
- return HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
242
- else
243
- #remove header
244
- received_data = received_data.drop(7)
245
-
246
- #reverse byte
247
- received_data = received_data.collect {|x| HardsploitAPI.reverseBit(x) }
248
-
249
- readFirmware.push *received_data
250
-
251
- if nbFullPacket == 1 then
252
- consoleSpeed "READ AT : 1 / 2 50 %\n"
253
- else
254
- percent = ipacket *100 / (nbFullPacket-1)
255
- consoleSpeed "READ AT : #{ipacket} / #{(nbFullPacket-1)} (#{percent} %) \n"
256
- end
257
-
258
- end
259
- end
260
-
261
-
262
-
263
- #Prepare the last packet with the rest of data
264
- if nbLastPagePacket >0 then
265
- usbPacket= Array.new
266
- usbPacket.push 7
267
- usbPacket.push 0
268
- usbPacket.push HardsploitAPI.lowByte(USB_COMMAND::READ_PAGE_FIRMWARE)
269
- usbPacket.push HardsploitAPI.highByte(USB_COMMAND::READ_PAGE_FIRMWARE)
270
-
271
- #Increase nb of page to add the last byte
272
- if nbFullPacket == 0 then
273
- usbPacket.push HardsploitAPI.lowByte((nbFullPacket)*31) # low byte Nb of the first page
274
- usbPacket.push HardsploitAPI.highByte((nbFullPacket)*31) # high byte Nb of the first page
275
- else
276
- usbPacket.push HardsploitAPI.lowByte((nbFullPacket)*31 + 1 ) # low byte Nb of the first page
277
- usbPacket.push HardsploitAPI.highByte((nbFullPacket)*31+ 1 ) # high byte Nb of the first page
278
- end
279
-
280
- usbPacket.push nbLastPagePacket
281
- received_data = sendAndReceiveDATA(usbPacket,15000)
282
- case received_data
283
- when HardsploitAPI::USB_STATE::PACKET_IS_TOO_LARGE
284
- return HardsploitAPI::USB_STATE::ERROR_SEND
285
- when HardsploitAPI::USB_STATE::ERROR_SEND
286
- return HardsploitAPI::USB_STATE::ERROR_SEND
287
- when HardsploitAPI::USB_STATE::BUSY
288
- return HardsploitAPI::USB_STATE::ERROR_SEND
289
- when HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
290
- return HardsploitAPI::USB_STATE::TIMEOUT_RECEIVE
291
- else
292
- #remove header
293
- received_data = received_data.drop(7)
294
-
295
- #reverse byte
296
- received_data = received_data.collect {|x| HardsploitAPI.reverseBit(x) }
297
- readFirmware.push *received_data
298
-
299
- consoleSpeed "READ AT 100%\n"
300
- end
301
- end
302
-
303
- #remove a fake byte at last of reading just for transmiting
304
- readFirmware.pop(nbSuppressBytesAtLast)
305
-
306
- t2 = Time.now
307
- delta = t2 - t1
308
- consoleSpeed "READ FIRMWARE FINISH in #{delta.round(4)} sec\n"
309
- return readFirmware
310
- end
311
- end