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.
- checksums.yaml +4 -4
- data/bin/hardsploit_gui +2 -2
- data/lib/{Firmware → Firmwares}/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
- 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
- data/lib/Firmwares/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
- 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
- data/lib/Firmwares/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
- data/lib/{Firmware → Firmwares}/FPGA/TEST/TEST_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_TEST_INTERACT.rpd +0 -0
- data/lib/Firmwares/FPGA/UART/UART_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_UART_INTERACT.rpd +0 -0
- data/lib/{Firmware → Firmwares}/FPGA/VersionFPGA.rb +1 -1
- data/lib/{Firmware → Firmwares}/UC/HARDSPLOIT_FIRMWARE_UC.bin +0 -0
- data/lib/{Firmware → Firmwares}/UC/VersionUC.rb +1 -1
- data/lib/HardsploitAPI/Core/HardsploitAPI.rb +210 -0
- data/lib/HardsploitAPI/Core/HardsploitAPI_CONSTANT.rb +150 -0
- data/lib/HardsploitAPI/Core/HardsploitAPI_ERROR.rb +109 -0
- data/lib/HardsploitAPI/Core/HardsploitAPI_FIRMWARE.rb +305 -0
- data/lib/HardsploitAPI/{HardsploitAPI_PROGRESS.rb → Core/HardsploitAPI_PROGRESS.rb} +0 -0
- data/lib/HardsploitAPI/Core/HardsploitAPI_USB_COMMUNICATION.rb +166 -0
- data/lib/HardsploitAPI/Modules/I2C/HardsploitAPI_I2C.rb +356 -0
- data/lib/HardsploitAPI/{HardsploitAPI_NO_MUX_PARALLELE_MEMORY.rb → Modules/NO_MUX_PARALLEL_MEMORY/HardsploitAPI_NO_MUX_PARALLEL_MEMORY.rb} +26 -49
- data/lib/HardsploitAPI/Modules/NRF24L01/HardsploitAPI_NRF24L01.rb +306 -0
- data/lib/HardsploitAPI/Modules/SPI/HardsploitAPI_SPI.rb +340 -0
- data/lib/HardsploitAPI/Modules/SPI_SNIFFER/HardsploitAPI_SPI_SNIFFER.rb +83 -0
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD.rb +367 -0
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_DEBUG.rb +89 -0
- data/lib/HardsploitAPI/Modules/SWD/HardsploitAPI_SWD_MEM_AP.rb +61 -0
- data/lib/HardsploitAPI/{SWD → Modules/SWD}/HardsploitAPI_SWD_STM32.rb +32 -15
- data/lib/HardsploitAPI/{HardsploitAPI_TEST_INTERACT.rb → Modules/TEST/HardsploitAPI_TEST_INTERACT.rb} +1 -1
- data/lib/HardsploitAPI/Modules/UART/HardsploitAPI_UART.rb +196 -0
- data/lib/Hardsploit_gui.rb +96 -0
- data/lib/class/Chip_editor.rb +186 -330
- data/lib/class/Chip_management.rb +496 -0
- data/lib/class/Command_editor.rb +130 -182
- data/lib/class/Command_table.rb +16 -22
- data/lib/class/Console.rb +0 -2
- data/lib/class/ErrorMsg.rb +312 -0
- data/lib/class/Export.rb +140 -0
- data/lib/class/Export_manager.rb +43 -43
- data/lib/class/Firmware.rb +52 -11
- data/lib/class/Generic_commands.rb +180 -190
- data/lib/class/Import.rb +193 -0
- data/lib/class/Progress_bar.rb +1 -0
- data/lib/class/Signal_mapper.rb +120 -0
- data/lib/class/Wire_helper.rb +132 -148
- data/lib/class/{I2C → i2c}/I2c_command.rb +16 -13
- data/lib/class/i2c/I2c_export.rb +95 -0
- data/lib/class/i2c/I2c_import.rb +117 -0
- data/lib/class/i2c/I2c_scanner.rb +114 -0
- data/lib/class/i2c/I2c_settings.rb +148 -0
- data/lib/class/parallel/Parallel_export.rb +118 -0
- data/lib/class/parallel/Parallel_import.rb +113 -0
- data/lib/class/parallel/Parallel_settings.rb +81 -0
- data/lib/class/spi/Spi_export.rb +108 -0
- data/lib/class/spi/Spi_import.rb +159 -0
- data/lib/class/spi/Spi_settings.rb +108 -0
- data/lib/class/spi/Spi_sniffer.rb +101 -0
- data/lib/class/swd/Swd.rb +125 -0
- data/lib/class/swd/Swd_scanner.rb +121 -0
- data/lib/class/swd/Swd_settings.rb +76 -0
- data/lib/class/uart/Uart_baudrate.rb +62 -0
- data/lib/class/uart/Uart_console.rb +115 -0
- data/lib/class/uart/Uart_settings.rb +102 -0
- data/lib/db/associations.rb +42 -29
- data/lib/db/database.rb +4 -0
- data/lib/db/development.sqlite3 +0 -0
- data/lib/db/migrate/004_create_manufacturers.rb +13 -0
- data/lib/db/migrate/005_create_packages.rb +13 -0
- data/lib/db/migrate/006_create_chip_types.rb +11 -0
- data/lib/db/migrate/007_create_buses.rb +11 -0
- data/lib/db/migrate/008_create_signals.rb +14 -0
- data/lib/db/migrate/009_create_chips.rb +25 -0
- data/lib/db/migrate/010_create_commands.rb +21 -0
- data/lib/db/migrate/011_create_bytes.rb +19 -0
- data/lib/db/migrate/012_create_i2c_settings.rb +21 -0
- data/lib/db/migrate/013_create_spi_settings.rb +26 -0
- data/lib/db/migrate/014_create_parallel_settings.rb +21 -0
- data/lib/db/migrate/015_create_pins.rb +19 -0
- data/lib/db/migrate/016_create_uses.rb +17 -0
- data/lib/db/migrate/017_create_swd_settings.rb +19 -0
- data/lib/db/migrate/018_create_uart_settings.rb +22 -0
- data/lib/db/schema.rb +157 -0
- data/lib/db/seeds.rb +161 -0
- data/lib/gui/gui_chip_editor.rb +23 -22
- data/lib/gui/gui_chip_management.rb +43 -38
- data/lib/gui/gui_command_editor.rb +2 -1
- data/lib/gui/gui_export.rb +132 -0
- data/lib/gui/gui_generic_commands.rb +69 -31
- data/lib/gui/gui_generic_export.rb +18 -2
- data/lib/gui/gui_generic_import.rb +18 -2
- data/lib/gui/gui_i2c_command.rb +2 -1
- data/lib/gui/gui_i2c_settings.rb +2 -2
- data/lib/gui/gui_import.rb +131 -0
- data/lib/gui/gui_parallel_settings.rb +2 -1
- data/lib/gui/gui_progress_bar.rb +2 -1
- data/lib/gui/gui_signal_mapper.rb +121 -0
- data/lib/gui/gui_signal_scanner.rb +146 -0
- data/lib/gui/gui_spi_settings.rb +6 -2
- data/lib/gui/gui_spi_sniffer.rb +112 -0
- data/lib/gui/gui_swd_settings.rb +166 -0
- data/lib/gui/gui_uart_baudrate.rb +114 -0
- data/lib/gui/gui_uart_console.rb +164 -0
- data/lib/gui/gui_uart_settings.rb +243 -0
- data/lib/gui_designer/gui_chip_editor.ui +9 -6
- data/lib/gui_designer/gui_chip_management.ui +79 -35
- data/lib/gui_designer/gui_command_editor.ui +3 -0
- data/lib/gui_designer/gui_export.ui +171 -0
- data/lib/gui_designer/gui_generic_commands.ui +274 -190
- data/lib/gui_designer/gui_generic_export.ui +24 -1
- data/lib/gui_designer/gui_generic_import.ui +25 -2
- data/lib/gui_designer/gui_i2c_command.ui +3 -0
- data/lib/gui_designer/gui_i2c_settings.ui +2 -2
- data/lib/gui_designer/gui_import.ui +168 -0
- data/lib/gui_designer/gui_parallel_settings.ui +4 -1
- data/lib/gui_designer/gui_progress_bar.ui +3 -0
- data/lib/gui_designer/gui_signal_mapper.ui +179 -0
- data/lib/gui_designer/gui_signal_scanner.ui +261 -0
- data/lib/gui_designer/gui_spi_settings.ui +15 -2
- data/lib/gui_designer/gui_spi_sniffer.ui +156 -0
- data/lib/gui_designer/gui_swd_settings.ui +189 -0
- data/lib/gui_designer/gui_uart_baudrate.ui +161 -0
- data/lib/gui_designer/gui_uart_console.ui +284 -0
- data/lib/gui_designer/gui_uart_settings.ui +280 -0
- data/lib/logs/error.log +63 -0
- data/lib/models/bus.rb +19 -0
- data/lib/models/byte.rb +29 -0
- data/lib/models/chip.rb +41 -0
- data/lib/models/chip_type.rb +14 -0
- data/lib/models/command.rb +20 -0
- data/lib/models/i2c_setting.rb +41 -0
- data/lib/models/manufacturer.rb +14 -0
- data/lib/models/package.rb +26 -0
- data/lib/models/parallel_setting.rb +37 -0
- data/lib/models/pin.rb +14 -0
- data/lib/models/signall.rb +20 -0
- data/lib/models/spi_setting.rb +67 -0
- data/lib/models/swd_setting.rb +25 -0
- data/lib/models/uart_setting.rb +52 -0
- data/lib/models/use.rb +6 -0
- data/lib/startHardsploit.rb +2 -2
- metadata +106 -41
- data/lib/Firmware/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
- data/lib/HardsploitAPI/HardsploitAPI.rb +0 -133
- data/lib/HardsploitAPI/HardsploitAPI_CONSTANT.rb +0 -145
- data/lib/HardsploitAPI/HardsploitAPI_ERROR.rb +0 -38
- data/lib/HardsploitAPI/HardsploitAPI_FIRMWARE.rb +0 -311
- data/lib/HardsploitAPI/HardsploitAPI_I2C.rb +0 -360
- data/lib/HardsploitAPI/HardsploitAPI_SPI.rb +0 -369
- data/lib/HardsploitAPI/HardsploitAPI_USB_COMMUNICATION.rb +0 -148
- data/lib/HardsploitAPI/LICENSE.txt +0 -674
- data/lib/HardsploitAPI/README.md +0 -22
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD.rb +0 -249
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_DEBUG.rb +0 -102
- data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_MEM_AP.rb +0 -78
- data/lib/HardsploitAPI/TRADEMARK +0 -3
- data/lib/class/HardsploitGUI.rb +0 -463
- data/lib/class/I2C/I2c_export.rb +0 -118
- data/lib/class/I2C/I2c_import.rb +0 -79
- data/lib/class/I2C/I2c_settings.rb +0 -129
- data/lib/class/PARALLEL/Parallel_export.rb +0 -146
- data/lib/class/PARALLEL/Parallel_import.rb +0 -88
- data/lib/class/PARALLEL/Parallel_settings.rb +0 -102
- data/lib/class/SPI/Spi_export.rb +0 -138
- data/lib/class/SPI/Spi_import.rb +0 -113
- data/lib/class/SPI/Spi_settings.rb +0 -134
- data/lib/db/hs.db +0 -0
- data/lib/hardsploit.rb +0 -131
@@ -0,0 +1,89 @@
|
|
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
|
+
class SWD_DEBUG_PORT
|
9
|
+
|
10
|
+
def initialize(swdAPI)
|
11
|
+
@swdAPI = swdAPI
|
12
|
+
sleep(0.5)
|
13
|
+
@swdAPI.resetSWD
|
14
|
+
|
15
|
+
@curAP = -1
|
16
|
+
@curBank = -1
|
17
|
+
abort(1,1,1,1,1)
|
18
|
+
select(0,0)
|
19
|
+
|
20
|
+
# power shit up
|
21
|
+
HardsploitAPI.instance.consoleInfo "Power shit up"
|
22
|
+
|
23
|
+
@swdAPI.writeSWD(FALSE, 1, 0x54000000)
|
24
|
+
if (status() >> 24) != 0xF4 then
|
25
|
+
raise "error powering up system"
|
26
|
+
exit(0)
|
27
|
+
else
|
28
|
+
HardsploitAPI.instance.consoleInfo "POWERING UP SYTEM OK"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def getAPI
|
33
|
+
return @swdAPI
|
34
|
+
end
|
35
|
+
|
36
|
+
def idcode
|
37
|
+
return @swdAPI.readSWD(FALSE, 0)
|
38
|
+
end
|
39
|
+
|
40
|
+
def abort (orunerr, wdataerr, stickyerr, stickycmp, dap)
|
41
|
+
value = 0x00000000
|
42
|
+
(orunerr ? value |= 0x10 : value |= 0x00)
|
43
|
+
(wdataerr ? value |= 0x08 : value |= 0x00)
|
44
|
+
(stickyerr ? value |= 0x04 : value |= 0x00)
|
45
|
+
(stickycmp ? value |= 0x02 : value |= 0x00)
|
46
|
+
(dap ? value |= 0x01 : value |= 0x00)
|
47
|
+
@swdAPI.writeSWD(FALSE, 0, value)
|
48
|
+
end
|
49
|
+
|
50
|
+
def status
|
51
|
+
val= @swdAPI.readSWD(FALSE,1)
|
52
|
+
return val
|
53
|
+
end
|
54
|
+
|
55
|
+
def control (trnCount = 0, trnMode = 0, maskLane = 0, orunDetect = 0)
|
56
|
+
value = 0x54000000
|
57
|
+
value = value | ((trnCount & 0xFFF) << 12)
|
58
|
+
value = value | ((maskLane & 0x00F) << 8)
|
59
|
+
value = value | ((trnMode & 0x003) << 2)
|
60
|
+
(orunDetect ? value |= 0x01 : value |= 0x00)
|
61
|
+
@swdAPI.writeSWD(False, 1, value)
|
62
|
+
end
|
63
|
+
|
64
|
+
def select (apsel, apbank)
|
65
|
+
if apsel != @curAP or apbank != @curBank then
|
66
|
+
@curAP = apsel
|
67
|
+
@curBank = apbank
|
68
|
+
value = 0 | ((apsel & 0xFF) << 24) | ((apbank & 0x0F) << 4)
|
69
|
+
@swdAPI.writeSWD(FALSE, 2, value)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def readRB
|
74
|
+
return @swdAPI.readSWD(FALSE, 3)
|
75
|
+
end
|
76
|
+
def readAP ( apsel, address)
|
77
|
+
adrBank = (address >> 4) & 0xF
|
78
|
+
adrReg = (address >> 2) & 0x3
|
79
|
+
select(apsel, adrBank)
|
80
|
+
return @swdAPI.readSWD(TRUE, adrReg)
|
81
|
+
end
|
82
|
+
|
83
|
+
def writeAP (apsel, address, data)
|
84
|
+
adrBank = (address >> 4) & 0xF
|
85
|
+
adrReg = (address >> 2) & 0x3
|
86
|
+
select(apsel, adrBank)
|
87
|
+
@swdAPI.writeSWD(TRUE, adrReg, data)
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,61 @@
|
|
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 SWD_MEM_AP
|
10
|
+
|
11
|
+
def initialize( dp, apsel)
|
12
|
+
@dp = dp
|
13
|
+
@apsel = apsel
|
14
|
+
csw(1,2) # 32-bit auto-incrementing addressing
|
15
|
+
end
|
16
|
+
|
17
|
+
def csw ( addrInc, size)
|
18
|
+
@dp.readAP(@apsel, 0x00)
|
19
|
+
val = @dp.readRB() & 0xFFFFFF00
|
20
|
+
@dp.writeAP(@apsel, 0x00, val + (addrInc << 4) + size)
|
21
|
+
end
|
22
|
+
|
23
|
+
def idcode
|
24
|
+
@dp.readAP(@apsel, 0xFC)
|
25
|
+
id = @dp.readRB()
|
26
|
+
@dp.select(0,0)
|
27
|
+
return id
|
28
|
+
end
|
29
|
+
|
30
|
+
def readWord (addr)
|
31
|
+
@dp.writeAP(@apsel, 0x04, addr)
|
32
|
+
@dp.readAP(@apsel, 0x0C)
|
33
|
+
return @dp.readRB()
|
34
|
+
end
|
35
|
+
|
36
|
+
def writeWord (addr, data)
|
37
|
+
@dp.writeAP(@apsel, 0x04, addr)
|
38
|
+
@dp.writeAP(@apsel, 0x0C, data)
|
39
|
+
return @dp.readRB()
|
40
|
+
end
|
41
|
+
|
42
|
+
def readBlock ( address, size)#1K boundaries and return 4K of data word alignement
|
43
|
+
if size < 1 then
|
44
|
+
raise "readBlock error : count must be >= 1"
|
45
|
+
end
|
46
|
+
if size > 1024 then
|
47
|
+
raise "readBlock error : size must be <= 1024 "
|
48
|
+
end
|
49
|
+
return @dp.getAPI.read_mem32(address,size)
|
50
|
+
end
|
51
|
+
|
52
|
+
def writeBlock (address,data) #1K boundaries
|
53
|
+
if data.length < 1 then
|
54
|
+
raise "readBlock error : count must be >= 1"
|
55
|
+
end
|
56
|
+
if data.length > 1024 then
|
57
|
+
raise "readBlock error : size must be <= 1024 "
|
58
|
+
end
|
59
|
+
@dp.getAPI.write_mem16Packed(address,data)
|
60
|
+
end
|
61
|
+
end
|
@@ -13,6 +13,7 @@ attr_accessor :ahb
|
|
13
13
|
|
14
14
|
def initialize(debugPort)
|
15
15
|
@ahb = SWD_MEM_AP.new(debugPort, 0)
|
16
|
+
@debugPort = debugPort
|
16
17
|
end
|
17
18
|
|
18
19
|
def halt
|
@@ -38,21 +39,31 @@ attr_accessor :ahb
|
|
38
39
|
# IMPLEMENTATION DEFINED. This means that auto address incrementing at a 1KB boundary
|
39
40
|
# is IMPLEMENTATION DEFINED
|
40
41
|
|
41
|
-
#But for hardsploit max 8192 so chuck to 1k
|
42
|
+
#But for hardsploit max 8192 so chuck to 1k due to swd limitation
|
42
43
|
|
43
44
|
packet_size = 1024
|
44
|
-
number_complet_packet = (size/packet_size).floor
|
45
|
+
number_complet_packet = (size / packet_size).floor
|
45
46
|
size_last_packet = size % packet_size
|
46
|
-
|
47
|
+
startTime = Time.now
|
47
48
|
#number_complet_packet
|
48
|
-
for i in 0..number_complet_packet-1 do
|
49
|
-
data.push(*self.ahb.readBlock(i*4*packet_size+address,packet_size))
|
50
|
-
puts "Read #{packet_size} KB : #{i}"
|
49
|
+
for i in 0..number_complet_packet - 1 do
|
50
|
+
data.push(*self.ahb.readBlock(i * 4 * packet_size + address, packet_size))
|
51
|
+
#puts "Read #{packet_size} KB : #{i}"
|
52
|
+
HardsploitAPI.instance.consoleProgress(
|
53
|
+
percent: 100 * (i + 1) / (number_complet_packet + (size_last_packet.zero? ? 0 : 1)),
|
54
|
+
startTime: startTime,
|
55
|
+
endTime: Time.new
|
56
|
+
)
|
51
57
|
end
|
52
58
|
#Last partial packet
|
53
59
|
if size_last_packet > 0 then
|
54
60
|
data.push(*self.ahb.readBlock(number_complet_packet*4*packet_size+address,size_last_packet))
|
55
|
-
puts "Read last packet : #{size_last_packet} packet of 4 bytes"
|
61
|
+
#puts "Read last packet : #{size_last_packet} packet of 4 bytes"
|
62
|
+
HardsploitAPI.instance.consoleProgress(
|
63
|
+
percent: 100,
|
64
|
+
startTime: startTime,
|
65
|
+
endTime: Time.new
|
66
|
+
)
|
56
67
|
end
|
57
68
|
return data
|
58
69
|
end
|
@@ -62,19 +73,25 @@ attr_accessor :ahb
|
|
62
73
|
packet_size = 1024 #1024
|
63
74
|
number_complet_packet = (data.size/packet_size).floor
|
64
75
|
size_last_packet = data.size % packet_size
|
65
|
-
|
66
|
-
ahb.csw(2, 1) # 16-bit packed incrementing addressing
|
76
|
+
startTime = Time.now
|
77
|
+
#ahb.csw(2, 1) # 16-bit packed incrementing addressing
|
67
78
|
#number_complet_packet
|
68
79
|
for i in 0..number_complet_packet-1 do
|
69
80
|
self.ahb.writeBlock(address+i*packet_size,data[i*packet_size..i*packet_size-1+packet_size])
|
70
|
-
puts "Write #{packet_size} KB : #{i}"
|
81
|
+
#puts "Write #{packet_size} KB : #{i}"
|
82
|
+
HardsploitAPI.instance.consoleProgress(
|
83
|
+
percent: 100 * (i + 1) / (number_complet_packet + (size_last_packet.zero? ? 0 : 1)),
|
84
|
+
startTime: startTime,
|
85
|
+
endTime:Time.new
|
86
|
+
)
|
71
87
|
end
|
72
88
|
#Last partial packet
|
73
89
|
if size_last_packet > 0 then
|
74
90
|
self.ahb.writeBlock(address+number_complet_packet*packet_size,data[number_complet_packet*packet_size..number_complet_packet*packet_size+size_last_packet])
|
75
|
-
puts "Write last packet : #{size_last_packet} packet"
|
91
|
+
#puts "Write last packet : #{size_last_packet} packet"
|
92
|
+
HardsploitAPI.instance.consoleProgress(percent:100,startTime:startTime,endTime:Time.new)
|
76
93
|
end
|
77
|
-
ahb.csw(1, 2) #
|
94
|
+
ahb.csw(1, 2) # set to default 32-bit incrementing addressing
|
78
95
|
end
|
79
96
|
|
80
97
|
def flashUnlock
|
@@ -83,17 +100,17 @@ attr_accessor :ahb
|
|
83
100
|
@ahb.writeWord(0x40022004, 0xCDEF89AB)
|
84
101
|
end
|
85
102
|
def flashErase
|
86
|
-
|
103
|
+
HardsploitAPI.instance.consoleInfo "Flash unlock"
|
87
104
|
flashUnlock
|
88
105
|
# start the mass erase
|
89
106
|
@ahb.writeWord(0x40022010, 0x00000204)
|
90
107
|
@ahb.writeWord(0x40022010, 0x00000244)
|
91
108
|
# check the BSY flag
|
92
109
|
while (@ahb.readWord(0x4002200C) & 1) == 1
|
93
|
-
|
110
|
+
HardsploitAPI.instance.consoleInfo "waiting for erase completion..."
|
94
111
|
end
|
95
112
|
@ahb.writeWord(0x40022010, 0x00000200)
|
96
|
-
|
113
|
+
HardsploitAPI.instance.consoleInfo "Finish unlock flash"
|
97
114
|
end
|
98
115
|
def flashProgram
|
99
116
|
@ahb.writeWord(0x40022010, 0x00000201)
|
@@ -0,0 +1,196 @@
|
|
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_UART
|
11
|
+
public
|
12
|
+
def initialize(baud_rate:,word_width:,use_parity_bit:,parity_type:,nb_stop_bits:,idle_line_level:)
|
13
|
+
#to be sure the singleton was initialize
|
14
|
+
HardsploitAPI.instance
|
15
|
+
self.baud_rate = baud_rate
|
16
|
+
self.word_width = word_width
|
17
|
+
self.use_parity_bit = use_parity_bit
|
18
|
+
self.parity_type = parity_type
|
19
|
+
self.nb_stop_bits = nb_stop_bits
|
20
|
+
self.idle_line_level = idle_line_level
|
21
|
+
setSettings
|
22
|
+
|
23
|
+
@payload_TX = Array.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def baud_rate
|
27
|
+
return 150000000 / @baud_rate
|
28
|
+
end
|
29
|
+
|
30
|
+
def baud_rate=(baud_rate)
|
31
|
+
if (baud_rate >= 2400) and (baud_rate <= 1036800) then
|
32
|
+
@baud_rate = 150000000 / baud_rate
|
33
|
+
else
|
34
|
+
raise HardsploitAPI::ERROR::UART_WrongSettings
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def word_width
|
39
|
+
return @word_width
|
40
|
+
end
|
41
|
+
|
42
|
+
def word_width=(word_width)
|
43
|
+
if (word_width >= 5) and (word_width <= 8) then
|
44
|
+
@word_width = word_width
|
45
|
+
else
|
46
|
+
raise HardsploitAPI::ERROR::UART_WrongSettings
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def use_parity_bit
|
51
|
+
return @use_parity_bit
|
52
|
+
end
|
53
|
+
|
54
|
+
def use_parity_bit=(use_parity_bit)
|
55
|
+
if (use_parity_bit >= 0) and (use_parity_bit <= 1) then
|
56
|
+
@use_parity_bit = use_parity_bit
|
57
|
+
else
|
58
|
+
raise HardsploitAPI::ERROR::UART_WrongSettings
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def parity_type
|
63
|
+
return @parity_type
|
64
|
+
end
|
65
|
+
|
66
|
+
def parity_type=(parity_type)
|
67
|
+
if (parity_type >= 0) and (parity_type <= 1) then
|
68
|
+
@parity_type = parity_type
|
69
|
+
else
|
70
|
+
raise HardsploitAPI::ERROR::UART_WrongSettings
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def nb_stop_bits
|
75
|
+
return @nb_stop_bits
|
76
|
+
end
|
77
|
+
|
78
|
+
def nb_stop_bits=(nb_stop_bits)
|
79
|
+
if (nb_stop_bits >= 1) and (nb_stop_bits <= 2) then
|
80
|
+
@nb_stop_bits = nb_stop_bits
|
81
|
+
else
|
82
|
+
raise HardsploitAPI::ERROR::UART_WrongSettings
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def idle_line_level
|
87
|
+
return @idle_line_level
|
88
|
+
end
|
89
|
+
|
90
|
+
def idle_line_level=(idle_line_level)
|
91
|
+
if (idle_line_level >= 0) and (idle_line_level <= 1) then
|
92
|
+
@idle_line_level = idle_line_level
|
93
|
+
else
|
94
|
+
raise HardsploitAPI::ERROR::UART_WrongSettings
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# write
|
99
|
+
# * +payload+:: Byte array want to send
|
100
|
+
# * Return nothing
|
101
|
+
def write(payload:)
|
102
|
+
if ( (@payload_TX.size + payload.size) > 4000) then
|
103
|
+
raise HardsploitAPI::ERROR::UART_WrongTxPayloadSize
|
104
|
+
end
|
105
|
+
@payload_TX.concat payload #Add data
|
106
|
+
end
|
107
|
+
|
108
|
+
# sendAndReceived ( send and receive)
|
109
|
+
# First write data if needed and refresh (data are sent and reveived data if needed) and you obtain available data
|
110
|
+
# * Return nothing
|
111
|
+
def sendAndReceived
|
112
|
+
packet = HardsploitAPI.prepare_packet
|
113
|
+
packet.push 0x20 #Send command
|
114
|
+
packet.concat @payload_TX
|
115
|
+
|
116
|
+
begin
|
117
|
+
tmp = HardsploitAPI.instance.sendAndReceiveDATA(packet,1000)
|
118
|
+
rescue
|
119
|
+
raise HardsploitAPI::ERROR::USB_ERROR
|
120
|
+
end
|
121
|
+
|
122
|
+
@payload_TX.clear
|
123
|
+
#remove header (4 bytes 2 for size 2 for type of command 1 dummy byte)
|
124
|
+
return tmp.drop(5)
|
125
|
+
end
|
126
|
+
|
127
|
+
# enableMeasureBaudRate
|
128
|
+
#
|
129
|
+
# *
|
130
|
+
def enableMeasureBaudRate
|
131
|
+
packet = HardsploitAPI.prepare_packet
|
132
|
+
packet.push 0x41 # command
|
133
|
+
begin
|
134
|
+
tmp = HardsploitAPI.instance.sendAndReceiveDATA(packet,1000)
|
135
|
+
rescue
|
136
|
+
raise HardsploitAPI::ERROR::USB_ERROR
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# disableMeasureBaudRate
|
141
|
+
#
|
142
|
+
# *
|
143
|
+
def disableMeasureBaudRate
|
144
|
+
packet = HardsploitAPI.prepare_packet
|
145
|
+
packet.push 0x40 # command
|
146
|
+
begin
|
147
|
+
tmp = HardsploitAPI.instance.sendAndReceiveDATA(packet,1000)
|
148
|
+
rescue
|
149
|
+
raise HardsploitAPI::ERROR::USB_ERROR
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# measureBaudRate
|
154
|
+
#
|
155
|
+
# * Return 32 bits period
|
156
|
+
def measureBaudRate
|
157
|
+
packet = HardsploitAPI.prepare_packet
|
158
|
+
packet.push 0x30 # command
|
159
|
+
|
160
|
+
begin
|
161
|
+
tmp = HardsploitAPI.instance.sendAndReceiveDATA(packet,1000)
|
162
|
+
rescue
|
163
|
+
raise HardsploitAPI::ERROR::USB_ERROR
|
164
|
+
end
|
165
|
+
#remove header (4 bytes 2 for size 2 for type of command)
|
166
|
+
tmp = tmp.drop(4)
|
167
|
+
period = tmp[0] + (tmp[1] << 8 ) + (tmp[2] << 16 ) + (tmp[3] << 24 )
|
168
|
+
period = period * 33.33*(10**-9) #s
|
169
|
+
if period > 0 then
|
170
|
+
return (1 / period).to_i
|
171
|
+
else
|
172
|
+
return 0
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# settings
|
177
|
+
# * Return nothing
|
178
|
+
def setSettings
|
179
|
+
packet = HardsploitAPI.prepare_packet
|
180
|
+
packet.push 0x00 #Settings command
|
181
|
+
packet.push ((@parity_type & 0b1) << 7) || ((@use_parity_bit & 0b1) << 6) || ((@nb_stop_bits & 0b11) << 4) || (@word_width & 0b1111)
|
182
|
+
packet.push @idle_line_level & 1
|
183
|
+
packet.push HardsploitAPI.lowByte(word: @baud_rate)
|
184
|
+
packet.push HardsploitAPI.highByte(word: @baud_rate)
|
185
|
+
|
186
|
+
begin
|
187
|
+
HardsploitAPI.instance.sendPacket packet
|
188
|
+
sleep(1)
|
189
|
+
# tmp= HardsploitAPI.instance.receiveDATA(1000)
|
190
|
+
#remove header (4 bytes 2 for size 2 for type of command)
|
191
|
+
# return tmp.bytes.drop(4)
|
192
|
+
rescue
|
193
|
+
raise HardsploitAPI::ERROR::USB_ERROR
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|