- Полный RE стока V3.25 (Cortex-M4F) + FM100B: карта памяти, протокол, codeplug, UI-архитектура - Русификация: свой CP1251-шрифт + патч рендера, перевод меню и надписей, ребренд Ru-4D V3.25 - Блюпринт переделки UI + C-тулчейн (clang thumbv7em), доказан инъекцией - Готовые флешеры: WebSerial .html и Windows .exe со вшитой прошивкой - Дамп SPI рации, стоковая прошивка, инструменты сборки Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
32 строки
1.1 KiB
Python
32 строки
1.1 KiB
Python
import struct
|
|
|
|
DUMP = r"C:/Users/vikto/Documents/Claude/rt-4d/radio-spi-dump.bin"
|
|
with open(DUMP, "rb") as f:
|
|
cal = f.read(0x1000)
|
|
|
|
base = 0x20
|
|
REC = 0x70
|
|
|
|
# HEADER 0x00-0x1f
|
|
hdr = cal[0:0x20]
|
|
print("HEADER bytes:", " ".join(f"{b:02x}" for b in hdr))
|
|
# try interpret as u16 LE and u32 LE
|
|
u16 = struct.unpack("<16H", hdr)
|
|
print("as u16 LE:", u16)
|
|
u32 = struct.unpack("<8I", hdr)
|
|
print("as u32 LE:", [hex(x) for x in u32])
|
|
# The tail 3a 3c 3f 41 44 47 4a 4b 4c 4d 4e 4f 50 51 52 80 looks like a small table of 16 ascending bytes
|
|
print("\nheader bytes 0x10-0x1f (ascending table?):", [hex(b) for b in hdr[0x10:0x20]])
|
|
print("diffs:", [hdr[0x10:0x20][i+1]-hdr[0x10:0x20][i] for i in range(15)])
|
|
|
|
# Dump all 15 populated records fully, grouped by 8-byte lines with offset labels
|
|
print("\n\n==== 15 populated records (each 0x70) ====")
|
|
for idx in range(15):
|
|
off = base+idx*REC
|
|
r = cal[off:off+REC]
|
|
print(f"\n### REC {idx} @0x{off:03x} b0={r[0]:02x} b1={r[1]:02x}")
|
|
for i in range(0, REC, 16):
|
|
row = r[i:i+16]
|
|
hexs = " ".join(f"{b:02x}" for b in row)
|
|
print(f" +{i:02x}: {hexs}")
|