exe手写资源段

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;
 





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值