r11 的封包是 afs 格式的,封包没有压缩和加密,在封包头部有文件的偏移和大小,封包尾部有各文件的文件名以及其他一些信息。

    所有封包中含有以下类型文件:

  • bip: lzss 压缩或未压缩的多 png 组合文件
  • t2p: lzss 压缩的 tim2 文件,tim2 可转为 bmp 文件
  • adx: 原始 ogg 或 wav 声音文件
  • afs 相关结构

    typedef struct
    {
        char       Magic[4];
        int        FileCount;
        AFS_ENTRY *Entries;
    } AFS_HEADER;
    
    typedef struct      // 紧跟文件头的索引
    {
        int Offset;
        int Length;
    } AFS_ENTRY;
    
    typedef struct      // 封包尾部的索引信息
    {
        char FileName[32];
        char UnknownBytes[16];
    } AFS_INDEX;

    t2p 相关结构

    解压后得到 tim2 文件。
    tim2 文件结构如下,与 bmp 类似的两个数据结构,32 位色的情况下后面跟随 4 字节的像素信息。

    typedef struct
    {
    	char           FileId[4]; // ID of the File (must be 'T', 'I', 'M' and '2') 
    	unsigned char  FormatVersion; // Version number of the format 
    	unsigned char  FormatId; // ID of the format 
    	unsigned short Pictures; // Number of picture data 
    	char           Reserved[8]; // Padding (must be 0x00) 
    } TIM2_FILEHEADER;
    
    typedef struct
    {
    	unsigned long  TotalSize; // Total size of the picture data in unsigned chars 
    	unsigned long  ClutSize; // CLUT data size in unsigned chars 
    	unsigned long  ImageSize; // Image data size in unsigned chars 
    	unsigned short HeaderSize; // Header size in unsigned chars 
    	unsigned short ClutColors; // Total color number in CLUT data 
    	unsigned char  PictFormat; // ID of the picture format (must be 0) 
    	unsigned char  MipMapTextures;// Number of MIPMAP texture 
    	unsigned char  ClutType; // Type of the CLUT data 
    	unsigned char  ImageType; // Type of the Image data 
    	unsigned short ImageWidth; // Width of the picture 
    	unsigned short ImageHeight; // Height of the picture 
    	unsigned char  GsTex0[8]; // Data for GS TEX0 register 
    	unsigned char  GsTex1[8]; // Data for GS TEX1 register 
    	unsigned long  GsRegs; // Data for GS TEXA, FBA, PABE register 
    	unsigned long  GsTexClut; // Data for GS TEXCLUT register 
    } TIM2_PICTUREHEADER;
    
    // 其中 ClutType 具体取值如下:
    // 01   16 位直接颜色文件
    // 02   24 位直接颜色文件
    // 03   32 位直接颜色文件 
    // 04   4 位索引文件(16色)
    // 05   8 位索引文件(256色)
    
    // ImageType 取值如下:
    // 00 无调色板
    // 索引颜色文件时
    // 高四位
    // 	 	0 采用 CSM1 调色板
    //	 	1 采用 CSM2 调色板
    // 低四位
    // 	 	1 16位色调色板
    // 		2 24位色调色板
    // 		3 32位色调色板

    bip 相关结构

    该结构跟随在 “EMUARC__” 标志之后,之后紧跟 png 图片数据

    typedef struct
    {
    	char   Magic[8];		// "PNGFILE2"
    	int    PartWidth;
    	int    PartHeight;
    	short  FullWidth;
    	short  FullWidthThumb;
    	short  FullHeight;
    	short  FullHeightThumb;
    	int    PartSize;		// header + pngfile
    	char   FileNameWithDirectory[64];
    	char   Unknown[16];
    	int    PicOffsetX;
    	int    PicOffsetY;
    	int    PicWidth;
    	int    PicHeight;
    } PNG_PACK_TYPE2;

    压缩后的 bip 经解压可得到

    typedef struct
    {
    	TIM2_FILEHEADER    Tim2FileHeader;
    	TIM2_PICTUREHEADER Tim2PicHeader;
    	char               Magic[8];		// "PNGFILE3"
    	int                PartWidth;
    	int                PartHeight;
    	short              FullWidth;
    	short              FullWidthThumb;
    	short              FullHeight;
    	short              FullHeightThumb;
    	int                PartSize;		// header from magic + pngfile
    	char               FileNameWithDirectory[64];
    	char               Unknown[16];
    	int                PicOffsetX;
    	int                PicOffsetY;
    	int                PicWidth;
    	int                PicHeight;
    } PNG_PACK_TYPE3;

    该结构也是一个跟随一个出现,但是结构的起始地址要对齐16字节的文件偏移。
    该数据结构之后同样跟随 png 图片数据。

    bip 里 “EMUARC__” 标志前的文件头结构中还有些字段含义不太清楚,以后样本多了再补充吧hhhh

    代码地址 渣代码见笑了_(:з」∠)_