158a0f0d0SEitan Adler 258a0f0d0SEitan Adler#------------------------------------------------------------------------------ 3*43a5ec4eSXin LI# $File: tplink,v 1.7 2021/04/26 15:56:00 christos Exp $ 458a0f0d0SEitan Adler# tplink: File magic for openwrt firmware files 558a0f0d0SEitan Adler 658a0f0d0SEitan Adler# URL: https://wiki.openwrt.org/doc/techref/header 748c779cdSXin LI# Reference: https://git.openwrt.org/?p=openwrt.git;a=blob;f=tools/firmware-utils/src/mktplinkfw.c 858a0f0d0SEitan Adler# From: Joerg Jenderek 958a0f0d0SEitan Adler# check for valid header version 1 or 2 1058a0f0d0SEitan Adler0 ulelong <3 1158a0f0d0SEitan Adler>0 ulelong !0 1258a0f0d0SEitan Adler# test for header padding with nulls 1358a0f0d0SEitan Adler>>0x100 long 0 1448c779cdSXin LI# skip Norton Commander Cleanup Utility NCCLEAN.INI by looking for valid vendor 1548c779cdSXin LI>>>4 ubelong >0x1F000000 162726a701SXin LI# skip user.dbt by looking for positive hardware id 172726a701SXin LI>>>>0x40 ubeshort >0 182726a701SXin LI>>>>>0 use firmware-tplink 1958a0f0d0SEitan Adler 2058a0f0d0SEitan Adler0 name firmware-tplink 2158a0f0d0SEitan Adler>0 ubyte x firmware 2258a0f0d0SEitan Adler!:mime application/x-tplink-bin 2358a0f0d0SEitan Adler!:ext bin 2458a0f0d0SEitan Adler# hardware id like 10430001 07410001 09410004 09410006 2558a0f0d0SEitan Adler>0x40 ubeshort x %x 2658a0f0d0SEitan Adler>0x42 ubeshort x v%x 2758a0f0d0SEitan Adler# hardware revision like 1 2858a0f0d0SEitan Adler>0x44 ubelong !1 (revision %u) 2958a0f0d0SEitan Adler# vendor_name[24] like OpenWrt or TP-LINK Technologies 3058a0f0d0SEitan Adler>4 string x %.24s 3158a0f0d0SEitan Adler# fw_version[36] like r49389 or ver. 1.0 3258a0f0d0SEitan Adler>0x1c string x %.36s 3358a0f0d0SEitan Adler# header version 1 or 2 3458a0f0d0SEitan Adler>0 ubyte !1 V%X 3558a0f0d0SEitan Adler# ver_hi.ver_mid.ver_lo 3658a0f0d0SEitan Adler>0x98 long !0 \b, version 3758a0f0d0SEitan Adler>>0x98 ubeshort x %u 3858a0f0d0SEitan Adler>>0x9A ubeshort x \b.%u 3958a0f0d0SEitan Adler>>0x9C ubeshort x \b.%u 4058a0f0d0SEitan Adler# region code 0~universal 1~US 4158a0f0d0SEitan Adler>0x48 ubelong x 4258a0f0d0SEitan Adler#>>0x48 ubelong 0 (universal) 4358a0f0d0SEitan Adler>>0x48 ubelong 1 (US) 4458a0f0d0SEitan Adler>>0x48 ubelong >1 (region %u) 4558a0f0d0SEitan Adler# total length of the firmware. not always true 4658a0f0d0SEitan Adler>0x7C ubelong x \b, %u bytes or less 4758a0f0d0SEitan Adler# unknown 1 48*43a5ec4eSXin LI>0x48 ubelong !0 \b, UNKNOWN1 %#x 4958a0f0d0SEitan Adler# md5sum1[16] 5058a0f0d0SEitan Adler#>0x4c ubequad x \b, MD5 %llx 5158a0f0d0SEitan Adler#>>0x54 ubequad x \b%llx 5258a0f0d0SEitan Adler# unknown 2 53*43a5ec4eSXin LI>0x5c ubelong !0 \b, UNKNOWN2 %#x 5458a0f0d0SEitan Adler# md5sum2[16] 5558a0f0d0SEitan Adler#>0x60 ubequad !0 \b, 2nd MD5 %llx 5658a0f0d0SEitan Adler#>>0x68 ubequad x \b%llx 5758a0f0d0SEitan Adler# unknown 3 58*43a5ec4eSXin LI>0x70 ubelong !0 \b, UNKNOWN3 %#x 5958a0f0d0SEitan Adler# kernel load address 60*43a5ec4eSXin LI#>0x74 ubelong x \b, %#x load 6158a0f0d0SEitan Adler# kernel entry point 62*43a5ec4eSXin LI#>0x78 ubelong x \b, %#x entry 6358a0f0d0SEitan Adler# kernel data offset. 200h means direct after header 64*43a5ec4eSXin LI>0x80 ubelong x \b, at %#x 6558a0f0d0SEitan Adler# kernel data length and 1 space 6658a0f0d0SEitan Adler>0x84 ubelong x %u bytes 6758a0f0d0SEitan Adler# look for kernel type (gzip compressed vmlinux.bin by ./compress) 6858a0f0d0SEitan Adler>(0x80.L) indirect x 6958a0f0d0SEitan Adler# root file system data offset 7048c779cdSXin LI# WRONG in 5.35 with above indirect expression 71*43a5ec4eSXin LI>0x88 ubelong x \b, at %#x 7258a0f0d0SEitan Adler# rootfs data length and 1 space 7358a0f0d0SEitan Adler>0x8C ubelong x %u bytes 7458a0f0d0SEitan Adler# in 5.32 only true for offset ~< FILE_BYTES_MAX=9 MB defined in ../../src/file.h 7558a0f0d0SEitan Adler>(0x88.L) indirect x 7648c779cdSXin LI# 'qshs' for wr940nv1_en_3_13_7_up(111228).bin 7758a0f0d0SEitan Adler#>(0x88.L) string x \b, file system '%.4s' 78*43a5ec4eSXin LI#>(0x88.L) ubequad x \b, file system %#llx 7958a0f0d0SEitan Adler# bootloader data offset 80*43a5ec4eSXin LI>0x90 ubelong !0 \b, at %#x 81*43a5ec4eSXin LI# bootloader data length only reasonable if bootloader offset not null 8258a0f0d0SEitan Adler>>0x94 ubelong !0 %u bytes 8358a0f0d0SEitan Adler# pad[354] should be 354 null bytes. 84*43a5ec4eSXin LI#>0x9E ubequad !0 \b, padding %#llx 8558a0f0d0SEitan Adler# But at 0x120 18 non null bytes in examples like 8658a0f0d0SEitan Adler# wr940nv4_eu_3_16_9_up_boot(160620).bin 8758a0f0d0SEitan Adler# wr940nv6_us_3_18_1_up_boot(171030).bin 88*43a5ec4eSXin LI#>0x120 ubequad !0 \b, other padding %#llx 89