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,32 @@
|
||||
import io,sys
|
||||
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/out7.txt","w",encoding="utf-8")
|
||||
|
||||
seg=data[0x198000:0x19b800]
|
||||
txt=seg.decode('gb2312', errors='replace')
|
||||
out.write("BLOB1 GB2312 first 200 chars:\n")
|
||||
out.write(txt[:200]+"\n\n")
|
||||
out.write("BLOB1 GB2312 chars 3000..3080:\n")
|
||||
out.write(txt[3000:3080]+"\n\n")
|
||||
|
||||
# BLOB3 filter FFFF and 0
|
||||
seg3=data[0x3f0000:0x400000]
|
||||
cps=[]
|
||||
for i in range(0,len(seg3)-1,2):
|
||||
v=(seg3[i]<<8)|seg3[i+1]
|
||||
cps.append(v)
|
||||
real=[v for v in cps if v not in (0,0xffff)]
|
||||
out.write("BLOB3 real cps count: %d\n"%len(real))
|
||||
out.write("BLOB3 first 40 chars: "+''.join(chr(v) for v in real[:40])+"\n")
|
||||
out.write("BLOB3 range: %04x..%04x\n"%(min(real),max(real)))
|
||||
asc=all(real[i]<=real[i+1] for i in range(len(real)-1))
|
||||
out.write("BLOB3 ascending(ignoring pad): %s\n\n"%asc)
|
||||
|
||||
# Does BLOB1's GB2312 chars correspond to BLOB3 unicode set? Convert BLOB1 chars to codepoints
|
||||
b1cps=[ord(c) for c in txt if ord(c)>0x2000]
|
||||
out.write("BLOB1 first 40 unicode cps: "+' '.join('%04x'%c for c in b1cps[:40])+"\n")
|
||||
out.write("BLOB1 unique cps: %d, BLOB3 unique: %d\n"%(len(set(b1cps)),len(set(real))))
|
||||
inter=set(b1cps)&set(real)
|
||||
out.write("intersection size: %d\n"%len(inter))
|
||||
out.close()
|
||||
print("done")
|
||||
Ссылка в новой задаче
Block a user