GM_PE_ICON_INFO 为ICON自定义图标信息结构,包含图标大小,图标数据,这里只添加ICON图标,要让资源管理器之类的识别还得添加GROUP_ICON const DWORD SIZEOF_RES_DIR = sizeof(IMAGE_RESOURCE_DIRECTORY); const DWORD SIZEOF_RES_DIR_ENTRY = sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY); const DWORD SIZEOF_RES_DATA_ENTRY = sizeof(IMAGE_RESOURCE_DATA_ENTRY); int nNumberOfIdEntries = 0; DWORD dwIconSize = 0; GM_PE_ICON_INFO* pTemp = iconInfo; while (pTemp->dwIconSize != 0) { ++nNumberOfIdEntries; dwIconSize += pTemp->dwIconSize; ++pTemp; } IMAGE_RESOURCE_DIRECTORY root = {0}; IMAGE_RESOURCE_DIRECTORY_ENTRY TypeEntry = {0}; IMAGE_RESOURCE_DIRECTORY NameDir = {0}; IMAGE_RESOURCE_DIRECTORY_ENTRY NameEntry = {0}; IMAGE_RESOURCE_DIRECTORY LanguageDir = {0}; IMAGE_RESOURCE_DIRECTORY_ENTRY LanguageEntry = {0}; IMAGE_RESOURCE_DATA_ENTRY DataEntry = {0}; const DWORD dwSizeOfBuf = SIZEOF_RES_DIR + SIZEOF_RES_DIR_ENTRY + SIZEOF_RES_DIR + SIZEOF_RES_DIR_ENTRY * nNumberOfIdEntries + SIZEOF_RES_DIR * nNumberOfIdEntries +SIZEOF_RES_DIR_ENTRY * nNumberOfIdEntries + SIZEOF_RES_DATA_ENTRY * nNumberOfIdEntries + dwIconSize; char* pData = (char*)malloc(dwSizeOfBuf); // delete用 char* const p = pData; root.Characteristics = 0; root.TimeDateStamp = 0; root.MajorVersion = 4; root.MinorVersion = 0; root.NumberOfNamedEntries = 0; root.NumberOfIdEntries = 1; memcpy(pData, &root, sizeof(IMAGE_RESOURCE_DIRECTORY)); pData += sizeof(IMAGE_RESOURCE_DIRECTORY); // 是一个目录 TypeEntry.DataIsDirectory = 1; TypeEntry.Name = 3; // 资源相对于资源开始位置的偏移 TypeEntry.OffsetToDirectory = pData - p + sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY); memcpy(pData, &TypeEntry, sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)); pData += sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY); char* pNameLeve = pData; char* pLanguageLevel = pNameLeve + SIZEOF_RES_DIR + SIZEOF_RES_DIR_ENTRY * nNumberOfIdEntries; char* pDataEntry = pLanguageLevel + (SIZEOF_RES_DIR + SIZEOF_RES_DIR_ENTRY) * nNumberOfIdEntries; char* pIconData = pDataEntry + SIZEOF_RES_DATA_ENTRY * nNumberOfIdEntries; NameDir.Characteristics = 0; NameDir.TimeDateStamp = 0; NameDir.MajorVersion = 4; NameDir.MinorVersion = 0; NameDir.NumberOfNamedEntries = 0; NameDir.NumberOfIdEntries = nNumberOfIdEntries; memcpy(pNameLeve, &NameDir, sizeof(IMAGE_RESOURCE_DIRECTORY)); pNameLeve += SIZEOF_RES_DIR; pTemp = iconInfo; // 获取最后一节的rva IMAGE_SECTION_HEADER* plastSection = GetLastSection(); for (int i = 0; i < nNumberOfIdEntries; ++i) { NameEntry.DataIsDirectory = 1; NameEntry.Name = i; NameEntry.OffsetToDirectory = pLanguageLevel - p; memcpy(pNameLeve, &NameEntry, sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)); pNameLeve += sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY); LanguageDir.Characteristics = 0; LanguageDir.TimeDateStamp = 0; LanguageDir.MajorVersion = 4; LanguageDir.MinorVersion = 0; LanguageDir.NumberOfNamedEntries = 0; LanguageDir.NumberOfIdEntries = 1; memcpy(pLanguageLevel, &LanguageDir, sizeof(IMAGE_RESOURCE_DIRECTORY)); pLanguageLevel += sizeof(IMAGE_RESOURCE_DIRECTORY); LanguageEntry.DataIsDirectory = 0; LanguageEntry.Name = 0x40d/*3*/; LanguageEntry.OffsetToDirectory = pDataEntry - p; memcpy(pLanguageLevel, &LanguageEntry, sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)); pLanguageLevel += sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY); DataEntry.CodePage = 0x4E4; DataEntry.Reserved = 0; DataEntry.Size = pTemp->dwIconSize; DataEntry.OffsetToData = plastSection->VirtualAddress + plastSection->Misc.VirtualSize+ pIconData - p; memcpy(pIconData, pTemp->pIconData, pTemp->dwIconSize); pIconData += pTemp->dwIconSize; delete [] pTemp->pIconData; ++pTemp; memcpy(pDataEntry, &DataEntry, sizeof(IMAGE_RESOURCE_DATA_ENTRY)); pDataEntry += sizeof(IMAGE_RESOURCE_DATA_ENTRY); } BYTE* filedata = (BYTE*)realloc(m_pExcBuf, m_fileSize + dwSizeOfBuf); if (filedata ) { m_pExcBuf = filedata; } else { free(p); return 0; } memcpy(m_pExcBuf + m_fileSize, p, dwSizeOfBuf); free(p); plastSection = GetLastSection(); SetNewSection(0x40000040, ".rsrc", m_fileSize, dwSizeOfBuf, dwSizeOfBuf, plastSection->VirtualAddress + plastSection->Misc.VirtualSize); m_fileSize += dwSizeOfBuf; plastSection = GetLastSection(); IMAGE_OPTIONAL_HEADER* pOptiHeader = GetOptionalHeader(); if (!pOptiHeader) { return false; } pOptiHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = plastSection->VirtualAddress; pOptiHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = plastSection->Misc.VirtualSize;
exe手写资源段
最新推荐文章于 2023-08-01 14:42:32 发布