Icon文件结构和资源提取

Icon文件结构

  ico文件是一种目录结构的文件,即文件内的数据格式结构是可以存放多文件(多个ico图标),用以让应用程序适配各个大小、展示对应尺寸的图标。可以通过Resource Hacker等工具分析PE文件的资源,如下图(图标组)。
  

   为了存储多个图像,Icon文件中前若干个连续字节是文件头,存储文件个数,各个文件的位置和参数等信息。

  

   解析Icon文件时,只需要读取对应的字节,即可构建出Icon文件的数据结构。直接读入文件到内存地址即可

#pragma pack(2)
typedef struct 
{
    BYTE    bWidth;      // 图像宽度,以象素为单位。一个字节
    BYTE    bHeight;      // 图像高度,以象素为单位。一个字节
    BYTE    bColorCount;    // 图像中的颜色数(如果是>=8bpp的位图则为0)
    BYTE    bReserved;        // 保留字,必须是0
    WORD    wPlanes;        // 标设备说明位面数,其值将总是被设为1
    WORD    wBitCount;        // 每象素所占位数
    DWORD    dwBYTEsInRes;    // 每份资源所占字节数
    DWORD    dwImageOffset;    // 图像数据(iconimage)起点偏移位置
} TResDirHeader;//16字节
#pragma pack()

typedef struct
{
    WORD idReserved;
    WORD idType;
    WORD idCount;
    TResDirHeader idEntries[1];
} TIconResDirGrp, *PIconResDirGrp;

    // open the icon file        HANDLE hFile = CreateFile("iconPath", GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (hFile == INVALID_HANDLE_VALUE)
    {
        MessageBox(0, L"Failed open Icon File!", NULL, 0);
        return FALSE;
    }

    // get the file size     
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    void *filemem = malloc(dwFileSize);

    // read file to memory       
    DWORD dwBytesRead;
   ReadFile(hFile, filemem, dwFileSize, &dwBytesRead, NULL); CloseHandle(hFile); // assume the TIconResDirGrp STRUCT   auto FileGrp = PIconResDirGrp(filemem);

 

参考:https://www.freesion.com/article/49531235234/

 

posted @ 2022-09-15 21:02  banlcer  阅读(715)  评论(0编辑  收藏  举报