xref: /freebsd/contrib/file/magic/Magdir/tplink (revision 43a5ec4eb41567cc92586503212743d89686d78f)
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