Files
viktorиClaude Opus 4.8 ae36c3b729 RT-4D: реверс прошивки, русификация, кастомный UI, флешеры
- Полный 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>
2026-07-08 15:47:22 +09:00

36 строки
1.3 KiB
Python

data = open(r"C:/Users/vikto/Documents/Claude/rt-4d/radio-spi-dump.bin","rb").read()
def hexdump(off, n=128):
for i in range(0, n, 16):
chunk = data[off+i:off+i+16]
h = ' '.join('%02x'%b for b in chunk)
a = ''.join(chr(b) if 32<=b<127 else '.' for b in chunk)
print('%08x %-47s %s'%(off+i, h, a))
# The transition zones between 0x80 runs in BLOB2 - dump around a boundary
print("### BLOB2 boundary at ~0x352845 (0x80 run ends here)")
hexdump(0x352840-0x20, 0x120)
print("\n### BLOB2 boundary at 0x353b25")
hexdump(0x353b00, 0x80)
# check byte histogram of a single 'record' 0x352000..0x353b25
from collections import Counter
c=Counter(data[0x352000:0x353b25])
print("\nBLOB2 record0 (0x352000-0x353b25) len", 0x353b25-0x352000, "hist top:", c.most_common(10))
# BLOB1 - the 14KB dense CJK. Check for structure: is it pure 2-byte GBK codes?
print("\n### BLOB1 0x198000 first bytes stats")
seg=data[0x198000:0x19b800]
# count high-bit-set bytes
hi=sum(1 for b in seg if b>=0x80)
print("len",len(seg),"high-bit bytes",hi, "ratio", hi/len(seg))
# Interpret as GB2312: pairs where b0 in 0xA1..0xF7
pairs=0; valid=0
for i in range(0,len(seg)-1,2):
b0,b1=seg[i],seg[i+1]
pairs+=1
if 0xa1<=b0<=0xf7 and 0xa1<=b1<=0xfe:
valid+=1
print("2-byte pairs",pairs,"valid GB2312 lvl",valid, "ratio",valid/pairs)