Block

Block provides us with a binary dump named dump.bin and a capture of a serial communication sequence.logicdata. We can use Saleae Logic to open the sequence.logicdata file and analyze it. After interpreting the file as an 'async serial' communication with even parity bits we see some useful data:

Which can then be formatted into the following:

Init W25Q128FV SPI Comm..xy sector:x, page:y, page_offset:xy
14
17
27
11
04
15
19
40
21
51
18
06
49
02
31
50
28
41
32
35
24
39
42
36
45
03
43
20
00
01
09
44
38
07
22
08
13
23
37
10
47
05
33
26
46
25

Which, after some fiddling I found that the first digit of each number represented the sector to read from, the lower digit represented the page to read from, and the two digits combined is the offset into the page to read from.

Putting this all into a python script:

reads = [14, 17, 27, 11, 4, 15, 19, 40, 21, 51, 18, 6, 49, 2,
         31, 50, 28, 41, 32, 35, 24, 39, 42, 36, 45, 3, 43,
         20, 0, 1, 9, 44, 38, 7, 22, 8, 13, 23, 37, 10, 47,
         5, 33, 26, 46, 25
         ]

with open("dump.bin", "rb") as f:
    binary = f.read()

sector_size = 4096
page_size = 256

out = []

for v in reads:
    sector = v // 10
    page = v % 10
    idx = (sector_size * sector +
            page_size * page +
            v)
    out.append(binary[idx])

print("".join(map(chr, out)))

Running this results in: