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