From 14e8e97fff97f12239f0ac6a3d6219315807b53c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Sep 2025 18:21:47 +0000 Subject: [PATCH] Add firmware downgrade suggestions for BE3600 routers with multilingual support Co-authored-by: longzheng268 <38132402+longzheng268@users.noreply.github.com> --- connect.py | 51 ++++++++++++++++++++++++++++++++++++++++++ firmware/readme.txt | 37 +++++++++++++++++++++++++++++++ i18n.py | 54 ++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 139 insertions(+), 3 deletions(-) diff --git a/connect.py b/connect.py index 8a02a3a..eecb6c4 100644 --- a/connect.py +++ b/connect.py @@ -7,6 +7,8 @@ import time import xmir_base from gateway import * +import i18n +import lang_config gw = Gateway(detect_device = False, detect_ssh = False) @@ -61,15 +63,64 @@ if True: 'connect5', # smartcontroller 'connect7', # get_icon ] + + exploit_worked = False + exploit_warnings = [] + for mod_name in exp_modules: try: import_module(mod_name, gw) + exploit_worked = True break # Ok except ExploitFixed as e: print('WARN:', str(e)) + exploit_warnings.append(str(e)) continue # try next module except ExploitNotWorked as e: print('WARN:', str(e)) + exploit_warnings.append(str(e)) continue # try next module except Exception: raise + + # Show firmware downgrade suggestion if all exploits failed + if not exploit_worked and gw.device_name in ['RD15', 'RN06']: # BE3600 variants + current_lang = lang_config.get_language() or 'en' + + print() + print("=" * 60) + print(i18n.get_translation(current_lang, 'messages', 'firmware_downgrade_title')) + print() + print(i18n.get_translation(current_lang, 'messages', 'firmware_downgrade_be3600')) + print() + + # Show current firmware version if available + if gw.rom_version: + if current_lang == 'zh': + print(f"当前固件版本: {gw.rom_version}") + print("建议降级到: 1.0.68 或更旧版本") + elif current_lang == 'ru': + print(f"Текущая версия прошивки: {gw.rom_version}") + print("Рекомендуемое понижение до: 1.0.68 или старше") + else: + print(f"Current firmware version: {gw.rom_version}") + print("Recommended downgrade to: 1.0.68 or older") + print() + + print(i18n.get_translation(current_lang, 'messages', 'firmware_downgrade_tutorial')) + print() + print(i18n.get_translation(current_lang, 'messages', 'firmware_downgrade_tool')) + print("=" * 60) + print() + elif not exploit_worked: + current_lang = lang_config.get_language() or 'en' + + print() + print("=" * 60) + print(i18n.get_translation(current_lang, 'messages', 'exploit_failed_title')) + print() + print(i18n.get_translation(current_lang, 'messages', 'exploit_failed_message')) + print() + print(i18n.get_translation(current_lang, 'messages', 'exploit_failed_suggestion')) + print("=" * 60) + print() diff --git a/firmware/readme.txt b/firmware/readme.txt index 7a95ffd..ac2abee 100644 --- a/firmware/readme.txt +++ b/firmware/readme.txt @@ -1 +1,38 @@ +English: In this folder, you should put the firmware for flashing. + +IMPORTANT: If you encounter exploit warnings like: +- "Exploits arn_switch/start_binding/set_mac_filter not working!!!" +- "Exploits Smartcontroller are not usable (hackCheck:3)" +- "Exploit get_icon not working!!! (API not founded)" + +For Xiaomi BE3600 (RD15) routers, please downgrade to firmware version 1.0.68 or older. +You can use the Xiaomi Router Repair Tool for firmware downgrade. + +Firmware downgrade tutorial: https://github.com/uyez/lyq/releases/tag/be3600 + +中文: +此文件夹中应放置用于刷写的固件。 + +重要提示:如果您遇到漏洞利用警告,如: +- "漏洞利用 arn_switch/start_binding/set_mac_filter 不工作!!!" +- "漏洞利用 Smartcontroller 不可用 (hackCheck:3)" +- "漏洞利用 get_icon 不工作!!! (API未找到)" + +对于小米BE3600 (RD15)路由器,请降级到固件版本1.0.68或更旧版本。 +您可以使用小米路由器修复工具进行固件降级。 + +固件降级教程:https://github.com/uyez/lyq/releases/tag/be3600 + +Русский: +В эту папку следует помещать прошивки для прошивки. + +ВАЖНО: Если вы столкнулись с предупреждениями об эксплойтах: +- "Эксплойты arn_switch/start_binding/set_mac_filter не работают!!!" +- "Эксплойты Smartcontroller недоступны (hackCheck:3)" +- "Эксплойт get_icon не работает!!! (API не найден)" + +Для роутеров Xiaomi BE3600 (RD15), пожалуйста, понизьте версию прошивки до 1.0.68 или старше. +Вы можете использовать инструмент восстановления роутера Xiaomi для понижения версии прошивки. + +Руководство по понижению версии прошивки: https://github.com/uyez/lyq/releases/tag/be3600 diff --git a/i18n.py b/i18n.py index 63bfbc3..8566053 100644 --- a/i18n.py +++ b/i18n.py @@ -40,6 +40,15 @@ TRANSLATIONS = { 'language_menu': 'Language / 语言 / Язык', 'language_prompt': 'Select language [1-English, 2-中文, 3-Русский]: ', 'bootloader_choice': 'Select bootloader [1-Breed, 2-U-Boot]: ' + }, + 'messages': { + 'firmware_downgrade_title': 'FIRMWARE DOWNGRADE SUGGESTION:', + 'firmware_downgrade_be3600': 'If exploits are not working on your BE3600 router, please\ndowngrade to firmware version 1.0.68 or older.', + 'firmware_downgrade_tutorial': 'Firmware downgrade tutorial:\nhttps://github.com/uyez/lyq/releases/tag/be3600', + 'firmware_downgrade_tool': 'You can use the Xiaomi Router Repair Tool for downgrade.', + 'exploit_failed_title': 'EXPLOIT FAILED:', + 'exploit_failed_message': 'All available exploits failed to work on this device.\nThis may be due to newer firmware versions that have\npatched the vulnerabilities.', + 'exploit_failed_suggestion': 'Consider checking for alternative firmware versions\nor contact the community for device-specific solutions.' } }, 'zh': { @@ -77,6 +86,15 @@ TRANSLATIONS = { 'language_menu': 'Language / 语言 / Язык', 'language_prompt': '选择语言 [1-English, 2-中文, 3-Русский]: ', 'bootloader_choice': '选择引导程序 [1-Breed, 2-U-Boot]: ' + }, + 'messages': { + 'firmware_downgrade_title': '固件降级建议:', + 'firmware_downgrade_be3600': '如果漏洞利用在您的BE3600路由器上不工作,请\n降级到固件版本1.0.68或更旧版本。', + 'firmware_downgrade_tutorial': '固件降级教程:\nhttps://github.com/uyez/lyq/releases/tag/be3600', + 'firmware_downgrade_tool': '您可以使用小米路由器修复工具进行降级。', + 'exploit_failed_title': '漏洞利用失败:', + 'exploit_failed_message': '所有可用的漏洞利用都无法在此设备上工作。\n这可能是由于较新的固件版本已修补了\n这些漏洞。', + 'exploit_failed_suggestion': '请考虑检查替代固件版本\n或联系社区获取设备特定解决方案。' } }, 'ru': { @@ -114,16 +132,43 @@ TRANSLATIONS = { 'language_menu': 'Language / 语言 / Язык', 'language_prompt': 'Выберите язык [1-English, 2-中文, 3-Русский]: ', 'bootloader_choice': 'Выберите загрузчик [1-Breed, 2-U-Boot]: ' + }, + 'messages': { + 'firmware_downgrade_title': 'ПРЕДЛОЖЕНИЕ ПОНИЖЕНИЯ ВЕРСИИ ПРОШИВКИ:', + 'firmware_downgrade_be3600': 'Если эксплойты не работают на вашем роутере BE3600, пожалуйста\nпонизьте версию прошивки до 1.0.68 или старше.', + 'firmware_downgrade_tutorial': 'Руководство по понижению версии прошивки:\nhttps://github.com/uyez/lyq/releases/tag/be3600', + 'firmware_downgrade_tool': 'Вы можете использовать инструмент восстановления роутера Xiaomi для понижения версии.', + 'exploit_failed_title': 'ЭКСПЛОЙТ НЕ СРАБОТАЛ:', + 'exploit_failed_message': 'Все доступные эксплойты не смогли работать на этом устройстве.\nЭто может быть связано с более новыми версиями прошивки,\nкоторые исправили уязвимости.', + 'exploit_failed_suggestion': 'Рассмотрите возможность проверки альтернативных версий прошивки\nили обратитесь к сообществу за решениями для конкретного устройства.' } } } -def get_translation(lang, key, *args): +def get_translation(lang, key, subkey=None, *args): """Get translated text for given language and key""" if lang not in TRANSLATIONS: lang = 'en' # fallback to English trans = TRANSLATIONS[lang] + + # Handle nested dictionary lookup + if subkey: + if key in trans and isinstance(trans[key], dict) and subkey in trans[key]: + text = trans[key][subkey] + if args: + return text.format(*args) + return text + # fallback to English + elif lang != 'en' and key in TRANSLATIONS['en'] and isinstance(TRANSLATIONS['en'][key], dict) and subkey in TRANSLATIONS['en'][key]: + text = TRANSLATIONS['en'][key][subkey] + if args: + return text.format(*args) + return text + else: + return f"{key}.{subkey}" # fallback key + + # Handle normal key lookup if key in trans: if isinstance(trans[key], list): return trans[key] @@ -139,10 +184,13 @@ def get_translation(lang, key, *args): else: # fallback to English only if we're not already using English if lang != 'en': - return get_translation('en', key, *args) + return get_translation('en', key, subkey, *args) else: # If key not found even in English, return a default message - return f"[Missing translation: {key}]" + if subkey: + return f"[Missing translation: {key}.{subkey}]" + else: + return f"[Missing translation: {key}]" def get_supported_languages(): """Get list of supported language codes"""