Encrypted Hilink Uimage Firmware Header Access

Full Convert is designed for ease of use and reliability to make sure you get your job done as quickly and as simply as possible.

CSV is also known as TSV, Flat file, Comma-separated text, TAB-separated text (: csv, tsv, txt).

Making migration easy for you

Full Convert is a fully self-tuning software. Your migration will work as expected without you needing to adjust anything.

Data types are different in CSV compared to Oracle RDB. We automatically adjust them as we copy the tables so you don't have to worry about it. You can adjust the mapping rules if you wish to change the following defaults:

  • binary_double double
  • binary_float double
  • char ntext
  • clob ntext
  • date datetime
  • float double
  • long ntext
  • long raw blob
  • nchar ntext
  • nclob ntext
  • number double
  • nvarchar2 ntext
  • raw blob
  • rowid integer
  • sdo_geometry ntext
  • timestamp datetime
  • urowid integer
  • varchar2 ntext
  • xmltype ntext

with open("firmware.bin", "rb") as f: enc_header = f.read(4096)

Check for HiLink markers:

cipher = AES.new(key, AES.MODE_CBC, iv) dec_header = cipher.decrypt(enc_header)

If you’ve ever run binwalk on a HiLink firmware update (e.g., from an E3372, B310, or AR series router) and seen only high entropy data with no recognizable UImage magic ( 0x27051956 ), you’ve likely encountered this encrypted header.

# Extract first 64+ bytes of encrypted header (adjust count) dd if=firmware.bin of=enc_header.bin bs=1 count=4096 openssl enc -aes-128-cbc -d -K $KEY -iv $IV -in enc_header.bin -out dec_header.bin Verify magic hexdump -C dec_header.bin | head -1 Should see 56 19 05 27

strings u-boot.bin | grep -i "aes" Look for key arrays in rodata section.

If the magic appears, you have the correct key. The rest of the firmware may be encrypted in blocks. Many HiLink images encrypt only the header + first block. The remaining data may be plain or compressed. After decryption, run:

hexdump -C firmware.bin | head -n 20 Look for strings like "HUAWEI" , "HiLink" , or "UPDATE" at offset > 0x1000 (they often appear after the encrypted header). Method A – Static key (older devices) Search U-Boot binary (extracted via JTAG or from a decrypted image):

Key for E3372 (v1): 0x4A,0x6F,0x6B,0x65,0x72,0x73,0x43,0x6F,0x6D,0x65,0x74,0x21,0x2A,0x2A,0x2A,0x00 Key for B310: Derived from serial number + static seed : Modern HiLink devices (2020+) use device-unique keys, making extraction harder but not impossible via hardware glitching. 3.3 Header Structure After Decryption Once decrypted, the header reverts to a standard UImage header with one twist: the ih_name field often contains a secondary signature or a plaintext marker like "SECURE_HILINK_V1" .

magic = struct.unpack(">I", dec_header[0:4])[0] if magic == 0x27051956: print("Decryption successful") with open("dec_header.bin", "wb") as out: out.write(dec_header) The encrypted HiLink UImage header is a modest but effective speed bump against casual analysis. For a determined reverse engineer, it adds a few hours of work—identifying the key source, decrypting, and repacking. However, modern per-device keys and additional signature checks make widespread third-party firmware creation impractical.

| Offset | Size | Field | Example Value | |--------|------|---------------|-------------------| | 0x00 | 4 | ih_magic | 0x27051956 | | 0x04 | 4 | ih_hcrc | Checksum | | 0x08 | 4 | ih_time | Timestamp | | 0x0C | 4 | ih_size | Data size | | 0x10 | 4 | ih_load | Load address | | 0x14 | 4 | ih_ep | Entry point | | 0x18 | 4 | ih_dcrc | Data checksum | | 0x1C | 1 | ih_os | OS type | | 0x1D | 1 | ih_arch | Architecture | | 0x1E | 1 | ih_type | Image type | | 0x1F | 1 | ih_comp | Compression | | 0x20 | 16 | ih_name | Image name |

Target database browser

Data is now in the target database

Use our built-in database browser to examine the copied data. Of course, you can also examine the conversion in detail and see in-depth information for each table.

Migrate your data now.
60-day money back guarantee

Full Convert is used by thousands of organizations in 98 countries.

Encrypted Hilink Uimage Firmware Header Access

with open("firmware.bin", "rb") as f: enc_header = f.read(4096)

Check for HiLink markers:

cipher = AES.new(key, AES.MODE_CBC, iv) dec_header = cipher.decrypt(enc_header) encrypted hilink uimage firmware header

If you’ve ever run binwalk on a HiLink firmware update (e.g., from an E3372, B310, or AR series router) and seen only high entropy data with no recognizable UImage magic ( 0x27051956 ), you’ve likely encountered this encrypted header.

# Extract first 64+ bytes of encrypted header (adjust count) dd if=firmware.bin of=enc_header.bin bs=1 count=4096 openssl enc -aes-128-cbc -d -K $KEY -iv $IV -in enc_header.bin -out dec_header.bin Verify magic hexdump -C dec_header.bin | head -1 Should see 56 19 05 27 with open("firmware

strings u-boot.bin | grep -i "aes" Look for key arrays in rodata section.

If the magic appears, you have the correct key. The rest of the firmware may be encrypted in blocks. Many HiLink images encrypt only the header + first block. The remaining data may be plain or compressed. After decryption, run: The rest of the firmware may be encrypted in blocks

hexdump -C firmware.bin | head -n 20 Look for strings like "HUAWEI" , "HiLink" , or "UPDATE" at offset > 0x1000 (they often appear after the encrypted header). Method A – Static key (older devices) Search U-Boot binary (extracted via JTAG or from a decrypted image):

Key for E3372 (v1): 0x4A,0x6F,0x6B,0x65,0x72,0x73,0x43,0x6F,0x6D,0x65,0x74,0x21,0x2A,0x2A,0x2A,0x00 Key for B310: Derived from serial number + static seed : Modern HiLink devices (2020+) use device-unique keys, making extraction harder but not impossible via hardware glitching. 3.3 Header Structure After Decryption Once decrypted, the header reverts to a standard UImage header with one twist: the ih_name field often contains a secondary signature or a plaintext marker like "SECURE_HILINK_V1" .

magic = struct.unpack(">I", dec_header[0:4])[0] if magic == 0x27051956: print("Decryption successful") with open("dec_header.bin", "wb") as out: out.write(dec_header) The encrypted HiLink UImage header is a modest but effective speed bump against casual analysis. For a determined reverse engineer, it adds a few hours of work—identifying the key source, decrypting, and repacking. However, modern per-device keys and additional signature checks make widespread third-party firmware creation impractical.

| Offset | Size | Field | Example Value | |--------|------|---------------|-------------------| | 0x00 | 4 | ih_magic | 0x27051956 | | 0x04 | 4 | ih_hcrc | Checksum | | 0x08 | 4 | ih_time | Timestamp | | 0x0C | 4 | ih_size | Data size | | 0x10 | 4 | ih_load | Load address | | 0x14 | 4 | ih_ep | Entry point | | 0x18 | 4 | ih_dcrc | Data checksum | | 0x1C | 1 | ih_os | OS type | | 0x1D | 1 | ih_arch | Architecture | | 0x1E | 1 | ih_type | Image type | | 0x1F | 1 | ih_comp | Compression | | 0x20 | 16 | ih_name | Image name |