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

45 строки
1.7 KiB
Python

import wave,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/out8.txt","w",encoding="utf-8")
# BLOB2 audio extent
i=0x352000; run=0; endaud=None
while i<0x3e0000:
if data[i]==0xff:
run+=1
if run>=4096: endaud=i-run+1; break
else: run=0
i+=1
out.write("audio region 0x352000 .. %s (len %#x)\n"%(hex(endaud),endaud-0x352000))
# check for an index/header at very start of blob2 or just before it (0x351000?)
def hx(off,n=64):
s=""
for j in range(0,n,16):
ch=data[off+j:off+j+16]
s+="%08x %s %s\n"%(off+j,' '.join('%02x'%b for b in ch),''.join(chr(b) if 32<=b<127 else '.' for b in ch))
return s
out.write("\nBefore audio (0x351f80):\n"+hx(0x351f80,0x80))
# 8-bit unsigned PCM -> wav, first 64KB as a listen-test
seg=data[0x352000:0x352000+0x10000]
w=wave.open(r"C:/Users/vikto/Documents/Claude/rt-4d/analyze/blob2_sample.wav","wb")
w.setnchannels(1); w.setsampwidth(1); w.setframerate(8000)
w.writeframes(seg)
w.close()
out.write("\nwrote blob2_sample.wav (8kHz u8, 64KB)\n")
# statistics: measure how 'audio-like' - mean near 128, derivative small
import statistics
vals=list(seg)
out.write("mean=%.1f min=%d max=%d stdev=%.1f\n"%(statistics.mean(vals),min(vals),max(vals),statistics.pstdev(vals)))
# fraction of adjacent-sample diffs <=8 (smoothness)
sm=sum(1 for k in range(len(vals)-1) if abs(vals[k]-vals[k+1])<=8)
out.write("smoothness (|diff|<=8): %.3f\n"%(sm/(len(vals)-1)))
# Total audio size and rough duration at 8k/16k
alen=endaud-0x352000
out.write("audio bytes=%d @8kHz=%.1fs @16kHz=%.1fs\n"%(alen,alen/8000,alen/16000))
out.close()
print("done")