Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.
Katılım
3 Aralık 2023
Mesajlar
15.077
Makaleler
104
Çözümler
1.590
Beğeniler
45.768
Yer
İstanbul
Cihazın temiz FW'ini root üzerinden alana kadar konudan anlayan bir babayiğit varsa ESMT F50L1G41LB 128 MiB NAND Flashtan aldığımız bu dump'ı temizleyebilir mi? Cihazın işlemcisi EcoNet EN751221 SOC.


unsquashfs ve sasquatch şu anda başarısız oluyor. Fikir vermesi için bir iki kaynak:




 
Çözüm
Tabii ki. Buyurun:


Sevgili arkadaşım Onur bunun için bir script yaptı:


Python:
#!/usr/bin/env python3

import sys
import os

# -------------------------------------------------------------------
# !! Configuration !!
# Configure PAGE_SIZE and OOB_SIZE according to your NAND flash
#
# Yaygın kombinasyonlar:
# PAGE_SIZE = 2048, OOB_SIZE = 64
# PAGE_SIZE = 4096, OOB_SIZE = 128
# PAGE_SIZE = 4096, OOB_SIZE = 218
# PAGE_SIZE = 512,  OOB_SIZE = 16

PAGE_SIZE = 2048
OOB_SIZE = 64
# -------------------------------------------------------------------

BLOCK_SIZE = PAGE_SIZE + OOB_SIZE

def strip_ecc(input_file, output_file):
    print(f"Input File: {input_file}")
    print(f"Output File: {output_file}")
    print(f"Page Size: {PAGE_SIZE} byte")
    print(f"OOB Size (ECC):  {OOB_SIZE} byte")
    print(f"Total Block:       {BLOCK_SIZE} byte")
    print("Striping Started...")

    read_count = 0
    write_count = 0

    try:
        with open(input_file, 'rb') as f_in, open(output_file, 'wb') as f_out:
            while True:
                chunk = f_in.read(BLOCK_SIZE)
               
                if not chunk:
                    break
               
                read_count += len(chunk)

                data_to_write = chunk[:PAGE_SIZE]
               
                if len(chunk) < PAGE_SIZE:
                    data_to_write = chunk
               
                f_out.write(data_to_write)
                write_count += len(data_to_write)

    except IOError as e:
        print(f"Error: {e}")
        return
    except KeyboardInterrupt:
        print("\nCanceled.")
        return

    print("\nStriping Done...")
    print(f"Read total byte: {read_count}")
    print(f"Writen striped byte: {write_count}")


if __name__ == "__main__":
    if len(sys.argv) != 3:
        print(f"Usage: python3 {sys.argv[0]} <input_file.bin> <output_file.bin>")
        sys.exit(1)
   
    strip_ecc(sys.argv[1], sys.argv[2])

Bu Python script’i, ham (raw) bir NAND flash dökümünü “temizlemek” için tasarlanmıştır.

Ne yaptığı ve neden gerekli olduğu şöyle:

Ne yapıyor:
Script, girdi dosyanızı 2112 baytlık parçalar halinde okuyor (PAGE_SIZE + OOB_SIZE).
Her parçada ilk 2048 baytı (gerçek veri sayfası) kaydediyor ve son 64 baytı (OOB/ECC verisi) atıyor.

Neden gerekli:
Sana daha önce verdiğim dd komutları “temiz” bir flash imajı varsayıyor; yani içinde OOB/ECC bulunmayan bir imaj.
Senin dosyan ise açıkça ham bir dump ve bu ekstra OOB/ECC verilerini içeriyor.

Bu yüzden orijinal fulldump.bin dosyan üzerinde doğrudan dd komutlarını kullanamazsın.
Offset’ler yanlış olur ve çıkartılan tüm dosyalar bozuk çıkar.
Tabii ki. Buyurun:


Sevgili arkadaşım Onur bunun için bir script yaptı:


Python:
#!/usr/bin/env python3

import sys
import os

# -------------------------------------------------------------------
# !! Configuration !!
# Configure PAGE_SIZE and OOB_SIZE according to your NAND flash
#
# Yaygın kombinasyonlar:
# PAGE_SIZE = 2048, OOB_SIZE = 64
# PAGE_SIZE = 4096, OOB_SIZE = 128
# PAGE_SIZE = 4096, OOB_SIZE = 218
# PAGE_SIZE = 512,  OOB_SIZE = 16

PAGE_SIZE = 2048
OOB_SIZE = 64
# -------------------------------------------------------------------

BLOCK_SIZE = PAGE_SIZE + OOB_SIZE

def strip_ecc(input_file, output_file):
    print(f"Input File: {input_file}")
    print(f"Output File: {output_file}")
    print(f"Page Size: {PAGE_SIZE} byte")
    print(f"OOB Size (ECC):  {OOB_SIZE} byte")
    print(f"Total Block:       {BLOCK_SIZE} byte")
    print("Striping Started...")

    read_count = 0
    write_count = 0

    try:
        with open(input_file, 'rb') as f_in, open(output_file, 'wb') as f_out:
            while True:
                chunk = f_in.read(BLOCK_SIZE)
               
                if not chunk:
                    break
               
                read_count += len(chunk)

                data_to_write = chunk[:PAGE_SIZE]
               
                if len(chunk) < PAGE_SIZE:
                    data_to_write = chunk
               
                f_out.write(data_to_write)
                write_count += len(data_to_write)

    except IOError as e:
        print(f"Error: {e}")
        return
    except KeyboardInterrupt:
        print("\nCanceled.")
        return

    print("\nStriping Done...")
    print(f"Read total byte: {read_count}")
    print(f"Writen striped byte: {write_count}")


if __name__ == "__main__":
    if len(sys.argv) != 3:
        print(f"Usage: python3 {sys.argv[0]} <input_file.bin> <output_file.bin>")
        sys.exit(1)
   
    strip_ecc(sys.argv[1], sys.argv[2])

Bu Python script’i, ham (raw) bir NAND flash dökümünü “temizlemek” için tasarlanmıştır.

Ne yaptığı ve neden gerekli olduğu şöyle:

Ne yapıyor:
Script, girdi dosyanızı 2112 baytlık parçalar halinde okuyor (PAGE_SIZE + OOB_SIZE).
Her parçada ilk 2048 baytı (gerçek veri sayfası) kaydediyor ve son 64 baytı (OOB/ECC verisi) atıyor.

Neden gerekli:
Sana daha önce verdiğim dd komutları “temiz” bir flash imajı varsayıyor; yani içinde OOB/ECC bulunmayan bir imaj.
Senin dosyan ise açıkça ham bir dump ve bu ekstra OOB/ECC verilerini içeriyor.

Bu yüzden orijinal fulldump.bin dosyan üzerinde doğrudan dd komutlarını kullanamazsın.
Offset’ler yanlış olur ve çıkartılan tüm dosyalar bozuk çıkar.
 
Çözüm
Merhaba, verdiğiniz GitHub reposu zaten correction yapıyor, ancak sorun zaten bu değil squashfs+lzmanın sürümü farklı.

Config elde edebildim ancak rootfs açamadım. Şu anda squashfs kombinasyonları deniyorum 4.0+lzma’da sonuç yok. Squashfs modifasyonu var routerda diye algıladım. Squashfs için yararlı bir kaynak: https://github.com/rampageX/firmware-mod-kit

Binwalk:

Kod:
675872 0xA5020 XML document, version: "1.0"
743462 0xB5826 Unix path: /fileserver/QuantWiFi/TP-LINK_VC220-G3u/wifiSpeed-G3U-TT-prod-20230411 />
946208 0xE7020 XML document, version: "1.0"
1013798 0xF7826 Unix path: /fileserver/QuantWiFi/TP-LINK_VC220-G3u/wifiSpeed-G3U-TT-prod-20230411 />
4190208 0x3FF000 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 15235759 bytes, 919 inodes, blocksize: 131072 bytes, created: 2024-11-20 02:12:27
40955904 0x270F000 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 15264030 bytes, 915 inodes, blocksize: 131072 bytes, created: 2023-03-01 12:21:58

4.0+lzma görünüyor, uğraşıyorum bakalım.

Ek: Dediğiniz gibiymiş repodaki correction hatalıymış verdiğiniz script sonrası rootfs açtım buyurun. Bende zannediyorum ki modifiye edilmis squashfs var. :confused:
/Extract-Firmware. Sh VC_220_OOb. Bin


Ek 2:
Rootfs_corrected_all
 
Son düzenleyen: Moderatör: