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