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>
Этот коммит содержится в:
@@ -0,0 +1,27 @@
|
||||
import struct, sys, io
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
||||
DUMP = r"C:/Users/vikto/Documents/Claude/rt-4d/radio-spi-dump.bin"
|
||||
data = open(DUMP, "rb").read()
|
||||
def hx(b): return " ".join(f"{x:02X}" for x in b)
|
||||
def bcd(bb):
|
||||
if all(b==0xFF for b in bb): return 0
|
||||
r=0
|
||||
for bv in reversed(bb):
|
||||
hi=(bv>>4)&0xF; lo=bv&0xF
|
||||
if hi==0xF:hi=0
|
||||
if lo==0xF:lo=0
|
||||
r=r*100+hi*10+lo
|
||||
return r
|
||||
CT=0x05E000
|
||||
STRIDE=21
|
||||
print("21-byte contact records @0x5E000:")
|
||||
for i in range(4):
|
||||
off=CT+i*STRIDE
|
||||
d=data[off:off+STRIDE]
|
||||
typ=d[0]
|
||||
idraw=d[1:5]
|
||||
name=bytes(b for b in d[5:21] if b!=0xFF and b!=0).decode('gbk','ignore')
|
||||
print(f"rec{i} @0x{off:06X} type={typ:02X} idbytes={hx(idraw)} bcd={bcd(idraw)} le={struct.unpack('<I',idraw)[0]} name={name!r}")
|
||||
print(" raw:", hx(d))
|
||||
# Confirm All Call id: AA AA AA AA. In DMR all-call id=0xFFFFFF(16777215). AA is not FF...
|
||||
# maybe type: 0=private,1=group,2=allcall. All Call rec type=02 ✓, TG6/TG666 type=01=group ✓
|
||||
Ссылка в новой задаче
Block a user