158a0f0d0SEitan Adler 258a0f0d0SEitan Adler#------------------------------------------------------------------------------ 3*48c779cdSXin LI# $File: tplink,v 1.4 2019/04/19 00:42:27 christos Exp $ 458a0f0d0SEitan Adler# tplink: File magic for openwrt firmware files 558a0f0d0SEitan Adler 658a0f0d0SEitan Adler# URL: https://wiki.openwrt.org/doc/techref/header 7*48c779cdSXin 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 14*48c779cdSXin LI# skip Norton Commander Cleanup Utility NCCLEAN.INI by looking for valid vendor 15*48c779cdSXin LI>>>4 ubelong >0x1F000000 16*48c779cdSXin LI>>>>0 use firmware-tplink 1758a0f0d0SEitan Adler 1858a0f0d0SEitan Adler0 name firmware-tplink 1958a0f0d0SEitan Adler>0 ubyte x firmware 2058a0f0d0SEitan Adler!:mime application/x-tplink-bin 2158a0f0d0SEitan Adler!:ext bin 2258a0f0d0SEitan Adler# hardware id like 10430001 07410001 09410004 09410006 2358a0f0d0SEitan Adler>0x40 ubeshort x %x 2458a0f0d0SEitan Adler>0x42 ubeshort x v%x 2558a0f0d0SEitan Adler# hardware revision like 1 2658a0f0d0SEitan Adler>0x44 ubelong !1 (revision %u) 2758a0f0d0SEitan Adler# vendor_name[24] like OpenWrt or TP-LINK Technologies 2858a0f0d0SEitan Adler>4 string x %.24s 2958a0f0d0SEitan Adler# fw_version[36] like r49389 or ver. 1.0 3058a0f0d0SEitan Adler>0x1c string x %.36s 3158a0f0d0SEitan Adler# header version 1 or 2 3258a0f0d0SEitan Adler>0 ubyte !1 V%X 3358a0f0d0SEitan Adler# ver_hi.ver_mid.ver_lo 3458a0f0d0SEitan Adler>0x98 long !0 \b, version 3558a0f0d0SEitan Adler>>0x98 ubeshort x %u 3658a0f0d0SEitan Adler>>0x9A ubeshort x \b.%u 3758a0f0d0SEitan Adler>>0x9C ubeshort x \b.%u 3858a0f0d0SEitan Adler# region code 0~universal 1~US 3958a0f0d0SEitan Adler>0x48 ubelong x 4058a0f0d0SEitan Adler#>>0x48 ubelong 0 (universal) 4158a0f0d0SEitan Adler>>0x48 ubelong 1 (US) 4258a0f0d0SEitan Adler>>0x48 ubelong >1 (region %u) 4358a0f0d0SEitan Adler# total length of the firmware. not always true 4458a0f0d0SEitan Adler>0x7C ubelong x \b, %u bytes or less 4558a0f0d0SEitan Adler# unknown 1 4658a0f0d0SEitan Adler>0x48 ubelong !0 \b, UNKNOWN1 0x%x 4758a0f0d0SEitan Adler# md5sum1[16] 4858a0f0d0SEitan Adler#>0x4c ubequad x \b, MD5 %llx 4958a0f0d0SEitan Adler#>>0x54 ubequad x \b%llx 5058a0f0d0SEitan Adler# unknown 2 5158a0f0d0SEitan Adler>0x5c ubelong !0 \b, UNKNOWN2 0x%x 5258a0f0d0SEitan Adler# md5sum2[16] 5358a0f0d0SEitan Adler#>0x60 ubequad !0 \b, 2nd MD5 %llx 5458a0f0d0SEitan Adler#>>0x68 ubequad x \b%llx 5558a0f0d0SEitan Adler# unknown 3 5658a0f0d0SEitan Adler>0x70 ubelong !0 \b, UNKNOWN3 0x%x 5758a0f0d0SEitan Adler# kernel load address 5858a0f0d0SEitan Adler#>0x74 ubelong x \b, 0x%x load 5958a0f0d0SEitan Adler# kernel entry point 6058a0f0d0SEitan Adler#>0x78 ubelong x \b, 0x%x entry 6158a0f0d0SEitan Adler# kernel data offset. 200h means direct after header 6258a0f0d0SEitan Adler>0x80 ubelong x \b, at 0x%x 6358a0f0d0SEitan Adler# kernel data length and 1 space 6458a0f0d0SEitan Adler>0x84 ubelong x %u bytes 6558a0f0d0SEitan Adler# look for kernel type (gzip compressed vmlinux.bin by ./compress) 6658a0f0d0SEitan Adler>(0x80.L) indirect x 6758a0f0d0SEitan Adler# root file system data offset 68*48c779cdSXin LI# WRONG in 5.35 with above indirect expression 6958a0f0d0SEitan Adler>0x88 ubelong x \b, at 0x%x 7058a0f0d0SEitan Adler# rootfs data length and 1 space 7158a0f0d0SEitan Adler>0x8C ubelong x %u bytes 7258a0f0d0SEitan Adler# in 5.32 only true for offset ~< FILE_BYTES_MAX=9 MB defined in ../../src/file.h 7358a0f0d0SEitan Adler>(0x88.L) indirect x 74*48c779cdSXin LI# 'qshs' for wr940nv1_en_3_13_7_up(111228).bin 7558a0f0d0SEitan Adler#>(0x88.L) string x \b, file system '%.4s' 7658a0f0d0SEitan Adler#>(0x88.L) ubequad x \b, file system 0x%llx 7758a0f0d0SEitan Adler# bootloader data offset 7858a0f0d0SEitan Adler>0x90 ubelong !0 \b, at 0x%x 7958a0f0d0SEitan Adler# bootloader data length only resonable if bootloader offset not null 8058a0f0d0SEitan Adler>>0x94 ubelong !0 %u bytes 8158a0f0d0SEitan Adler# pad[354] should be 354 null bytes. 8258a0f0d0SEitan Adler#>0x9E ubequad !0 \b, padding 0x%llx 8358a0f0d0SEitan Adler# But at 0x120 18 non null bytes in examples like 8458a0f0d0SEitan Adler# wr940nv4_eu_3_16_9_up_boot(160620).bin 8558a0f0d0SEitan Adler# wr940nv6_us_3_18_1_up_boot(171030).bin 8658a0f0d0SEitan Adler#>0x120 ubequad !0 \b, other padding 0x%llx 87