1*58a0f0d0SEitan Adler 2*58a0f0d0SEitan Adler#------------------------------------------------------------------------------ 3*58a0f0d0SEitan Adler# $File: tplink,v 1.2 2017/12/14 05:52:56 christos Exp $ 4*58a0f0d0SEitan Adler# tplink: File magic for openwrt firmware files 5*58a0f0d0SEitan Adler 6*58a0f0d0SEitan Adler# URL: https://wiki.openwrt.org/doc/techref/header 7*58a0f0d0SEitan Adler# Reference: http://git.openwrt.org/?p=openwrt.git;a=blob;f=tools/firmware-utils/src/mktplinkfw.c 8*58a0f0d0SEitan Adler# From: Joerg Jenderek 9*58a0f0d0SEitan Adler# check for valid header version 1 or 2 10*58a0f0d0SEitan Adler0 ulelong <3 11*58a0f0d0SEitan Adler>0 ulelong !0 12*58a0f0d0SEitan Adler# test for header padding with nulls 13*58a0f0d0SEitan Adler>>0x100 long 0 14*58a0f0d0SEitan Adler>>>0 use firmware-tplink 15*58a0f0d0SEitan Adler 16*58a0f0d0SEitan Adler0 name firmware-tplink 17*58a0f0d0SEitan Adler>0 ubyte x firmware 18*58a0f0d0SEitan Adler!:mime application/x-tplink-bin 19*58a0f0d0SEitan Adler!:ext bin 20*58a0f0d0SEitan Adler# hardware id like 10430001 07410001 09410004 09410006 21*58a0f0d0SEitan Adler>0x40 ubeshort x %x 22*58a0f0d0SEitan Adler>0x42 ubeshort x v%x 23*58a0f0d0SEitan Adler# hardware revision like 1 24*58a0f0d0SEitan Adler>0x44 ubelong !1 (revision %u) 25*58a0f0d0SEitan Adler# vendor_name[24] like OpenWrt or TP-LINK Technologies 26*58a0f0d0SEitan Adler>4 string x %.24s 27*58a0f0d0SEitan Adler# fw_version[36] like r49389 or ver. 1.0 28*58a0f0d0SEitan Adler>0x1c string x %.36s 29*58a0f0d0SEitan Adler# header version 1 or 2 30*58a0f0d0SEitan Adler>0 ubyte !1 V%X 31*58a0f0d0SEitan Adler# ver_hi.ver_mid.ver_lo 32*58a0f0d0SEitan Adler>0x98 long !0 \b, version 33*58a0f0d0SEitan Adler>>0x98 ubeshort x %u 34*58a0f0d0SEitan Adler>>0x9A ubeshort x \b.%u 35*58a0f0d0SEitan Adler>>0x9C ubeshort x \b.%u 36*58a0f0d0SEitan Adler# region code 0~universal 1~US 37*58a0f0d0SEitan Adler>0x48 ubelong x 38*58a0f0d0SEitan Adler#>>0x48 ubelong 0 (universal) 39*58a0f0d0SEitan Adler>>0x48 ubelong 1 (US) 40*58a0f0d0SEitan Adler>>0x48 ubelong >1 (region %u) 41*58a0f0d0SEitan Adler# total length of the firmware. not always true 42*58a0f0d0SEitan Adler>0x7C ubelong x \b, %u bytes or less 43*58a0f0d0SEitan Adler# unknown 1 44*58a0f0d0SEitan Adler>0x48 ubelong !0 \b, UNKNOWN1 0x%x 45*58a0f0d0SEitan Adler# md5sum1[16] 46*58a0f0d0SEitan Adler#>0x4c ubequad x \b, MD5 %llx 47*58a0f0d0SEitan Adler#>>0x54 ubequad x \b%llx 48*58a0f0d0SEitan Adler# unknown 2 49*58a0f0d0SEitan Adler>0x5c ubelong !0 \b, UNKNOWN2 0x%x 50*58a0f0d0SEitan Adler# md5sum2[16] 51*58a0f0d0SEitan Adler#>0x60 ubequad !0 \b, 2nd MD5 %llx 52*58a0f0d0SEitan Adler#>>0x68 ubequad x \b%llx 53*58a0f0d0SEitan Adler# unknown 3 54*58a0f0d0SEitan Adler>0x70 ubelong !0 \b, UNKNOWN3 0x%x 55*58a0f0d0SEitan Adler# kernel load address 56*58a0f0d0SEitan Adler#>0x74 ubelong x \b, 0x%x load 57*58a0f0d0SEitan Adler# kernel entry point 58*58a0f0d0SEitan Adler#>0x78 ubelong x \b, 0x%x entry 59*58a0f0d0SEitan Adler# kernel data offset. 200h means direct after header 60*58a0f0d0SEitan Adler>0x80 ubelong x \b, at 0x%x 61*58a0f0d0SEitan Adler# kernel data length and 1 space 62*58a0f0d0SEitan Adler>0x84 ubelong x %u bytes 63*58a0f0d0SEitan Adler# look for kernel type (gzip compressed vmlinux.bin by ./compress) 64*58a0f0d0SEitan Adler>(0x80.L) indirect x 65*58a0f0d0SEitan Adler# root file system data offset 66*58a0f0d0SEitan Adler>0x88 ubelong x \b, at 0x%x 67*58a0f0d0SEitan Adler# rootfs data length and 1 space 68*58a0f0d0SEitan Adler>0x8C ubelong x %u bytes 69*58a0f0d0SEitan Adler# in 5.32 only true for offset ~< FILE_BYTES_MAX=9 MB defined in ../../src/file.h 70*58a0f0d0SEitan Adler>(0x88.L) indirect x 71*58a0f0d0SEitan Adler#>(0x88.L) string x \b, file system '%.4s' 72*58a0f0d0SEitan Adler#>(0x88.L) ubequad x \b, file system 0x%llx 73*58a0f0d0SEitan Adler# bootloader data offset 74*58a0f0d0SEitan Adler>0x90 ubelong !0 \b, at 0x%x 75*58a0f0d0SEitan Adler# bootloader data length only resonable if bootloader offset not null 76*58a0f0d0SEitan Adler>>0x94 ubelong !0 %u bytes 77*58a0f0d0SEitan Adler# pad[354] should be 354 null bytes. 78*58a0f0d0SEitan Adler#>0x9E ubequad !0 \b, padding 0x%llx 79*58a0f0d0SEitan Adler# But at 0x120 18 non null bytes in examples like 80*58a0f0d0SEitan Adler# wr940nv4_eu_3_16_9_up_boot(160620).bin 81*58a0f0d0SEitan Adler# wr940nv6_us_3_18_1_up_boot(171030).bin 82*58a0f0d0SEitan Adler#>0x120 ubequad !0 \b, other padding 0x%llx 83