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,37 @@
|
||||
data = open(r"C:/Users/vikto/Documents/Claude/rt-4d/radio-spi-dump.bin","rb").read()
|
||||
|
||||
def region_stats(start, end, label):
|
||||
seg = data[start:end]
|
||||
from collections import Counter
|
||||
c = Counter(seg)
|
||||
ff = c.get(0xff,0); zero=c.get(0x00,0); e80=c.get(0x80,0)
|
||||
print(f"{label} {start:#08x}-{end:#08x} len={len(seg):#x} ff={ff} zero={zero} 0x80={e80} distinct={len(c)}")
|
||||
|
||||
# Find real extents of DATA (non-FF) around each blob by scanning 0xFF runs
|
||||
def find_ff_boundaries(approx_start, search_end):
|
||||
# scan forward to find where FF-run of >=256 begins (end of data)
|
||||
i = approx_start
|
||||
run = 0
|
||||
end = search_end
|
||||
while i < search_end:
|
||||
if data[i]==0xff:
|
||||
run+=1
|
||||
if run>=1024:
|
||||
end = i-run+1
|
||||
break
|
||||
else:
|
||||
run=0
|
||||
i+=1
|
||||
return end
|
||||
|
||||
print("=== 0x198000 blob ===")
|
||||
region_stats(0x198000, 0x242000, "raw")
|
||||
# check where FF starts
|
||||
e = find_ff_boundaries(0x198000, 0x260000)
|
||||
print("first long FF run start ~", hex(e))
|
||||
|
||||
print("=== 0x352000 blob ===")
|
||||
region_stats(0x352000, 0x3DD000, "raw")
|
||||
|
||||
print("=== 0x3F0000 blob ===")
|
||||
region_stats(0x3F0000, 0x400000, "raw")
|
||||
Ссылка в новой задаче
Block a user