hardsploit_gui 2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +22 -0
  3. data/Rakefile +1 -0
  4. data/bin/hardsploit_gui +3 -0
  5. data/lib/Firmware/FPGA/I2C/I2C_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_I2C_INTERACT.rpd +0 -0
  6. data/lib/Firmware/FPGA/PARALLEL/NO_MUX_PARALLEL_MEMORY/HARDSPLOIT_FIRMWARE_FPGA_NO_MUX_PARALLEL_MEMORY.rpd +0 -0
  7. data/lib/Firmware/FPGA/SPI/SPI_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SPI_INTERACT.rpd +0 -0
  8. data/lib/Firmware/FPGA/SWD/SWD_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_SWD_INTERACT.rpd +0 -0
  9. data/lib/Firmware/FPGA/TEST/TEST_INTERACT/HARDSPLOIT_FIRMWARE_FPGA_TEST_INTERACT.rpd +0 -0
  10. data/lib/Firmware/FPGA/VersionFPGA.rb +5 -0
  11. data/lib/Firmware/UC/HARDSPLOIT_FIRMWARE_UC.bin +0 -0
  12. data/lib/Firmware/UC/VersionUC.rb +12 -0
  13. data/lib/HardsploitAPI/HardsploitAPI.rb +134 -0
  14. data/lib/HardsploitAPI/HardsploitAPI_CONSTANT.rb +145 -0
  15. data/lib/HardsploitAPI/HardsploitAPI_FIRMWARE.rb +311 -0
  16. data/lib/HardsploitAPI/HardsploitAPI_I2C.rb +218 -0
  17. data/lib/HardsploitAPI/HardsploitAPI_NO_MUX_PARALLELE_MEMORY.rb +229 -0
  18. data/lib/HardsploitAPI/HardsploitAPI_SPI.rb +179 -0
  19. data/lib/HardsploitAPI/HardsploitAPI_TEST_INTERACT.rb +98 -0
  20. data/lib/HardsploitAPI/HardsploitAPI_USB_COMMUNICATION.rb +149 -0
  21. data/lib/HardsploitAPI/LICENSE.txt +674 -0
  22. data/lib/HardsploitAPI/README.md +22 -0
  23. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD.rb +249 -0
  24. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_DEBUG.rb +102 -0
  25. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_MEM_AP.rb +78 -0
  26. data/lib/HardsploitAPI/SWD/HardsploitAPI_SWD_STM32.rb +104 -0
  27. data/lib/HardsploitAPI/TRADEMARK +3 -0
  28. data/lib/LICENSE.txt +674 -0
  29. data/lib/README.md +22 -0
  30. data/lib/TRADEMARK +3 -0
  31. data/lib/class/Chip_editor.rb +448 -0
  32. data/lib/class/Command_editor.rb +268 -0
  33. data/lib/class/Command_table.rb +239 -0
  34. data/lib/class/Console.rb +28 -0
  35. data/lib/class/Export_manager.rb +124 -0
  36. data/lib/class/Firmware.rb +29 -0
  37. data/lib/class/Generic_commands.rb +275 -0
  38. data/lib/class/HardsploitGUI.rb +462 -0
  39. data/lib/class/I2C/I2c_command.rb +48 -0
  40. data/lib/class/I2C/I2c_export.rb +121 -0
  41. data/lib/class/I2C/I2c_import.rb +92 -0
  42. data/lib/class/I2C/I2c_settings.rb +117 -0
  43. data/lib/class/PARALLEL/Parallel_export.rb +146 -0
  44. data/lib/class/PARALLEL/Parallel_import.rb +88 -0
  45. data/lib/class/PARALLEL/Parallel_settings.rb +102 -0
  46. data/lib/class/SPI/Spi_export.rb +141 -0
  47. data/lib/class/SPI/Spi_import.rb +112 -0
  48. data/lib/class/SPI/Spi_settings.rb +90 -0
  49. data/lib/class/Wire_helper.rb +246 -0
  50. data/lib/db/associations.rb +125 -0
  51. data/lib/db/hs.db +0 -0
  52. data/lib/gui/gui_chip_editor.rb +355 -0
  53. data/lib/gui/gui_chip_management.rb +372 -0
  54. data/lib/gui/gui_command_editor.rb +218 -0
  55. data/lib/gui/gui_export_manager.rb +93 -0
  56. data/lib/gui/gui_generic_commands.rb +164 -0
  57. data/lib/gui/gui_generic_export.rb +148 -0
  58. data/lib/gui/gui_generic_import.rb +126 -0
  59. data/lib/gui/gui_i2c_command.rb +115 -0
  60. data/lib/gui/gui_i2c_settings.rb +201 -0
  61. data/lib/gui/gui_parallel_settings.rb +194 -0
  62. data/lib/gui/gui_spi_import.rb +126 -0
  63. data/lib/gui/gui_spi_settings.rb +187 -0
  64. data/lib/gui/gui_wire_helper.rb +99 -0
  65. data/lib/gui_designer/gui_chip_editor.ui +553 -0
  66. data/lib/gui_designer/gui_chip_management.ui +842 -0
  67. data/lib/gui_designer/gui_command_editor.ui +347 -0
  68. data/lib/gui_designer/gui_export_manager.ui +115 -0
  69. data/lib/gui_designer/gui_generic_commands.ui +258 -0
  70. data/lib/gui_designer/gui_generic_export.ui +179 -0
  71. data/lib/gui_designer/gui_generic_import.ui +142 -0
  72. data/lib/gui_designer/gui_i2c_command.ui +145 -0
  73. data/lib/gui_designer/gui_i2c_settings.ui +261 -0
  74. data/lib/gui_designer/gui_parallel_settings.ui +244 -0
  75. data/lib/gui_designer/gui_processing.ui +81 -0
  76. data/lib/gui_designer/gui_spi_settings.ui +321 -0
  77. data/lib/gui_designer/gui_wire_helper.ui +117 -0
  78. data/lib/hardsploit.rb +122 -0
  79. data/lib/images/search.png +0 -0
  80. data/lib/logs/error.log +0 -0
  81. metadata +236 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 030b1c7ca30ebc3603c750b93147ad1a7b2d407f
4
+ data.tar.gz: 7595d0cc31b7a3fab274252985577064e581ebb6
5
+ SHA512:
6
+ metadata.gz: 058934a2bef35c81153d96ce0b21d12069c6abe32cbb5f32166f9a3777d865b5761cea0dcaaca56bc0477bba4fb047875d3f2929fe7b23388e247c7fa427f2ea
7
+ data.tar.gz: 9586a89c0be2be5df3e39754711563c3885e4506c7bf8d7f4f68ed2005988fe42c511555c73c4aa7842ff2ee4b68a98fe01569cebd317b613255d814dbf27530
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # Hardsploit
2
+
3
+ The essential security auditing tool for Internet of Things devices you'll need in your toolbox
4
+
5
+ ### [GO TO HARDSPLOIT](http://www.hardsploit.io)
6
+
7
+ TO LEARN ABOUT IT
8
+
9
+ ### [GO TO SHOP](https://www.shop-hardsploit.com)
10
+ TO BUY
11
+
12
+ ### [GO TO WIKI](http://wiki.hardsploit.io)
13
+
14
+ TO UNDERSTAND HOW USE IT
15
+
16
+ ### [GO TO FORUM](http://forum.hardsploit.io)
17
+
18
+ FOR SUPPORT / HELP
19
+
20
+ ### [GO TO BUG TRACKER] (http://issues.hardsploit.io)
21
+
22
+ FOR BUGS OR IMPROVEMENTS
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require "hardsploit"
3
+ Hardsploit_GUI.new
@@ -0,0 +1,5 @@
1
+ class VersionFPGA
2
+ module VERSION_FPGA
3
+ FPGA = "V1.1.0"
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ #===================================================
2
+ # Hardsploit UC - By Opale Security
3
+ # www.opale-security.com || www.hardsploit.io
4
+ # License: GNU General Public License v3
5
+ # License URI: http://www.gnu.org/licenses/gpl.txt
6
+ #===================================================
7
+
8
+ class VersionUC
9
+ module VERSION_UC
10
+ UC = "V1.0.2"
11
+ end
12
+ end
@@ -0,0 +1,134 @@
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
+
19
+ require 'thread'
20
+
21
+ class HardsploitAPI
22
+ public
23
+
24
+ attr_accessor :dev
25
+
26
+ include USB
27
+ include USB_STATE
28
+ include USB_COMMAND
29
+
30
+ # Initialize the HARDSPLOIT API
31
+ # * +callbackData+:: callback to return data for dump function
32
+ # * +callbackInfo+:: callback to get back general information
33
+ # * +callbackError+:: callback not used for the moment and transform into progressCallback soon
34
+ # * +callbackSpeedOfTransfert+:: callback to get back +information about speed+
35
+ def initialize(*args)
36
+ parametters = HardsploitAPI.checkParametters(["callbackData","callbackInfo","callbackError","callbackSpeedOfTransfert"],args)
37
+ @callbackData = parametters[:callbackData]
38
+ @callbackInfo = parametters[:callbackInfo]
39
+ @callbackError = parametters[:callbackError]
40
+ @callbackSpeedOfTransfert = parametters[:callbackSpeedOfTransfert]
41
+
42
+ @packet_send = Array.new
43
+ @usb = LIBUSB::Context.new
44
+ @device = nil
45
+ end
46
+
47
+ # Set custom value to wiring led
48
+ # * +value+:: 64 bits (8x8 Bytes) values to represent led (PortH PortG PortF PortE PortD PortC PortB PortA)
49
+ def setWiringLeds(*args)
50
+ parametters = HardsploitAPI.checkParametters(["value"],args)
51
+ val = parametters[:value]
52
+
53
+ packet = Array.new
54
+ packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
55
+ packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
56
+ packet.push HardsploitAPI.lowByte(USB_COMMAND::FPGA_COMMAND)
57
+ packet.push HardsploitAPI.highByte(USB_COMMAND::FPGA_COMMAND)
58
+
59
+ packet.push 0x23 #Command SPI write wiring led
60
+
61
+ packet.push HardsploitAPI.reverseBit((val & 0x00000000000000FF) >> 0)
62
+ packet.push HardsploitAPI.reverseBit((val & 0x000000000000FF00) >> 8 )
63
+ packet.push HardsploitAPI.reverseBit((val & 0x0000000000FF0000) >> 16 )
64
+ packet.push HardsploitAPI.reverseBit((val & 0x00000000FF000000) >> 24 )
65
+ packet.push HardsploitAPI.reverseBit((val & 0x000000FF00000000) >> 32 )
66
+ packet.push HardsploitAPI.reverseBit((val & 0x0000FF0000000000) >> 40 )
67
+ packet.push HardsploitAPI.reverseBit((val & 0x00FF000000000000) >> 48 )
68
+ packet.push HardsploitAPI.reverseBit((val & 0xFF00000000000000) >> 56 )
69
+
70
+ return self.sendPacket(packet)
71
+ end
72
+
73
+ # Obtaint the version number of the board
74
+ def getVersionNumber
75
+ packet = Array.new
76
+ packet.push 0 #low byte of lenght of trame refresh automaticly before send by usb
77
+ packet.push 0 #high byte of lenght of trame refresh automaticly before send by usb
78
+ packet.push HardsploitAPI.lowByte(USB_COMMAND::GET_VERSION_NUMBER)
79
+ packet.push HardsploitAPI.highByte(USB_COMMAND::GET_VERSION_NUMBER)
80
+
81
+ #remove header
82
+ version_number = sendAndReceiveDATA(packet,1000).drop(4)
83
+ if version_number.size < 20 then #if size more thant 20 char error when reading version number
84
+ return version_number.pack('U*')
85
+ else
86
+ return "BAD VERSION NUMBER"
87
+ end
88
+
89
+ end
90
+
91
+
92
+
93
+ def self.reverseBit(byte)
94
+ return byte.to_s(2).rjust(8, "0").reverse.to_i(2)
95
+ end
96
+
97
+ def self.checkParametters(arr_parametters,*args)
98
+ params = Hash.new
99
+ if args[0][0].class == Hash then
100
+ hash_args = args[0][0]
101
+ arr_parametters.each do |param|
102
+ if hash_args[param.to_sym] == nil then
103
+ raise "Wrong parametters, you need to specify #{param.to_sym}"
104
+ else
105
+ params[param.to_sym] = hash_args[param.to_sym]
106
+ end
107
+ end
108
+ else
109
+ if args[0].length == arr_parametters.size then
110
+ args[0].each_with_index do |value,key|
111
+ params[arr_parametters[key].to_sym] = value
112
+ end
113
+ else
114
+ raise "Error : method need #{arr_parametters.size} parametters"
115
+ end
116
+ end
117
+ return params
118
+ end
119
+
120
+ def consoleError(value)
121
+ @callbackError.call(value)
122
+ end
123
+ def consoleData(value)
124
+ @callbackData.call(value)
125
+ end
126
+ def consoleSpeed(value)
127
+ @callbackSpeedOfTransfert.call(value)
128
+ end
129
+ def consoleInfo(value)
130
+ @callbackInfo.call(value)
131
+ end
132
+
133
+
134
+ end
@@ -0,0 +1,145 @@
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.1.0"
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
@@ -0,0 +1,311 @@
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| self.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| self.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