158a0f0d0SEitan Adler 258a0f0d0SEitan Adler#------------------------------------------------------------------------------ 3*898496eeSXin LI# $File: tplink,v 1.8 2023/05/15 16:41:02 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 8*898496eeSXin LI# http://mark0.net/download/triddefs_xml.7z/defs/b/bin-tplink-v1.trid.xml 9*898496eeSXin LI# Note: called "TP-Link router firmware (v1)" by TrID 1058a0f0d0SEitan Adler# From: Joerg Jenderek 1158a0f0d0SEitan Adler# check for valid header version 1 or 2 1258a0f0d0SEitan Adler0 ulelong <3 1358a0f0d0SEitan Adler>0 ulelong !0 1458a0f0d0SEitan Adler# test for header padding with nulls 1558a0f0d0SEitan Adler>>0x100 long 0 16*898496eeSXin LI# skip Norton Commander Cleanup Utility NCCLEAN.INI by looking for valid vendor name 1748c779cdSXin LI>>>4 ubelong >0x1F000000 182726a701SXin LI# skip user.dbt by looking for positive hardware id 192726a701SXin LI>>>>0x40 ubeshort >0 20*898496eeSXin LI# skip cversions.1.db cversions.2.db cversions.3.db inside 21*898496eeSXin LI# c:\ProgramData\Microsoft\Windows\Caches 22*898496eeSXin LI# with invalid vendor names \240\0\0\0 \140\0\0\0 \040\0\0\0 23*898496eeSXin LI>>>>>5 short !0 24*898496eeSXin LI>>>>>>0 use firmware-tplink 2558a0f0d0SEitan Adler 2658a0f0d0SEitan Adler0 name firmware-tplink 2758a0f0d0SEitan Adler>0 ubyte x firmware 2858a0f0d0SEitan Adler!:mime application/x-tplink-bin 29*898496eeSXin LI# like: TL-WR1043ND-V1-FW0.0.3-stripped.bin gluon-ffrefugee-0.9.2-tp-link-archer-c5-v1-sysupgrade.bin 3058a0f0d0SEitan Adler!:ext bin 3158a0f0d0SEitan Adler# hardware id like 10430001 07410001 09410004 09410006 3258a0f0d0SEitan Adler>0x40 ubeshort x %x 3358a0f0d0SEitan Adler>0x42 ubeshort x v%x 3458a0f0d0SEitan Adler# hardware revision like 1 3558a0f0d0SEitan Adler>0x44 ubelong !1 (revision %u) 3658a0f0d0SEitan Adler# vendor_name[24] like OpenWrt or TP-LINK Technologies 3758a0f0d0SEitan Adler>4 string x %.24s 3858a0f0d0SEitan Adler# fw_version[36] like r49389 or ver. 1.0 3958a0f0d0SEitan Adler>0x1c string x %.36s 4058a0f0d0SEitan Adler# header version 1 or 2 4158a0f0d0SEitan Adler>0 ubyte !1 V%X 4258a0f0d0SEitan Adler# ver_hi.ver_mid.ver_lo 4358a0f0d0SEitan Adler>0x98 long !0 \b, version 4458a0f0d0SEitan Adler>>0x98 ubeshort x %u 4558a0f0d0SEitan Adler>>0x9A ubeshort x \b.%u 4658a0f0d0SEitan Adler>>0x9C ubeshort x \b.%u 4758a0f0d0SEitan Adler# region code 0~universal 1~US 4858a0f0d0SEitan Adler>0x48 ubelong x 4958a0f0d0SEitan Adler#>>0x48 ubelong 0 (universal) 5058a0f0d0SEitan Adler>>0x48 ubelong 1 (US) 5158a0f0d0SEitan Adler>>0x48 ubelong >1 (region %u) 5258a0f0d0SEitan Adler# total length of the firmware. not always true 5358a0f0d0SEitan Adler>0x7C ubelong x \b, %u bytes or less 5458a0f0d0SEitan Adler# unknown 1 5543a5ec4eSXin LI>0x48 ubelong !0 \b, UNKNOWN1 %#x 5658a0f0d0SEitan Adler# md5sum1[16] 5758a0f0d0SEitan Adler#>0x4c ubequad x \b, MD5 %llx 5858a0f0d0SEitan Adler#>>0x54 ubequad x \b%llx 5958a0f0d0SEitan Adler# unknown 2 6043a5ec4eSXin LI>0x5c ubelong !0 \b, UNKNOWN2 %#x 6158a0f0d0SEitan Adler# md5sum2[16] 6258a0f0d0SEitan Adler#>0x60 ubequad !0 \b, 2nd MD5 %llx 6358a0f0d0SEitan Adler#>>0x68 ubequad x \b%llx 6458a0f0d0SEitan Adler# unknown 3 6543a5ec4eSXin LI>0x70 ubelong !0 \b, UNKNOWN3 %#x 6658a0f0d0SEitan Adler# kernel load address 6743a5ec4eSXin LI#>0x74 ubelong x \b, %#x load 6858a0f0d0SEitan Adler# kernel entry point 6943a5ec4eSXin LI#>0x78 ubelong x \b, %#x entry 7058a0f0d0SEitan Adler# kernel data offset. 200h means direct after header 7143a5ec4eSXin LI>0x80 ubelong x \b, at %#x 7258a0f0d0SEitan Adler# kernel data length and 1 space 7358a0f0d0SEitan Adler>0x84 ubelong x %u bytes 7458a0f0d0SEitan Adler# look for kernel type (gzip compressed vmlinux.bin by ./compress) 7558a0f0d0SEitan Adler>(0x80.L) indirect x 7658a0f0d0SEitan Adler# root file system data offset 7748c779cdSXin LI# WRONG in 5.35 with above indirect expression 7843a5ec4eSXin LI>0x88 ubelong x \b, at %#x 7958a0f0d0SEitan Adler# rootfs data length and 1 space 8058a0f0d0SEitan Adler>0x8C ubelong x %u bytes 8158a0f0d0SEitan Adler# in 5.32 only true for offset ~< FILE_BYTES_MAX=9 MB defined in ../../src/file.h 8258a0f0d0SEitan Adler>(0x88.L) indirect x 8348c779cdSXin LI# 'qshs' for wr940nv1_en_3_13_7_up(111228).bin 8458a0f0d0SEitan Adler#>(0x88.L) string x \b, file system '%.4s' 8543a5ec4eSXin LI#>(0x88.L) ubequad x \b, file system %#llx 8658a0f0d0SEitan Adler# bootloader data offset 8743a5ec4eSXin LI>0x90 ubelong !0 \b, at %#x 8843a5ec4eSXin LI# bootloader data length only reasonable if bootloader offset not null 8958a0f0d0SEitan Adler>>0x94 ubelong !0 %u bytes 9058a0f0d0SEitan Adler# pad[354] should be 354 null bytes. 9143a5ec4eSXin LI#>0x9E ubequad !0 \b, padding %#llx 9258a0f0d0SEitan Adler# But at 0x120 18 non null bytes in examples like 9358a0f0d0SEitan Adler# wr940nv4_eu_3_16_9_up_boot(160620).bin 9458a0f0d0SEitan Adler# wr940nv6_us_3_18_1_up_boot(171030).bin 9543a5ec4eSXin LI#>0x120 ubequad !0 \b, other padding %#llx 96