[原创]华为光猫固件结构逆向分析(二)
之前的文章实现了对华为光猫固件的基本解包打包操作,但是导出的rootfs无法直接解包(ps:7-Zip可以解包,但无法打包),其原因就是SquashFS镜像格式之前还有2层封装。
这篇文章就解析下固件项目数据的2层封装的结构(ps:不是所有项目的数据都有这2层封装,一般需要刷入flash的项目数据才有这些封装)。
先上图看看导出的rootfs的数据结构:

可以看出,在SquashFS镜像格式的魔法字"hsqs"之前还有148字节的数据。
文件头的"whwh"应该也是某种结构的魔法字,于是又分析了下vunpack那个工具,果然找到了相关的部分,这里就不多说了,直接贴结果:
enum _WHHDR_ItemType : uint32_t
{
whType_Kernel = 1U,
whType_RootFS,
whType_System,
whType_MiniSYS
};
typedef struct _WHWH_Header
{
//魔法字
uint32_t u32Magic;
char chItemVersion[64];
__time32_t u32Time;
_WHHDR_ItemType enumType;
uint32_t u32RearSize;
uint32_t u32RearCRC;
} WHWH_HEADER, *PWHWH_HEADER;

至此,已经解析了84字节的数据结构,还剩下64字节的数据结构未解析。

观察了下所有带有whwh魔法字的导出项目,发现这64字节的数据也是始终以27 05 19 56开头的。
初步断定这是另一种结构的魔法字,于是gg搜索了下0x56190527(其实之前没想到搜索魔法字,而是在解包的文件里搜索,最后定位到uboot,发现uboot有对这个结构的详细操作,于是逆向之,后面基本逆向出来90%左右的结构,结果发现网上就TM有现成的),发现这个魔数是uboot的uImage的头结构里的成员。
最后在uboot的源码里的include/image.h找到该结构的详细定义:
#define IH_MAGIC 0x27051956 /* Image Magic Number */
#define IH_NMLEN 32 /* Image Name Length */
/*
* Legacy format image header,
* all data in network byte order (aka natural aka bigendian).
*/
typedef struct image_header {
uint32_t ih_magic; /* Image Header Magic Number */
uint32_t ih_hcrc; /* Image Header CRC Checksum */
uint32_t ih_time; /* Image Creation Timestamp */
uint32_t ih_size; /* Image Data Size */
uint32_t ih_load; /* Data Load Address */
uint32_t ih_ep; /* Entry Point Address */
uint32_t ih_dcrc; /* Image Data CRC Checksum */
uint8_t ih_os; /* Operating System */
uint8_t ih_arch; /* CPU architecture */
uint8_t ih_type; /* Image Type */
uint8_t ih_comp; /* Compression Type */
uint8_t ih_name[IH_NMLEN]; /* Image Name */
} image_header_t;

image_header_t的大小正好是64字节,这样148字节数据结构全部解析完毕。
HWNP_GUI的源码过段时间会更新这次的分析结果,关注github获知最新信息。
