您的位置:首页 > 其它

计算资源中ICON,Image,Bmp的CRC值,检查自己的程序图片是否被篡改

2014-09-11 18:01 302 查看
char crc[MAX_PATH] = {0};

bool CalcResourceCrc(WORD ResourceID)
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        HINSTANCE hInst = AfxGetResourceHandle();

        hRes = FindResource(hInst, MAKEINTRESOURCE(ResourceID), RT_GROUP_ICON);

        //int iTest = SizeofResource(hInst, hRes);
    
        int err = ::GetLastError();
        if (!hRes) return false;

        HRSRC hMem = (HRSRC)LoadResource(hInst, hRes);

        HRSRC lpResource = (HRSRC)LockResource(hMem);

        //BYTE bTest[30] = {0};

        //memcpy(bb, lpResource, iTest); 这一段是ICON的开头信息,有点紊乱,以后研究.

        int nID = LookupIconIdFromDirectoryEx((PBYTE)lpResource, TRUE,
                0, 0, LR_DEFAULTCOLOR);

        HRSRC hResource = FindResource(hInst,
                     MAKEINTRESOURCE(nID),
                     MAKEINTRESOURCE(RT_ICON));

        hMem = (HRSRC)LoadResource(hInst, hResource);
 
        lpResource = (HRSRC)LockResource(hMem);

        int len = SizeofResource(hInst, hResource);

        BYTE b  = new BYTE[len + 1];
        b[len]  = 0;
         memcpy(b, lpResource, len);

        _snprintf(crc, MAX_PATH, "%08X", CRC::CRC_32(b, len));

        CFile inout;
        if(inout.Open(_T("icon.bin"), CFile::modeWrite | CFile::modeCreate))
        {
            inout.Write(b, len);
            inout.Close();
        }
        delete[] b;
          return true;
    }


经测试,输出来的文件ICON.BIN和 原来在资源中的文件的二进制值完全匹配。这个方法也可以推广到bitmap, image, jpg上,此处省略一万字。

对于RT_GROUP_ICON 找到的ICON文件头信息,有点不一样,不明觉厉,以后再追究。

参考:http://blog.csdn.net/kvw3000/article/details/69805

以下是实验的对比图


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: