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
代码地址 渣代码见笑了_(:з」∠)_