hardsploit_gui 2.2 → 2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/bin/hardsploit_gui +2 -2
  3. data/lib/{Firmware → Firmwares}/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
  4. data/lib/{Firmware/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd → Firmwares/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd} +0 -0
  5. data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
  6. data/lib/{Firmware/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd → Firmwares/FPGA/SPI/SPI_SNIFFER/HARDSPLOIT_FIRMWARE_FPGA_SPI_SNIFFER.rpd} +0 -0
  7. data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
  8. data/lib/{Firmware → Firmwares}/FPGA/TEST/TEST_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_TEST_INTERACT.rpd +0 -0
  9. data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
  10. data/lib/{Firmware → Firmwares}/FPGA/VersionFPGA.rb +1 -1
  11. data/lib/{Firmware → Firmwares}/UC/HARDSPLOIT_FIRMWARE_UC.bin +0 -0
  12. data/lib/{Firmware → Firmwares}/UC/VersionUC.rb +1 -1
  13. data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -0
  14. data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -0
  15. data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -0
  16. data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -0
  17. data/lib/HardsploitAPI/{HardsploitAPI_PROGRESS.rb → Core/HardsploitAPI_PROGRESS.rb} +0 -0
  18. data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -0
  19. data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -0
  20. data/lib/HardsploitAPI/{HardsploitAPI_NO_MUX_PARALLELE_MEMORY.rb → Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb} +26 -49
  21. data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -0
  22. data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -0
  23. data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -0
  24. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -0
  25. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -0
  26. data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -0
  27. data/lib/HardsploitAPI/{SWD → Modules/SWD}/HardsploitAPI_SWD_STM32.rb +32 -15
  28. data/lib/HardsploitAPI/{HardsploitAPI_TEST_INTERACT.rb → Modules/TEST/HardsploitAPI_TEST_INTERACT.rb} +1 -1
  29. data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -0
  30. data/lib/Hardsploit_gui.rb +96 -0
  31. data/lib/class/Chip_editor.rb +186 -330
  32. data/lib/class/Chip_management.rb +496 -0
  33. data/lib/class/Command_editor.rb +130 -182
  34. data/lib/class/Command_table.rb +16 -22
  35. data/lib/class/Console.rb +0 -2
  36. data/lib/class/ErrorMsg.rb +312 -0
  37. data/lib/class/Export.rb +140 -0
  38. data/lib/class/Export_manager.rb +43 -43
  39. data/lib/class/Firmware.rb +52 -11
  40. data/lib/class/Generic_commands.rb +180 -190
  41. data/lib/class/Import.rb +193 -0
  42. data/lib/class/Progress_bar.rb +1 -0
  43. data/lib/class/Signal_mapper.rb +120 -0
  44. data/lib/class/Wire_helper.rb +132 -148
  45. data/lib/class/{I2C → i2c}/I2c_command.rb +16 -13
  46. data/lib/class/i2c/I2c_export.rb +95 -0
  47. data/lib/class/i2c/I2c_import.rb +117 -0
  48. data/lib/class/i2c/I2c_scanner.rb +114 -0
  49. data/lib/class/i2c/I2c_settings.rb +148 -0
  50. data/lib/class/parallel/Parallel_export.rb +118 -0
  51. data/lib/class/parallel/Parallel_import.rb +113 -0
  52. data/lib/class/parallel/Parallel_settings.rb +81 -0
  53. data/lib/class/spi/Spi_export.rb +108 -0
  54. data/lib/class/spi/Spi_import.rb +159 -0
  55. data/lib/class/spi/Spi_settings.rb +108 -0
  56. data/lib/class/spi/Spi_sniffer.rb +101 -0
  57. data/lib/class/swd/Swd.rb +125 -0
  58. data/lib/class/swd/Swd_scanner.rb +121 -0
  59. data/lib/class/swd/Swd_settings.rb +76 -0
  60. data/lib/class/uart/Uart_baudrate.rb +62 -0
  61. data/lib/class/uart/Uart_console.rb +115 -0
  62. data/lib/class/uart/Uart_settings.rb +102 -0
  63. data/lib/db/associations.rb +42 -29
  64. data/lib/db/database.rb +4 -0
  65. data/lib/db/development.sqlite3 +0 -0
  66. data/lib/db/migrate/004_create_manufacturers.rb +13 -0
  67. data/lib/db/migrate/005_create_packages.rb +13 -0
  68. data/lib/db/migrate/006_create_chip_types.rb +11 -0
  69. data/lib/db/migrate/007_create_buses.rb +11 -0
  70. data/lib/db/migrate/008_create_signals.rb +14 -0
  71. data/lib/db/migrate/009_create_chips.rb +25 -0
  72. data/lib/db/migrate/010_create_commands.rb +21 -0
  73. data/lib/db/migrate/011_create_bytes.rb +19 -0
  74. data/lib/db/migrate/012_create_i2c_settings.rb +21 -0
  75. data/lib/db/migrate/013_create_spi_settings.rb +26 -0
  76. data/lib/db/migrate/014_create_parallel_settings.rb +21 -0
  77. data/lib/db/migrate/015_create_pins.rb +19 -0
  78. data/lib/db/migrate/016_create_uses.rb +17 -0
  79. data/lib/db/migrate/017_create_swd_settings.rb +19 -0
  80. data/lib/db/migrate/018_create_uart_settings.rb +22 -0
  81. data/lib/db/schema.rb +157 -0
  82. data/lib/db/seeds.rb +161 -0
  83. data/lib/gui/gui_chip_editor.rb +23 -22
  84. data/lib/gui/gui_chip_management.rb +43 -38
  85. data/lib/gui/gui_command_editor.rb +2 -1
  86. data/lib/gui/gui_export.rb +132 -0
  87. data/lib/gui/gui_generic_commands.rb +69 -31
  88. data/lib/gui/gui_generic_export.rb +18 -2
  89. data/lib/gui/gui_generic_import.rb +18 -2
  90. data/lib/gui/gui_i2c_command.rb +2 -1
  91. data/lib/gui/gui_i2c_settings.rb +2 -2
  92. data/lib/gui/gui_import.rb +131 -0
  93. data/lib/gui/gui_parallel_settings.rb +2 -1
  94. data/lib/gui/gui_progress_bar.rb +2 -1
  95. data/lib/gui/gui_signal_mapper.rb +121 -0
  96. data/lib/gui/gui_signal_scanner.rb +146 -0
  97. data/lib/gui/gui_spi_settings.rb +6 -2
  98. data/lib/gui/gui_spi_sniffer.rb +112 -0
  99. data/lib/gui/gui_swd_settings.rb +166 -0
  100. data/lib/gui/gui_uart_baudrate.rb +114 -0
  101. data/lib/gui/gui_uart_console.rb +164 -0
  102. data/lib/gui/gui_uart_settings.rb +243 -0
  103. data/lib/gui_designer/gui_chip_editor.ui +9 -6
  104. data/lib/gui_designer/gui_chip_management.ui +79 -35
  105. data/lib/gui_designer/gui_command_editor.ui +3 -0
  106. data/lib/gui_designer/gui_export.ui +171 -0
  107. data/lib/gui_designer/gui_generic_commands.ui +274 -190
  108. data/lib/gui_designer/gui_generic_export.ui +24 -1
  109. data/lib/gui_designer/gui_generic_import.ui +25 -2
  110. data/lib/gui_designer/gui_i2c_command.ui +3 -0
  111. data/lib/gui_designer/gui_i2c_settings.ui +2 -2
  112. data/lib/gui_designer/gui_import.ui +168 -0
  113. data/lib/gui_designer/gui_parallel_settings.ui +4 -1
  114. data/lib/gui_designer/gui_progress_bar.ui +3 -0
  115. data/lib/gui_designer/gui_signal_mapper.ui +179 -0
  116. data/lib/gui_designer/gui_signal_scanner.ui +261 -0
  117. data/lib/gui_designer/gui_spi_settings.ui +15 -2
  118. data/lib/gui_designer/gui_spi_sniffer.ui +156 -0
  119. data/lib/gui_designer/gui_swd_settings.ui +189 -0
  120. data/lib/gui_designer/gui_uart_baudrate.ui +161 -0
  121. data/lib/gui_designer/gui_uart_console.ui +284 -0
  122. data/lib/gui_designer/gui_uart_settings.ui +280 -0
  123. data/lib/logs/error.log +63 -0
  124. data/lib/models/bus.rb +19 -0
  125. data/lib/models/byte.rb +29 -0
  126. data/lib/models/chip.rb +41 -0
  127. data/lib/models/chip_type.rb +14 -0
  128. data/lib/models/command.rb +20 -0
  129. data/lib/models/i2c_setting.rb +41 -0
  130. data/lib/models/manufacturer.rb +14 -0
  131. data/lib/models/package.rb +26 -0
  132. data/lib/models/parallel_setting.rb +37 -0
  133. data/lib/models/pin.rb +14 -0
  134. data/lib/models/signall.rb +20 -0
  135. data/lib/models/spi_setting.rb +67 -0
  136. data/lib/models/swd_setting.rb +25 -0
  137. data/lib/models/uart_setting.rb +52 -0
  138. data/lib/models/use.rb +6 -0
  139. data/lib/startHardsploit.rb +2 -2
  140. metadata +106 -41
  141. data/lib/Firmware/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
  142. data/lib/HardsploitAPI/HardsploitAPI.rb +0 -133
  143. data/lib/HardsploitAPI/HardsploitAPI_CONSTANT.rb +0 -145
  144. data/lib/HardsploitAPI/HardsploitAPI_ERROR.rb +0 -38
  145. data/lib/HardsploitAPI/HardsploitAPI_FIRMWARE.rb +0 -311
  146. data/lib/HardsploitAPI/HardsploitAPI_I2C.rb +0 -360
  147. data/lib/HardsploitAPI/HardsploitAPI_SPI.rb +0 -369
  148. data/lib/HardsploitAPI/HardsploitAPI_USB_COMMUNICATION.rb +0 -148
  149. data/lib/HardsploitAPI/LICENSE.txt +0 -674
  150. data/lib/HardsploitAPI/README.md +0 -22
  151. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD.rb +0 -249
  152. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_DEBUG.rb +0 -102
  153. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_MEM_AP.rb +0 -78
  154. data/lib/HardsploitAPI/TRADEMARK +0 -3
  155. data/lib/class/HardsploitGUI.rb +0 -463
  156. data/lib/class/I2C/I2c_export.rb +0 -118
  157. data/lib/class/I2C/I2c_import.rb +0 -79
  158. data/lib/class/I2C/I2c_settings.rb +0 -129
  159. data/lib/class/PARALLEL/Parallel_export.rb +0 -146
  160. data/lib/class/PARALLEL/Parallel_import.rb +0 -88
  161. data/lib/class/PARALLEL/Parallel_settings.rb +0 -102
  162. data/lib/class/SPI/Spi_export.rb +0 -138
  163. data/lib/class/SPI/Spi_import.rb +0 -113
  164. data/lib/class/SPI/Spi_settings.rb +0 -134
  165. data/lib/db/hs.db +0 -0
  166. data/lib/hardsploit.rb +0 -131
@@ -0,0 +1,306 @@
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_relative '../../Core/HardsploitAPI'
10
+ require_relative '../../Modules/SPI/HardsploitAPI_SPI'
11
+ class HardsploitAPI_NRF24L01
12
+ public
13
+ # Instruction Mnemonics
14
+ R_REGISTER = 0x00
15
+ W_REGISTER = 0x20
16
+ REGISTER_MASK = 0x1F
17
+ ACTIVATE = 0x50
18
+ R_RX_PL_WID = 0x60
19
+ R_RX_PAYLOAD = 0x61
20
+ W_TX_PAYLOAD = 0xA0
21
+ W_ACK_PAYLOAD = 0xA8
22
+ FLUSH_TX = 0xE1
23
+ FLUSH_RX = 0xE2
24
+ REUSE_TX_PL = 0xE3
25
+ NOP = 0xFF
26
+
27
+ #Register map
28
+ NRF24L01_00_CONFIG = 0x00
29
+ NRF24L01_01_EN_AA = 0x01
30
+ NRF24L01_02_EN_RXADDR = 0x02
31
+ NRF24L01_03_SETUP_AW = 0x03
32
+ NRF24L01_04_SETUP_RETR = 0x04
33
+ NRF24L01_05_RF_CH = 0x05
34
+ NRF24L01_06_RF_SETUP = 0x06
35
+ NRF24L01_07_STATUS = 0x07
36
+ NRF24L01_08_OBSERVE_TX = 0x08
37
+ NRF24L01_09_CD = 0x09
38
+ NRF24L01_0A_RX_ADDR_P0 = 0x0A
39
+ NRF24L01_0B_RX_ADDR_P1 = 0x0B
40
+ NRF24L01_0C_RX_ADDR_P2 = 0x0C
41
+ NRF24L01_0D_RX_ADDR_P3 = 0x0D
42
+ NRF24L01_0E_RX_ADDR_P4 = 0x0E
43
+ NRF24L01_0F_RX_ADDR_P5 = 0x0F
44
+ NRF24L01_10_TX_ADDR = 0x10
45
+ NRF24L01_11_RX_PW_P0 = 0x11
46
+ NRF24L01_12_RX_PW_P1 = 0x12
47
+ NRF24L01_13_RX_PW_P2 = 0x13
48
+ NRF24L01_14_RX_PW_P3 = 0x14
49
+ NRF24L01_15_RX_PW_P4 = 0x15
50
+ NRF24L01_16_RX_PW_P5 = 0x16
51
+ NRF24L01_17_FIFO_STATUS = 0x17
52
+ NRF24L01_1C_DYNPD = 0x1C
53
+ NRF24L01_1D_FEATURE = 0x1D
54
+
55
+ # Bit mnemonics
56
+ NRF24L01_00_MASK_RX_DR = 6
57
+ NRF24L01_00_MASK_TX_DS = 5
58
+ NRF24L01_00_MASK_MAX_RT = 4
59
+ NRF24L01_00_EN_CRC = 3
60
+ NRF24L01_00_CRCO = 2
61
+ NRF24L01_00_PWR_UP = 1
62
+ NRF24L01_00_PRIM_RX = 0
63
+ NRF24L01_07_RX_DR = 6
64
+ NRF24L01_07_TX_DS = 5
65
+ NRF24L01_07_MAX_RT = 4
66
+
67
+ # Bitrates
68
+ NRF24L01_BR_1M = 0
69
+ NRF24L01_BR_2M = 1
70
+ NRF24L01_BR_250K = 2
71
+ NRF24L01_BR_RSVD = 3
72
+
73
+ TXRX_OFF = 0
74
+ TX_EN = 1
75
+ RX_EN = 2
76
+
77
+ def BV(x)
78
+ return (1 << x)
79
+ end
80
+
81
+ def sendAndReceiveSPI(packet)
82
+ begin
83
+ return @spi.spi_Interact(payload:packet)
84
+ rescue HardsploitAPI::ERROR::HARDSPLOIT_NOT_FOUND
85
+ puts "Hardsploit not found"
86
+ rescue HardsploitAPI::ERROR::USB_ERROR
87
+ puts "USB ERROR"
88
+ end
89
+ end
90
+
91
+ def initialize()
92
+ #Speed Range 1-255 SPI clock = 150Mhz / (2*speed) tested from 3 to 255 (25Mhz to about 0.3Khz)
93
+ @spi = HardsploitAPI_SPI.new(speed:8,mode:0) # 150/(2*8) = 9.3Mhz
94
+ @rf_setup = 0x0F
95
+ @tout =0
96
+ end
97
+
98
+ def initDrone(channel:,address:)
99
+ config = BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PRIM_RX)
100
+ NRF24L01_WriteReg(NRF24L01_00_CONFIG, config);
101
+ NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x0f); # Auto Acknoledgement
102
+ NRF24L01_Activate(0x73); #Allow write feature reg
103
+ NRF24L01_WriteReg( NRF24L01_1D_FEATURE,0x06); #enableDynamicPayloads
104
+ NRF24L01_WriteReg( NRF24L01_1C_DYNPD,0x3f); #enableDynamicPayloads
105
+ NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); # Enable data pipe 0
106
+ NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); # 5-byte RX/TX address
107
+ #NRF24L01_WriteReg(NRF24L01_04_SETUP_RETR, 0xFF); # 4ms retransmit t/o, 15 tries
108
+ NRF24L01_WriteReg(NRF24L01_05_RF_CH, channel); # Channel - bind
109
+ setBitrate(NRF24L01_BR_250K)
110
+ setPower(3) #Max power
111
+ NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70); # Clear data ready, data
112
+ NRF24L01_WriteReg(NRF24L01_11_RX_PW_P0, 16);
113
+ NRF24L01_WriteReg(NRF24L01_17_FIFO_STATUS, 0x00);
114
+ NRF24L01_WriteRegisterMulti(NRF24L01_0A_RX_ADDR_P0,address);
115
+ NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, address);
116
+
117
+ initialize();
118
+
119
+ config |= BV(NRF24L01_00_PWR_UP);
120
+ NRF24L01_WriteReg(NRF24L01_00_CONFIG, config);
121
+
122
+ valid_packets = missed_packets = bad_packets = 0;
123
+
124
+ NRF24L01_SetTxRxMode(TXRX_OFF);
125
+ NRF24L01_SetTxRxMode(RX_EN);
126
+ # puts "EN_AA"
127
+ # p NRF24L01_ReadReg(NRF24L01_01_EN_AA)
128
+ # puts "EN_RXADDR"
129
+ # p NRF24L01_ReadReg(NRF24L01_02_EN_RXADDR)
130
+ # puts "SETUP_AW"
131
+ # p NRF24L01_ReadReg(NRF24L01_03_SETUP_AW)
132
+ # puts "RF_CH"
133
+ # p NRF24L01_ReadReg(NRF24L01_05_RF_CH)
134
+ # puts "RX_PW_P0"
135
+ # p NRF24L01_ReadRegisterMulti(NRF24L01_0A_RX_ADDR_P0,5)
136
+ # puts "TX_PW_P0"
137
+ # p NRF24L01_ReadRegisterMulti(NRF24L01_10_TX_ADDR,5)
138
+ # puts "RX_ADDR_P0"
139
+ # p NRF24L01_ReadReg(NRF24L01_0A_RX_ADDR_P0)
140
+ # puts "TX_ADDR"
141
+ # p NRF24L01_ReadReg(NRF24L01_10_TX_ADDR)
142
+ # puts "config"
143
+ # p config
144
+ end
145
+
146
+ def NRF24L01_WriteReg(reg, data)
147
+ result = sendAndReceiveSPI([ (W_REGISTER | (REGISTER_MASK & reg)),data ])
148
+ return result[1]
149
+ end
150
+
151
+ def NRF24L01_WriteRegisterMulti(reg, payload)
152
+ tmppayload = Array.new
153
+ tmppayload.push (W_REGISTER | (REGISTER_MASK & reg))
154
+ tmppayload.push *payload
155
+ result = sendAndReceiveSPI(tmppayload)
156
+ return result[0]
157
+ end
158
+
159
+ def NRF24L01_WritePayload(payload)
160
+ tmpWpayload = Array.new
161
+ tmpWpayload.push (W_TX_PAYLOAD)
162
+ tmpWpayload.push *payload
163
+ result = sendAndReceiveSPI(tmpWpayload)
164
+ return result[0]
165
+ end
166
+
167
+ def NRF24L01_ReadReg(reg)
168
+ result = sendAndReceiveSPI([R_REGISTER | (REGISTER_MASK & reg) ,0xFF ])
169
+ return result[1]
170
+ end
171
+
172
+ def readPayloadSize
173
+ result = sendAndReceiveSPI([R_RX_PL_WID ,0xFF ])
174
+ return result[1]
175
+ end
176
+
177
+ def NRF24L01_ReadRegisterMulti(reg,length)
178
+ tab = Array.new
179
+ tab.push (R_REGISTER | (REGISTER_MASK & reg))
180
+ tab.push *Array.new(length, 0xFF)
181
+ return sendAndReceiveSPI(tab).drop(1) #remove the first byte
182
+ end
183
+
184
+ def readPayload(length)
185
+ tab = Array.new
186
+ tab.push R_RX_PAYLOAD
187
+ tab.push *Array.new(length, 0xFF)
188
+ return sendAndReceiveSPI(tab).drop(1) #remove the first byte
189
+ end
190
+
191
+ def readAvailableData
192
+ return readPayload(readPayloadSize)
193
+ end
194
+
195
+ def Strobe(state)
196
+ result = sendAndReceiveSPI([state])
197
+ return result[0];
198
+ end
199
+
200
+ def NRF24L01_FlushTx()
201
+ return Strobe(FLUSH_TX);
202
+ end
203
+
204
+ def NRF24L01_FlushRx()
205
+ return Strobe(FLUSH_RX);
206
+ end
207
+
208
+ def NRF24L01_Activate(code)
209
+ result = sendAndReceiveSPI([ACTIVATE ,code])
210
+ return result[0];
211
+ end
212
+
213
+ def dataAvailable()
214
+ result = sendAndReceiveSPI([R_REGISTER ,HardsploitAPI_NRF24L01::NRF24L01_07_STATUS])
215
+ if ((result[0] & BV(HardsploitAPI_NRF24L01::NRF24L01_07_RX_DR))>>6)==1
216
+ return true
217
+ else
218
+ return false
219
+ end
220
+ end
221
+
222
+ def changeChannel(channel:)
223
+ NRF24L01_WriteReg(NRF24L01_05_RF_CH, channel)
224
+ end
225
+
226
+ def setBitrate(bitrate)
227
+ #Note that bitrate 250kbps (and bit RF_DR_LOW) is valid only
228
+ #for nRF24L01+. There is no way to programmatically tell it from
229
+ #older version, nRF24L01, but the older is practically phased out
230
+ #by Nordic, so we assume that we deal with with modern version.
231
+
232
+ # Bit 0 goes to RF_DR_HIGH, bit 1 - to RF_DR_LOW
233
+ @rf_setup = (@rf_setup & 0xD7) | ((bitrate & 0x02) << 4) | ((bitrate & 0x01) << 3);
234
+ return NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, @rf_setup);
235
+ end
236
+
237
+ # Power setting is 0..3 for nRF24L01
238
+ def setPower(nrf_power)
239
+ if (nrf_power < 0) or (nrf_power > 3) then
240
+ raise "NRF setPower, wrong must be between 0 and 3"
241
+ end
242
+ @rf_setup = (@rf_setup & 0xF9) | ((nrf_power & 0x03) << 1)
243
+ return NRF24L01_WriteReg(NRF24L01_06_RF_SETUP, @rf_setup)
244
+ end
245
+
246
+ def CE_lo
247
+ @spi.pulse = 0
248
+ end
249
+
250
+ def CE_hi
251
+ @spi.pulse = 1
252
+ end
253
+
254
+ def NRF24L01_SetTxRxMode(mode)
255
+ if(mode == TX_EN) then
256
+ CE_lo()
257
+ #sleep(0.5)
258
+ NRF24L01_WriteReg(NRF24L01_07_STATUS, (1 << NRF24L01_07_RX_DR) | (1 << NRF24L01_07_TX_DS) | (1 << NRF24L01_07_MAX_RT)) #reset the flag(s)
259
+ NRF24L01_WriteReg(NRF24L01_00_CONFIG, (1 << NRF24L01_00_EN_CRC)| (1 << NRF24L01_00_CRCO) | (1 << NRF24L01_00_PWR_UP)) #switch to TX mode
260
+ #sleep(0.5)
261
+ CE_hi()
262
+ elsif (mode == RX_EN) then
263
+ CE_lo()
264
+ # sleep(0.5)
265
+ NRF24L01_WriteReg(NRF24L01_07_STATUS, 0x70) # reset the flag(s)
266
+ NRF24L01_WriteReg(NRF24L01_00_CONFIG, 0x0F) # switch to RX mode
267
+ NRF24L01_WriteReg(NRF24L01_07_STATUS, (1 << NRF24L01_07_RX_DR) | (1 << NRF24L01_07_TX_DS) | (1 << NRF24L01_07_MAX_RT)) #reset the flag(s)
268
+ NRF24L01_WriteReg(NRF24L01_00_CONFIG, (1 << NRF24L01_00_EN_CRC)| (1 << NRF24L01_00_CRCO) | (1 << NRF24L01_00_PWR_UP) | (1 << NRF24L01_00_PRIM_RX)) #switch to RX mode
269
+ # sleep(0.5)
270
+ CE_hi()
271
+ else
272
+ NRF24L01_WriteReg(NRF24L01_00_CONFIG, (1 << NRF24L01_00_EN_CRC)) #PowerDown
273
+ CE_lo()
274
+ end
275
+ end
276
+
277
+ def reset()
278
+ NRF24L01_SetTxRxMode(TXRX_OFF)
279
+ NRF24L01_FlushTx()
280
+ NRF24L01_FlushRx()
281
+ return true
282
+ end
283
+
284
+ def Read()
285
+ tabdataread = Array.new
286
+ if dataAvailable()
287
+ NRF24L01_WriteReg(0x07,BV(HardsploitAPI_NRF24L01::NRF24L01_07_RX_DR))
288
+ tabdataread.push *readPayload(16)
289
+ return tabdataread
290
+ else
291
+ return tabdataread
292
+ end
293
+ end
294
+
295
+ def Send(dataSend)
296
+ NRF24L01_SetTxRxMode(TXRX_OFF)
297
+ NRF24L01_FlushTx()
298
+ NRF24L01_WritePayload(dataSend)
299
+ NRF24L01_SetTxRxMode(TX_EN)
300
+ sleep(0.1)
301
+ NRF24L01_SetTxRxMode(TXRX_OFF)
302
+ NRF24L01_FlushTx()
303
+ NRF24L01_FlushRx()
304
+ NRF24L01_SetTxRxMode(RX_EN);
305
+ end
306
+ end
@@ -0,0 +1,340 @@
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_relative '../../Core/HardsploitAPI'
10
+ class HardsploitAPI_SPI
11
+ public
12
+
13
+ def initialize(speed:,mode:)
14
+ #to be sure the singleton was initialize
15
+ HardsploitAPI.instance.connect
16
+ self.speed=speed
17
+ self.mode=mode
18
+ @pulse = 0
19
+ end
20
+
21
+ def pulse
22
+ return @pulse
23
+ end
24
+
25
+ def pulse=(pulse)
26
+ if (pulse == 0) or (pulse == 1) then
27
+ @pulse = pulse
28
+ spi_SetSettings #Send an Empty array to validate the value of pulse
29
+ else
30
+ raise HardsploitAPI::ERROR::SPIWrongPulse
31
+ end
32
+ end
33
+
34
+ def speed
35
+ return @speed
36
+ end
37
+
38
+ def speed=(speed)
39
+ if (speed <=2) or (speed >256) then
40
+ raise HardsploitAPI::ERROR::SPIWrongSpeed
41
+ else
42
+ @speed = speed
43
+ end
44
+ end
45
+
46
+ def mode
47
+ return @mode
48
+ end
49
+
50
+ def mode=(mode)
51
+ if ( mode < 0 ) or ( mode > 3 ) then
52
+ raise HardsploitAPI::ERROR::SPIWrongMode
53
+ else
54
+ @mode = mode
55
+ end
56
+ end
57
+
58
+ def spi_SetSettings()
59
+ packet = Array.new
60
+ packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
61
+ packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
62
+ packet.push HardsploitAPI.lowByte(word:HardsploitAPI::USB_COMMAND::FPGA_COMMAND)
63
+ packet.push HardsploitAPI.highByte(word:HardsploitAPI::USB_COMMAND::FPGA_COMMAND)
64
+
65
+ packet.push 0x50 #Command RAW COMMUNICATION TO FPGA FIFO
66
+
67
+ packet.push (( @pulse & 1 ) << 2 ) || ( @mode & 3 ) #Add mode and the value of pin pulse
68
+ packet.push @speed #Add speed
69
+ begin
70
+ HardsploitAPI.instance.sendPacket packet
71
+ rescue
72
+ raise HardsploitAPI::ERROR::USB_ERROR
73
+ end
74
+ end
75
+
76
+ # SPI interact
77
+ # * +payload+:: Byte array want to send
78
+ # * Return SPI data received
79
+ def spi_Interact(payload:)
80
+ if ( payload.size > 4000 ) then
81
+ raise SPIWrongPayloadSize
82
+ end
83
+
84
+ packet = Array.new
85
+ packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
86
+ packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
87
+ packet.push HardsploitAPI.lowByte(word:HardsploitAPI::USB_COMMAND::FPGA_COMMAND)
88
+ packet.push HardsploitAPI.highByte(word:HardsploitAPI::USB_COMMAND::FPGA_COMMAND)
89
+
90
+ packet.push 0x50 #Command RAW COMMUNICATION TO FPGA FIFO
91
+ packet.push (( @pulse & 1 ) << 2 ) || ( @mode & 3 ) #Add mode and the value of pin pulse
92
+ packet.push @speed #Add speed
93
+ packet.concat payload #Add data
94
+ #puts "Payload : #{payload}"
95
+
96
+ #remove header (4 bytes 2 for size 2 for type of command)
97
+ return HardsploitAPI.instance.sendAndReceiveDATA(packet, 1000).drop(4)
98
+ end
99
+
100
+
101
+ # Spi generic Import
102
+ # * +writeSpiCommand+:: The write command most of the time 0x02
103
+ # * +startAddress+:: Start address (included)
104
+ # * +pageSize+:: Size of page
105
+ # * +memorySize+:: Size max of memory in byte (important, to calculate automatically the number of byte to set address)
106
+ # * +saveFile+:: File contain data
107
+ # * +writePageLatency+:: Time to wait after each pages written
108
+ # * +enableWriteSpiCommand+:: Enable write commad most of the time 0x06
109
+ # * +clearSpiCommand+:: Bulk erase command most of the time 0x60 chip eraseTime
110
+ # * +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
111
+ # * +isFLASH+:: True if it is a Flash memory (add clear content)
112
+ def spi_Generic_Import (startAddress:,pageSize:,memorySize:,dataFile:,writeSpiCommand:,writePageLatency:,enableWriteSpiCommand:,clearSpiCommand:,clearChipTime:,isFLASH:)
113
+ #Start time
114
+ startTime = Time.now
115
+
116
+ file = File.open(dataFile, 'rb')
117
+ sizeFile = file.size
118
+
119
+ if (( startAddress < 0 ) or ( startAddress > memorySize - 1 )) then
120
+ raise Error::WrongStartAddress
121
+ end
122
+
123
+ if (( pageSize <= 0 ) and ( pageSize > 2048 )) then
124
+ raise TypeError, "pageSize need to be greater than 0 and less than 2048"
125
+ end
126
+
127
+ numberOfByteAddress = ((( Math.log( memorySize - 1, 2 )).floor + 1 ) / 8.0 ).ceil
128
+ if numberOfByteAddress > 4 then
129
+ raise TypeError, "Size max must be less than 2^32 about 4Gb"
130
+ end
131
+
132
+ if numberOfByteAddress <= 0 then
133
+ raise TypeError, "There is an issue with calculating of number of byte needed"
134
+ end
135
+
136
+ #if flash memory we need to erase it before and wait enought
137
+ #time (erase cycle time in datasheet) or polling status register
138
+ if isFLASH then
139
+ spi_Interact(payload: [clearSpiCommand])
140
+ sleep(clearChipTime)
141
+ end
142
+
143
+ startTime = Time.now
144
+ packet_size = pageSize
145
+ number_complet_packet = (sizeFile / packet_size).floor
146
+ size_last_packet = sizeFile % packet_size
147
+
148
+ #SEND the first complete trame
149
+ for i in 0..number_complet_packet - 1 do
150
+ #Enable write latch
151
+ spi_Interact(payload: [enableWriteSpiCommand])
152
+ packet = generate_spi_write_command(
153
+ numberOfByteAddress: numberOfByteAddress,
154
+ writeSpiCommand: writeSpiCommand,
155
+ startAddress: i * packet_size + startAddress,
156
+ data: file.read(packet_size).unpack("C*")
157
+ )
158
+
159
+ temp = spi_Interact( payload: packet )
160
+ #Remove header, result of read command and numberOfByte Address too
161
+ unless packet.size == temp.size then
162
+ raise HardsploitAPI::SpiError
163
+ end
164
+
165
+ HardsploitAPI.instance.consoleProgress(
166
+ percent: 100 * ( i + 1 ) / ( number_complet_packet + ( size_last_packet.zero? ? 0 : 1 ) ),
167
+ startTime:startTime,
168
+ endTime: Time.new
169
+ )
170
+ #if too many error when write increase because we need to wait to write a full page
171
+ sleep(writePageLatency)
172
+ end
173
+
174
+ if( size_last_packet > 0 )then
175
+ #Enable write latch
176
+ spi_Interact( payload: [enableWriteSpiCommand] )
177
+ packet = generate_spi_write_command(
178
+ numberOfByteAddress: numberOfByteAddress,
179
+ writeSpiCommand: writeSpiCommand,
180
+ startAddress: number_complet_packet * packet_size + startAddress,
181
+ data: file.read(size_last_packet).unpack("C*")
182
+ )
183
+ temp = spi_Interact( payload: packet )
184
+ #Remove header, result of write command and numberOfByte Address too
185
+ unless packet.size == temp.size then
186
+ raise HardsploitAPI::SpiError
187
+ end
188
+
189
+ #Send 100% in case of last packet
190
+ HardsploitAPI.instance.consoleProgress(
191
+ percent: 100,
192
+ startTime: startTime,
193
+ endTime: Time.now
194
+ )
195
+ end
196
+ delta = Time.now - startTime
197
+ HardsploitAPI.instance.consoleSpeed "Write in #{delta.round(4)} sec"
198
+ end
199
+
200
+
201
+ # Spi generic dump
202
+ # * +readSpiCommand+:: The read command
203
+ # * +startAddress+:: Start address (included)
204
+ # * +stopAddress+:: Stop address (included)
205
+ # * +sizeMax+:: Size max of memory (important to calculate automaticly the number of byte to set address)
206
+ def spi_Generic_Dump (readSpiCommand:,startAddress:,stopAddress:,sizeMax:)
207
+ if (( startAddress < 0 ) or ( startAddress > sizeMax - 1 )) then
208
+ raise TypeError, "Start address can't be negative and not more than size max - 1"
209
+ end
210
+
211
+ if (( stopAddress < 0 ) or ( stopAddress > ( sizeMax - 1 ))) then
212
+ raise TypeError, "Stop address can't be negative and not more than size max-1 because start at 0"
213
+ end
214
+
215
+ if ( stopAddress < startAddress ) then
216
+ raise TypeError, "Stop address need to be greater than start address"
217
+ end
218
+
219
+ numberOfByteAddress = ((( Math.log( sizeMax - 1, 2 )).floor + 1) / 8.0 ).ceil
220
+ if numberOfByteAddress > 4 then
221
+ raise TypeError, "Size max must be less than 2^32 about 4Gb"
222
+ end
223
+
224
+ if numberOfByteAddress <= 0 then
225
+ raise TypeError, "There is an issue with calculating of number of byte needed"
226
+ end
227
+
228
+ #Start time
229
+ startTime = Time.now
230
+ packet_size = 4000 - numberOfByteAddress - 1
231
+ number_complet_packet = (( stopAddress - startAddress + 1 ) / packet_size ).floor
232
+ size_last_packet = ( stopAddress - startAddress + 1 ) % packet_size
233
+
234
+ #SEND the first complete trame
235
+ for i in 0..number_complet_packet - 1 do
236
+ packet = generate_spi_read_command(
237
+ numberOfByteAddress: numberOfByteAddress,
238
+ readSpiCommand: readSpiCommand,
239
+ startAddress: i * packet_size + startAddress,
240
+ size: packet_size
241
+ )
242
+ begin
243
+ temp = spi_Interact( payload: packet )
244
+ rescue
245
+ raise HardsploitAPI::ERROR::USB_ERROR
246
+ end
247
+ #Remove header, result of read command and numberOfByte Address too
248
+ #puts "receive real size #{temp.size}"
249
+ HardsploitAPI.instance.consoleData temp.drop( numberOfByteAddress + 1 )
250
+ HardsploitAPI.instance.consoleProgress(
251
+ percent: 100 * ( i + 1 ) / ( number_complet_packet + ( size_last_packet.zero? ? 0 : 1 )),
252
+ startTime: startTime,
253
+ endTime: Time.new
254
+ )
255
+ end
256
+
257
+ if( size_last_packet > 0 ) then
258
+ packet = generate_spi_read_command(
259
+ numberOfByteAddress: numberOfByteAddress,
260
+ readSpiCommand: readSpiCommand,
261
+ startAddress: number_complet_packet * packet_size + startAddress,
262
+ size: size_last_packet
263
+ )
264
+ temp = spi_Interact( payload: packet )
265
+ #Remove header, result of read command and numberOfByte Address too
266
+ HardsploitAPI.instance.consoleData temp.drop( numberOfByteAddress + 1 )
267
+ begin
268
+ HardsploitAPI.instance.consoleProgress(
269
+ percent: 100,
270
+ startTime: startTime,
271
+ endTime: Time.now
272
+ )
273
+ rescue
274
+ raise HardsploitAPI::ERROR::USB_ERROR
275
+ end
276
+ end
277
+ delta = Time.now - startTime
278
+ HardsploitAPI.instance.consoleSpeed "Write in #{delta.round(4)} sec"
279
+ end
280
+
281
+ protected
282
+ def generate_spi_read_command (numberOfByteAddress:,readSpiCommand:,startAddress:,size:)
283
+ packet = Array.new
284
+ packet.push readSpiCommand
285
+ case numberOfByteAddress
286
+ when 1
287
+ packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
288
+ when 2
289
+ packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
290
+ packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
291
+ when 3
292
+ packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
293
+ packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
294
+ packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
295
+ when 4
296
+ packet.push ((startAddress & 0xFF000000) >> 24 ) #AddStart3
297
+ packet.push ((startAddress & 0x00FF0000) >> 16 ) #AddStart2
298
+ packet.push ((startAddress & 0x0000FF00) >> 8 ) #AddStart1
299
+ packet.push ((startAddress & 0x000000FF) >> 0) #AddStart0
300
+ else
301
+ raise TypeError, "Issue in generate_spi_read_command function when parse number of byte address"
302
+ end
303
+
304
+ #put N dummy byte to read size data
305
+ packet.push *Array.new(size, 0)
306
+ if packet.size > 4000 then
307
+ raise TypeError, "Too many byte to send in spi mode not more than 4000 is needed"
308
+ end
309
+ return packet
310
+ end
311
+
312
+ def generate_spi_write_command (numberOfByteAddress:,writeSpiCommand:,startAddress:,data:)
313
+ packet = Array.new
314
+ packet.push writeSpiCommand
315
+ case numberOfByteAddress
316
+ when 1
317
+ packet.push (( startAddress & 0x000000FF) >> 0 ) #AddStart0
318
+ when 2
319
+ packet.push (( startAddress & 0x0000FF00) >> 8 ) #AddStart1
320
+ packet.push (( startAddress & 0x000000FF) >> 0 ) #AddStart0
321
+ when 3
322
+ packet.push (( startAddress & 0x00FF0000) >> 16 ) #AddStart2
323
+ packet.push (( startAddress & 0x0000FF00) >> 8 ) #AddStart1
324
+ packet.push (( startAddress & 0x000000FF) >> 0 ) #AddStart0
325
+ when 4
326
+ packet.push (( startAddress & 0xFF000000) >> 24 ) #AddStart3
327
+ packet.push (( startAddress & 0x00FF0000) >> 16 ) #AddStart2
328
+ packet.push (( startAddress & 0x0000FF00) >> 8 ) #AddStart1
329
+ packet.push (( startAddress & 0x000000FF) >> 0 ) #AddStart0
330
+ else
331
+ raise TypeError, "Issue in generate_spi_write_command function when parse number of byte address"
332
+ end
333
+ #Push data to write
334
+ packet.push *data
335
+ if packet.size > 4000 then
336
+ raise TypeError, "Too many byte to send in spi mode not more than 4000 is needed"
337
+ end
338
+ return packet
339
+ end
340
+ end