- Полный 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>
45 строки
1.7 KiB
Python
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")
|