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
co-authored by Claude Opus 4.8
Коммит ae36c3b729
72 изменённых файлов: 24124 добавлений и 0 удалений
+40
Просмотреть файл
@@ -0,0 +1,40 @@
import io
data = open(r"C:/Users/vikto/Documents/Claude/rt-4d/radio-spi-dump.bin","rb").read()
out=io.open(r"C:/Users/vikto/Documents/Claude/rt-4d/analyze/out10.txt","w",encoding="utf-8")
# Render candidate glyphs at 0x19c000 as bitmaps to confirm font.
# Try 16x16 (32 bytes/glyph) and 12x12 etc.
def render(off, w_bytes, rows, label):
out.write("glyph @%#x %dx%d bytes/row=%d:\n"%(off,rows,w_bytes*8,w_bytes))
for r in range(rows):
line=""
for cb in range(w_bytes):
b=data[off+r*w_bytes+cb]
for bit in range(8):
line += "#" if (b>>bit)&1 else "."
out.write(line+"\n")
out.write("\n")
# 16x16 = 2 bytes/row, 16 rows = 32 bytes
for g in range(6):
render(0x19c000+g*32, 2, 16, "16x16 glyph %d"%g)
# Occupancy across 0x198000..0x242000: how much real font data
seg=data[0x198000:0x242000]
from collections import Counter
c=Counter(seg)
out.write("region 0x198000-0x242000 total=%d ff=%d zero=%d other=%d\n"%(len(seg),c[0xff],c[0],len(seg)-c[0xff]-c[0]))
# The font is likely: big CJK 16x16 bitmap set. count of 32-byte glyphs that fit in nonFF area
# Check periodicity of 32 in the 0x19c000+ area by counting nonzero glyph cells
out.write("\nSample far into region 0x200000:\n")
def hx(off,n=48):
s=""
for j in range(0,n,16):
ch=data[off+j:off+j+16]
s+="%08x %s\n"%(off+j,' '.join('%02x'%b for b in ch))
return s
out.write(hx(0x200000,0x40))
out.write("\n0x240000:\n"+hx(0x240000,0x40))
out.close()
print("done")