- Полный 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>
36 строки
1.2 KiB
Python
36 строки
1.2 KiB
Python
data = open(r"C:/Users/vikto/Documents/Claude/rt-4d/radio-spi-dump.bin","rb").read()
|
|
|
|
# Check 0x14C000 region: is it sequential GBK codepoints?
|
|
seg = data[0x14C000:0x14C000+40]
|
|
print("bytes @0x14C000:", seg.hex(' '))
|
|
# decode as gbk pairs
|
|
try:
|
|
print("gbk:", seg.decode('gbk'))
|
|
except Exception as e:
|
|
print(e)
|
|
|
|
# Are the CJK chars strictly increasing in unicode order?
|
|
region = data[0x14C000:0x157000]
|
|
chars=[]
|
|
i=0
|
|
while i < len(region)-1:
|
|
pair = region[i:i+2]
|
|
try:
|
|
c = pair.decode('gbk')
|
|
if len(c)==1 and ord(c)>0x2000:
|
|
chars.append(ord(c))
|
|
except:
|
|
pass
|
|
i+=2
|
|
inc = sum(1 for a,b in zip(chars,chars[1:]) if b>a)
|
|
print(f"CJK chars in 0x14C000-0x157000: {len(chars)}, monotonic-increasing fraction: {inc/max(1,len(chars)-1):.2%}")
|
|
print("first codepoints:", [hex(c) for c in chars[:8]], "last:", [hex(c) for c in chars[-4:]])
|
|
|
|
# search whole dump for meaningful ascii keywords (case-insensitive)
|
|
kws = [b'RADTEL', b'Radtel', b'RT-4D', b'RT4D', b'FIRMWARE', b'VERSION', b'BOOT', b'COPYRIGHT',
|
|
b'WELCOME', b'BRANDMEISTER', b'OpenGD', b'DMR ID', b'CALLSIGN', b'\x00V1.', b'V2.', b'BETA', b'.4rdmf']
|
|
for k in kws:
|
|
idx = data.find(k)
|
|
if idx>=0:
|
|
print(f"FOUND {k!r} @0x{idx:06X}")
|