Ben ne yaptıysam NAND dökümünü çıkartamadım ama şu anda çok gerek var mı emin değilim. Şimdi bana da diğer modeller gelecek. Sizden ricam HG8245X6_Root_Payload.bin dosyasını analiz edebiliyorsanız etmeniz. Ben gerçekten o odysa ile mi root almayı başardım? Öyle ise diğer cihazlara da aynısını yapacağız. Dosyayı hazırlayan kodu da GitHub'da paylaştım.
 
Evet öncelikle yazmış olduğunuz PATCH diğer modellerde işe yaramaz. Program ile vermiş olduğunuz bin dosyasını analiz ettiğimde aynı model HG8245X6, aynı firmware (V500R021C00SPC128B125) cihaza göre PATCH yapılmış olduğunu gördüm. Fakat kodda HG8245X6 farklı firmware versiyonu ile ilgili bir koruma yada checksum göremedim denemekde fayda var işe yarayabilir. Fakat HG8245H / HG8245Q / EG8145V5 vs. gibi diğer modellerde HW kontrol edilir, payload reject olur.

Bu arada daha önce yüklemiş olduğunuz firmware.bin adındaki NAND içeriğini tamamen export ettim.

NAND İçeriği;
Kod:
bootloader.bin           2 MiB U-Boot
kernel_A.uImage          Linux 4.4.240 + header
kernel_A.bin             Header'sız raw kernel
kernel_B.uImage          Bank B aynısı
kernel_B.bin
rootfs_A.squashfs        42 MB SquashFS
rootfs_B.squashfs        Bank B

NAND içeriği İndirme Linki

NAND içeriğindeki dosyaların tek tek Extract edilmiş hali.

Squashfs encryption çözülemedi. HW crypto gerekli direk MCU'dan DUMP edilmesi gerek.

Paylaşmış olduğunuz MTD Dump içeriği tamamı.
MTD Dump

@Recep Baltaş

bootloader.bin dosyasından ilgili HW Crypto aescrypt2 master değerini elde etmeyi başardım.

İlgili Master Key.
Kod:
hex:13395537D2730554A176799F6D56A239

Bu anahtar ile ilgili Huawei modellerinin içerisindeki tüm dosyalar decrypt edilebilir.

Ayrıca @Recep Baltaş paylaşmış olduğu firmware.bin NAND dosyasının tüm dosya yapısını çıkarttım.

HG8245X6-Full-NAND

@Recep Baltaş alttaki kod ile kullanıcının arayüzünden ilgili cihazın sürümü yazıldıktan sonra cihazın firmware sürümüne uyumlu .bin dosyasını üretir. Daha sonra C# Windows Form ile tam otomatik yapılabilir.

Alttaki kodun çalışması için gerekli programlar;
Kod:
Python,
HuaweiFirmwareTool (hw_fmw)
ONT Enable Tool


Bu kod Opus 4.7 MAX ile yazılmıştır.
Kod:
import os
import shutil
import subprocess

def main():
    print("==================================================")
    print(" HG8245X6 Evrensel Payload Oluşturucu (Generator) ")
    print("==================================================")
    print("Bu araç, belirttiğiniz Firmware sürümüne özel root payload'u derler.")
    
    version = input("Lütfen cihazın tam sürümünü girin (Örn: V500R021C00SPC128B125): ").strip()
    
    if not version:
        print("Hata: Sürüm numarası boş olamaz!")
        return

    build_dir = "payload_build"
    var_dir = os.path.join(build_dir, "var")
    
    # Eski build klasörünü temizle
    if os.path.exists(build_dir):
        shutil.rmtree(build_dir)
        
    os.makedirs(var_dir, exist_ok=True)
    
    # 1. signature dosyasını oluştur (Ana bash payload'u)
    signature_content = """#! /bin/sh
echo "=== HG8245X6 Custom Payload Execution ===" > /dev/console

# 1. HW_SSMP_FEATURE_CLI_CHINA_MODE özelliğini aktif et
echo 'feature.name = "HW_SSMP_FEATURE_CLI_CHINA_MODE" feature.enable="1" feature.attribute="1"' > /mnt/jffs2/hw_hardinfo_feature

# 2. hw_ctree.xml dosyasını manipüle et
var_jffs2_current_ctree_file="/mnt/jffs2/hw_ctree.xml"
var_current_ctree_bak_file="/var/hw_ctree_equipbak.xml"
var_current_ctree_file_tmp="/var/hw_ctree.xml.tmp"
var_node_telnet="InternetGatewayDevice.X_HW_Security.AclServices"
var_node_telnet_acs="InternetGatewayDevice.UserInterface.X_HW_CLITelnetAccess"

if [ -f "$var_jffs2_current_ctree_file" ]; then
    cp -f $var_jffs2_current_ctree_file $var_current_ctree_bak_file
    
    /bin/aescrypt2 1 $var_current_ctree_bak_file $var_current_ctree_file_tmp
    varIsXmlEncrypted=$?
    
    if [ $varIsXmlEncrypted -eq 0 ]; then
        mv $var_current_ctree_bak_file $var_current_ctree_bak_file".gz"
        gunzip -f $var_current_ctree_bak_file".gz"
    fi

    # Telnet'i kalıcı olarak aç
    cfgtool set $var_current_ctree_bak_file $var_node_telnet TELNETLanEnable 1
    cfgtool set $var_current_ctree_bak_file $var_node_telnet_acs Access 1
    
    # TR-069 ACS bağlantısını kapat (Kalıcılık için)
    cfgtool set $var_current_ctree_bak_file "InternetGatewayDevice.ManagementServer" EnableCWMP 0

    if [ $varIsXmlEncrypted -eq 0 ]; then
        gzip -f $var_current_ctree_bak_file
        mv $var_current_ctree_bak_file".gz" $var_current_ctree_bak_file
        /bin/aescrypt2 0 $var_current_ctree_bak_file $var_current_ctree_file_tmp
    fi

    rm -f $var_jffs2_current_ctree_file
    cp -f $var_current_ctree_bak_file $var_jffs2_current_ctree_file
fi

# 3. Telnet daemon'unu hemen başlat
/sbin/telnetd -p 23 -l /bin/sh &
/sbin/telnetd -p 2323 -l /bin/sh &

echo "success!" > /dev/console
exit 0
"""
    signature_path = os.path.join(var_dir, "signature")
    with open(signature_path, "w", encoding="utf-8", newline="\n") as f:
        f.write(signature_content)
    
    # Unix executable yapısı için yetki ayarı (Windows'da pek işe yaramasa da hw_fmw umursamayabilir)
    os.chmod(signature_path, 0o777)

    # 2. signinfo dosyasını oluştur (Sürüm bilgisi)
    with open(os.path.join(var_dir, "signinfo"), "w", encoding="utf-8", newline="\n") as f:
        f.write(version)

    # 3. item_list.txt dosyasını oluştur (Harita dosyası)
    item_list_content = f"""0x504e5748
256 BB9|1029|997|734|393|323|627|767|1067|1007|AC7|10C7|147C|148C|14ED|15BD|120|130|140|141|150|160|170|171|180|190|1B1|1A1|1A0|1B0|1D0|1F1|201|211|221|230|240|260|261|270|271|280|281|291|2A1|431|
+ 0 file:/var/signature SIGNATURE {version} 2
+ 1 file:/var/signinfo SIGNINFO {version} 0
"""
    with open(os.path.join(build_dir, "item_list.txt"), "w", encoding="utf-8", newline="\n") as f:
        f.write(item_list_content)

    print(f"\n[+] Gerekli dosyalar '{build_dir}' klasörüne oluşturuldu.")
    print("[*] HuaweiFirmwareTool (hw_fmw) çalıştırılıyor...\n")

    # 4. hw_fmw aracını çalıştır
    output_bin = f"HG8245X6_Payload_{version}.bin"
    try:
        # Popen kullanarak hw_fmw'yi çalıştır
        # hw_fmw sistem PATH'ine eklenmiş olmalı veya aynı dizinde hw_fmw.exe bulunmalı
        result = subprocess.run(
            ["hw_fmw", "-d", ".", "-p", "-o", f"../{output_bin}"],
            cwd=build_dir,
            capture_output=True,
            text=True
        )
        
        if result.returncode == 0:
            print(f"[BAŞARILI] {output_bin} başarıyla oluşturuldu!")
            print("Bu dosyayı ONT Enable Tool üzerinden cihazınıza yükleyebilirsiniz.")
        else:
            print("[HATA] hw_fmw aracı çalışırken bir sorun oluştu.")
            print("Hata Çıktısı:\n", result.stderr)
            print("\nLütfen 'hw_fmw' (HuaweiFirmwareTool) aracının bilgisayarınızda yüklü ve PATH değişkeninde (veya bu klasörde) olduğundan emin olun.")

    except FileNotFoundError:
        print("[HATA] 'hw_fmw' komutu bulunamadı!")
        print("Lütfen https://github.com/0xuserpag3/HuaweiFirmwareTool adresinden aracı indirin,")
        print("derleyin ve 'hw_fmw.exe' dosyasını bu dizine veya Windows PATH yoluna ekleyin.")
        print(f"Ardından manuel olarak payload'u paketlemek için '{build_dir}' klasörünün içinde şu komutu çalıştırın:")
        print(f"  hw_fmw -d . -p -o {output_bin}")

if __name__ == "__main__":
    main()

Ayrıca @Recep Baltaş eğer isterseniz github kütüphanesinde paylaşmış olduğunuz ONT使能2.0.exe program tam olarak decompiler edilebilir.
 
Son düzenleme:
Hocam müsait bir zamanda bakıp ödeme için de iletişime geçeceğim. Emeğinize sağlık. Github'da ekleyeceğim bunları izin verirseniz, size credit vererek.
Ayrıca @Recep Baltaş eğer isterseniz github kütüphanesinde paylaşmış olduğunuz ONT使能2.0.exe program tam olarak decompiler edilebilir.
Bu da süper olur açıkçası, buna ayarı bütçe ayırabilirim dilerseniz.
 
Arkadaşlar sorunumuz kod yazmamamız değil, sorunumuz yazdığımız kodu kabul etmemesi sebebi ise yazılım sürümünü doğrulaması ve aynı olmadığı için kabul etmemesi. Ben ve Recep hocamdaki cihazın arayüzünde V5R021C00S128 yazsa da NAND'ı okuyunca Recep hocam gerçek sürümün V500R021C00SPC128B125 olduğunu öğrendi ona göre kodu revize edip yapabildi, sorun bizde çalışmadı çünkü bizdeki gerçek sürüm farklı. (Muhtemelen benimkinde v3'lü bir şeyler var.) En iyi ihtimalle sadece sonundaki B kısmı değişiyor ama bu da kaç farklı denemeye tekabül ediyor, ondan dolayı sürümü NAND'i SÖKMEDEN herkesin evde yapabileceği şekilde yapılması gerek.

Geliştirici arkadaşlar lütfen önce konuyu okuyun ona göre ilerleyin. Ben kodu incelemedim baştaki evrensel yazısını görünce sevinmiştim, söktüğüm NAND'ı geri taktım yazılımı deneyeyim diye bir baktım ki benden sürüm numarası soruyor (Tamda Kennedy cihangir abiyle karşılaşmışım gibi hissettim). Zaten biz de sürüm nosunu bilmediğimiz için evrensel çalışacak bir şey istiyoruz. (Kusura bakmayın biraz kaba olmuş sonu NAND'ı geri sökerken yolun birini kopardım biraz sinirlenmişim lütfen üstünüze alınmayın. )
 
Son düzenleyen: Moderatör:
@Fahare, hocam sakin olun. @faknc'den iki ürün aldım. Onlarla da denemeye başlıyoruz. Ayrıca @HEKZ, süper tecrübeli birisi. Gerekirse piyasadaki bütün sürümler için rehber yapacağız :)
Sinirim kendime hocam :hahaha: Dün gözümün zor gördüğü yol kopmuştu ekran kartımın tamir ettim. Bugün ondan daha kalın bacaklı şeyin yolunu kopardım kendime iş çıkardım, 1-2 sn daha bekleyip söksem sorun olmayacaktı. Sabırsızlıkla bekliyorum dün daha farklı ayarlarla denedim bu sefer anında reset attırıyor modeme, kendi marka ürününe birşey yapmıyor çok ilginç bir cihaz.
 
Son düzenleyen: Moderatör:
Evet öncelikle yazmış olduğunuz PATCH diğer modellerde işe yaramaz. Program ile vermiş olduğunuz bin dosyasını analiz ettiğimde aynı model HG8245X6, aynı firmware (V500R021C00SPC128B125) cihaza göre PATCH yapılmış olduğunu gördüm. Fakat kodda HG8245X6 farklı firmware versiyonu ile ilgili bir koruma yada checksum göremedim denemekde fayda var işe yarayabilir. Fakat HG8245H / HG8245Q / EG8145V5 vs. gibi diğer modellerde HW kontrol edilir, payload reject olur.

Bu arada daha önce yüklemiş olduğunuz firmware.bin adındaki NAND içeriğini tamamen export ettim.

NAND İçeriği;
Kod:
bootloader.bin           2 MiB U-Boot
kernel_A.uImage          Linux 4.4.240 + header
kernel_A.bin             Header'sız raw kernel
kernel_B.uImage          Bank B aynısı
kernel_B.bin
rootfs_A.squashfs        42 MB SquashFS
rootfs_B.squashfs        Bank B

NAND içeriği İndirme Linki

NAND içeriğindeki dosyaların tek tek Extract edilmiş hali.

Squashfs encryption çözülemedi. HW crypto gerekli direk MCU'dan DUMP edilmesi gerek.

Paylaşmış olduğunuz MTD Dump içeriği tamamı.
MTD Dump

@Recep Baltaş

bootloader.bin dosyasından ilgili HW Crypto aescrypt2 master değerini elde etmeyi başardım.

İlgili Master Key.
Kod:
hex:13395537D2730554A176799F6D56A239

Bu anahtar ile ilgili Huawei modellerinin içerisindeki tüm dosyalar decrypt edilebilir.

Ayrıca @Recep Baltaş paylaşmış olduğu firmware.bin NAND dosyasının tüm dosya yapısını çıkarttım.

HG8245X6-Full-NAND

@Recep Baltaş alttaki kod ile kullanıcının arayüzünden ilgili cihazın sürümü yazıldıktan sonra cihazın firmware sürümüne uyumlu .bin dosyasını üretir. Daha sonra C# Windows Form ile tam otomatik yapılabilir.

Alttaki kodun çalışması için gerekli programlar;
Kod:
Python,
HuaweiFirmwareTool (hw_fmw)
ONT Enable Tool


Bu kod Opus 4.7 MAX ile yazılmıştır.
Kod:
import os
import shutil
import subprocess

def main():
    print("==================================================")
    print(" HG8245X6 Evrensel Payload Oluşturucu (Generator) ")
    print("==================================================")
    print("Bu araç, belirttiğiniz Firmware sürümüne özel root payload'u derler.")
   
    version = input("Lütfen cihazın tam sürümünü girin (Örn: V500R021C00SPC128B125): ").strip()
   
    if not version:
        print("Hata: Sürüm numarası boş olamaz!")
        return

    build_dir = "payload_build"
    var_dir = os.path.join(build_dir, "var")
   
    # Eski build klasörünü temizle
    if os.path.exists(build_dir):
        shutil.rmtree(build_dir)
       
    os.makedirs(var_dir, exist_ok=True)
   
    # 1. signature dosyasını oluştur (Ana bash payload'u)
    signature_content = """#! /bin/sh
echo "=== HG8245X6 Custom Payload Execution ===" > /dev/console

# 1. HW_SSMP_FEATURE_CLI_CHINA_MODE özelliğini aktif et
echo 'feature.name = "HW_SSMP_FEATURE_CLI_CHINA_MODE" feature.enable="1" feature.attribute="1"' > /mnt/jffs2/hw_hardinfo_feature

# 2. hw_ctree.xml dosyasını manipüle et
var_jffs2_current_ctree_file="/mnt/jffs2/hw_ctree.xml"
var_current_ctree_bak_file="/var/hw_ctree_equipbak.xml"
var_current_ctree_file_tmp="/var/hw_ctree.xml.tmp"
var_node_telnet="InternetGatewayDevice.X_HW_Security.AclServices"
var_node_telnet_acs="InternetGatewayDevice.UserInterface.X_HW_CLITelnetAccess"

if [ -f "$var_jffs2_current_ctree_file" ]; then
    cp -f $var_jffs2_current_ctree_file $var_current_ctree_bak_file
   
    /bin/aescrypt2 1 $var_current_ctree_bak_file $var_current_ctree_file_tmp
    varIsXmlEncrypted=$?
   
    if [ $varIsXmlEncrypted -eq 0 ]; then
        mv $var_current_ctree_bak_file $var_current_ctree_bak_file".gz"
        gunzip -f $var_current_ctree_bak_file".gz"
    fi

    # Telnet'i kalıcı olarak aç
    cfgtool set $var_current_ctree_bak_file $var_node_telnet TELNETLanEnable 1
    cfgtool set $var_current_ctree_bak_file $var_node_telnet_acs Access 1
   
    # TR-069 ACS bağlantısını kapat (Kalıcılık için)
    cfgtool set $var_current_ctree_bak_file "InternetGatewayDevice.ManagementServer" EnableCWMP 0

    if [ $varIsXmlEncrypted -eq 0 ]; then
        gzip -f $var_current_ctree_bak_file
        mv $var_current_ctree_bak_file".gz" $var_current_ctree_bak_file
        /bin/aescrypt2 0 $var_current_ctree_bak_file $var_current_ctree_file_tmp
    fi

    rm -f $var_jffs2_current_ctree_file
    cp -f $var_current_ctree_bak_file $var_jffs2_current_ctree_file
fi

# 3. Telnet daemon'unu hemen başlat
/sbin/telnetd -p 23 -l /bin/sh &
/sbin/telnetd -p 2323 -l /bin/sh &

echo "success!" > /dev/console
exit 0
"""
    signature_path = os.path.join(var_dir, "signature")
    with open(signature_path, "w", encoding="utf-8", newline="\n") as f:
        f.write(signature_content)
   
    # Unix executable yapısı için yetki ayarı (Windows'da pek işe yaramasa da hw_fmw umursamayabilir)
    os.chmod(signature_path, 0o777)

    # 2. signinfo dosyasını oluştur (Sürüm bilgisi)
    with open(os.path.join(var_dir, "signinfo"), "w", encoding="utf-8", newline="\n") as f:
        f.write(version)

    # 3. item_list.txt dosyasını oluştur (Harita dosyası)
    item_list_content = f"""0x504e5748
256 BB9|1029|997|734|393|323|627|767|1067|1007|AC7|10C7|147C|148C|14ED|15BD|120|130|140|141|150|160|170|171|180|190|1B1|1A1|1A0|1B0|1D0|1F1|201|211|221|230|240|260|261|270|271|280|281|291|2A1|431|
+ 0 file:/var/signature SIGNATURE {version} 2
+ 1 file:/var/signinfo SIGNINFO {version} 0
"""
    with open(os.path.join(build_dir, "item_list.txt"), "w", encoding="utf-8", newline="\n") as f:
        f.write(item_list_content)

    print(f"\n[+] Gerekli dosyalar '{build_dir}' klasörüne oluşturuldu.")
    print("[*] HuaweiFirmwareTool (hw_fmw) çalıştırılıyor...\n")

    # 4. hw_fmw aracını çalıştır
    output_bin = f"HG8245X6_Payload_{version}.bin"
    try:
        # Popen kullanarak hw_fmw'yi çalıştır
        # hw_fmw sistem PATH'ine eklenmiş olmalı veya aynı dizinde hw_fmw.exe bulunmalı
        result = subprocess.run(
            ["hw_fmw", "-d", ".", "-p", "-o", f"../{output_bin}"],
            cwd=build_dir,
            capture_output=True,
            text=True
        )
       
        if result.returncode == 0:
            print(f"[BAŞARILI] {output_bin} başarıyla oluşturuldu!")
            print("Bu dosyayı ONT Enable Tool üzerinden cihazınıza yükleyebilirsiniz.")
        else:
            print("[HATA] hw_fmw aracı çalışırken bir sorun oluştu.")
            print("Hata Çıktısı:\n", result.stderr)
            print("\nLütfen 'hw_fmw' (HuaweiFirmwareTool) aracının bilgisayarınızda yüklü ve PATH değişkeninde (veya bu klasörde) olduğundan emin olun.")

    except FileNotFoundError:
        print("[HATA] 'hw_fmw' komutu bulunamadı!")
        print("Lütfen https://github.com/0xuserpag3/HuaweiFirmwareTool adresinden aracı indirin,")
        print("derleyin ve 'hw_fmw.exe' dosyasını bu dizine veya Windows PATH yoluna ekleyin.")
        print(f"Ardından manuel olarak payload'u paketlemek için '{build_dir}' klasörünün içinde şu komutu çalıştırın:")
        print(f"  hw_fmw -d . -p -o {output_bin}")

if __name__ == "__main__":
    main()

Ayrıca @Recep Baltaş eğer isterseniz github kütüphanesinde paylaşmış olduğunuz ONT使能2.0.exe program tam olarak decompiler edilebilir.


Hocam ONT使能2.0.exe uygulamasını decompiler etmeyi başardınız mı? Uygulama cihazı developer modunda işlem yapmayı sağladığını ve bin dosyası yükleyerek cihaz içinde bulunan belirli fonksiyonları çalıştırmaya yaradığını düşünüyorum eski sürümlerde paylaşılan COMMON bin ve shell etkinleştirme dosyaları yeni sürümlerde çalışmıyor fakat cihazın içerisinde COMMON geçiş için cihaz içerisinde bir sh dosyası bulunmakta root shell etkinleştirmesini yapamasak bile cihazın sol zorunluluğunu kaldırıp COMMON'a yani kısıtlanmış sürümden çıkarak global sürüme geçiş yapabiliriz böylece cihaza root erişimi kurabiliriz. Tek sorun geri şimdilik geri dönüşü yani eski haline çevirme mümkün görünmüyor benimde ihtiyacım yok. Elimde 8 adet mevcut hepsi farklı sürümlerde. Uygulamanın çalışma mantığını çözersek ilerlememiz daha kolay olacağını düşünüyorum.
 
Hocam ONT使能2.0.exe uygulamasını decompiler etmeyi başardınız mı? Uygulama cihazı developer modunda işlem yapmayı sağladığını ve bin dosyası yükleyerek cihaz içinde bulunan belirli fonksiyonları çalıştırmaya yaradığını düşünüyorum eski sürümlerde paylaşılan COMMON bin ve shell etkinleştirme dosyaları yeni sürümlerde çalışmıyor fakat cihazın içerisinde COMMON geçiş için cihaz içerisinde bir sh dosyası bulunmakta root shell etkinleştirmesini yapamasak bile cihazın sol zorunluluğunu kaldırıp COMMON'a yani kısıtlanmış sürümden çıkarak global sürüme geçiş yapabiliriz böylece cihaza root erişimi kurabiliriz. Tek sorun geri şimdilik geri dönüşü yani eski haline çevirme mümkün görünmüyor benimde ihtiyacım yok. Elimde 8 adet mevcut hepsi farklı sürümlerde. Uygulamanın çalışma mantığını çözersek ilerlememiz daha kolay olacağını düşünüyorum.
Acaba yazılım sürümü doğrulamasını uygulama mı yapıyor yoksa cihaz mı ? Yazılım yapıyorsa doğrulamayı bypass edebilecek bir şey yapılsa olur mu acaba ?