修改图标:
/*
函数:获取文件中图标所在位置
*/
void CBindfile::GetPos(CString m_path)
{
dwIconSize=0;
dwWritePos=0;
_IMAGE_DOS_HEADER dosHead;
_IMAGE_NT_HEADERS ntHead;
_IMAGE_SECTION_HEADER secHead;
CFile fp;
fp.Open(m_path,Cfile::modeRead);
fp.Read(&dosHead,sizeof(_IMAGE_DOS_HEADER));//移动文件指针到MZ Header末尾
fp.Seek(dosHead.e_lfanew,Cfile::begin); //读取PE Header的位置
fp.Read(&ntHead,sizeof(_IMAGE_NT_HEADERS)); //将文件指针移动到PE Header,
//读取PE Header
/*查找.rsrc节,移动文件指针到.rsrc节开始的位置*/
for(int i=0;i<ntHead.FileHeader.NumberOfSections;i++)
{
fp.Read(&secHead,sizeof(_IMAGE_SECTION_HEADER));
if(strcmp((char*)secHead.Name,".rsrc")==0)
{
break;
}
}
_IMAGE_RESOURCE_DIRECTORYdirResource;
fp.Seek(secHead.PointerToRawData,Cfile::begin); //读取资源根节点开始的位置
DWORD pos=fp.GetPosition();
fp.Read(&dirResource,sizeof(_IMAGE_RESOURCE_DIRECTORY));
_IMAGE_RESOURCE_DIRECTORY_ENTRYentryResource;
_IMAGE_RESOURCE_DIRECTORYdirTemp; //第二层
_IMAGE_RESOURCE_DIRECTORY_ENTRYentryTemp;
_IMAGE_RESOURCE_DIRECTORYdirTempICON; //第三层
_IMAGE_RESOURCE_DIRECTORY_ENTRYentryTempICON;
_IMAGE_RESOURCE_DATA_ENTRYentryData; //资源入口
for(i=0;i<dirResource.NumberOfIdEntries+dirResource.NumberOfNamedEntries;i++)
{
fp.Read(&entryResource,sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY));
if(entryResource.Name==3)//该资源是图标
{
fp.Seek(pos+entryResource.OffsetToDirectory,Cfile::begin);
fp.Read(&dirTemp,sizeof(_IMAGE_RESOURCE_DIRECTORY));
for(int k=0;k<dirTemp.NumberOfIdEntries;k++)//遍历各个入口点指示的目录
{
fp.Read(&entryTemp,sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY));
if(entryTemp.DataIsDirectory >0) //还有子目录
{
fp.Seek(pos+entryTemp.OffsetToDirectory,Cfile::begin);
fp.Read(&dirTempICON,sizeof(_IMAGE_RESOURCE_DIRECTORY));
fp.Read(&entryTempICON,sizeof(_IMAGE_RESOURCE_DIRECTORY));
fp.Seek(pos+entryTempICON.OffsetToData,Cfile::begin);
fp.Read(&entryData,sizeof(_IMAGE_RESOURCE_DATA_ENTRY));
if(entryData.Size >=744)//找到第一个图标
{
break;
}
}
}
}
}
fp.Close();
dwIconSize=entryData.Size;//图标大小
dwWritePos=pos+entryData.OffsetToData - secHead.VirtualAddress;//图标起始位置
}
/*
函数:修改图标
*/
void CBindfile::ModifyIcon()
{
DWORD SrcWritePos,SrcWriteSize,DstWritePos,DstWriteSize;
char* SrcBuf;
m_strSrc=m_strF1;
CString m_strDst=m_strCurPath+"\\binderTemp.exe";
if(::GetFileAttributes(m_strSrc)==-1||::GetFileAttributes(m_strDst)==-1)
{
AfxMessageBox("目标文件或源文件不存在",MB_ICONERROR);
return;
}
GetPos(m_strSrc);
SrcWritePos=dwWritePos;
SrcWriteSize=dwIconSize;
GetPos(m_strDst);
DstWritePos=dwWritePos;
DstWriteSize=dwIconSize;
if(DstWriteSize<SrcWriteSize)
{
AfxMessageBox("源图标的数据量大于目标图标,\r\n转换不能进行.",MB_ICONERROR);
return;
}
/*读取宿主文件图标数据*/
CFile cfile;
cfile.Open(m_strSrc,Cfile::modeRead);
cfile.Seek(SrcWritePos,Cfile::begin);
SrcBuf=new char [SrcWriteSize];
cfile.Read(SrcBuf,SrcWriteSize);
cfile.Close();
/*将图标数据写入绑定后的文件*/
cfile.Open(m_strDst,Cfile::modeWrite);
cfile.Seek(DstWritePos,Cfile::begin);
cfile.Write(SrcBuf,SrcWriteSize);
cfile.Close();
}
/*
函数:获取文件中图标所在位置
*/
void CBindfile::GetPos(CString m_path)
{
dwIconSize=0;
dwWritePos=0;
_IMAGE_DOS_HEADER dosHead;
_IMAGE_NT_HEADERS ntHead;
_IMAGE_SECTION_HEADER secHead;
CFile fp;
fp.Open(m_path,Cfile::modeRead);
fp.Read(&dosHead,sizeof(_IMAGE_DOS_HEADER));//移动文件指针到MZ Header末尾
fp.Seek(dosHead.e_lfanew,Cfile::begin); //读取PE Header的位置
fp.Read(&ntHead,sizeof(_IMAGE_NT_HEADERS)); //将文件指针移动到PE Header,
//读取PE Header
/*查找.rsrc节,移动文件指针到.rsrc节开始的位置*/
for(int i=0;i<ntHead.FileHeader.NumberOfSections;i++)
{
fp.Read(&secHead,sizeof(_IMAGE_SECTION_HEADER));
if(strcmp((char*)secHead.Name,".rsrc")==0)
{
break;
}
}
_IMAGE_RESOURCE_DIRECTORYdirResource;
fp.Seek(secHead.PointerToRawData,Cfile::begin); //读取资源根节点开始的位置
DWORD pos=fp.GetPosition();
fp.Read(&dirResource,sizeof(_IMAGE_RESOURCE_DIRECTORY));
_IMAGE_RESOURCE_DIRECTORY_ENTRYentryResource;
_IMAGE_RESOURCE_DIRECTORYdirTemp; //第二层
_IMAGE_RESOURCE_DIRECTORY_ENTRYentryTemp;
_IMAGE_RESOURCE_DIRECTORYdirTempICON; //第三层
_IMAGE_RESOURCE_DIRECTORY_ENTRYentryTempICON;
_IMAGE_RESOURCE_DATA_ENTRYentryData; //资源入口
for(i=0;i<dirResource.NumberOfIdEntries+dirResource.NumberOfNamedEntries;i++)
{
fp.Read(&entryResource,sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY));
if(entryResource.Name==3)//该资源是图标
{
fp.Seek(pos+entryResource.OffsetToDirectory,Cfile::begin);
fp.Read(&dirTemp,sizeof(_IMAGE_RESOURCE_DIRECTORY));
for(int k=0;k<dirTemp.NumberOfIdEntries;k++)//遍历各个入口点指示的目录
{
fp.Read(&entryTemp,sizeof(_IMAGE_RESOURCE_DIRECTORY_ENTRY));
if(entryTemp.DataIsDirectory >0) //还有子目录
{
fp.Seek(pos+entryTemp.OffsetToDirectory,Cfile::begin);
fp.Read(&dirTempICON,sizeof(_IMAGE_RESOURCE_DIRECTORY));
fp.Read(&entryTempICON,sizeof(_IMAGE_RESOURCE_DIRECTORY));
fp.Seek(pos+entryTempICON.OffsetToData,Cfile::begin);
fp.Read(&entryData,sizeof(_IMAGE_RESOURCE_DATA_ENTRY));
if(entryData.Size >=744)//找到第一个图标
{
break;
}
}
}
}
}
fp.Close();
dwIconSize=entryData.Size;//图标大小
dwWritePos=pos+entryData.OffsetToData - secHead.VirtualAddress;//图标起始位置
}
/*
函数:修改图标
*/
void CBindfile::ModifyIcon()
{
DWORD SrcWritePos,SrcWriteSize,DstWritePos,DstWriteSize;
char* SrcBuf;
m_strSrc=m_strF1;
CString m_strDst=m_strCurPath+"\\binderTemp.exe";
if(::GetFileAttributes(m_strSrc)==-1||::GetFileAttributes(m_strDst)==-1)
{
AfxMessageBox("目标文件或源文件不存在",MB_ICONERROR);
return;
}
GetPos(m_strSrc);
SrcWritePos=dwWritePos;
SrcWriteSize=dwIconSize;
GetPos(m_strDst);
DstWritePos=dwWritePos;
DstWriteSize=dwIconSize;
if(DstWriteSize<SrcWriteSize)
{
AfxMessageBox("源图标的数据量大于目标图标,\r\n转换不能进行.",MB_ICONERROR);
return;
}
/*读取宿主文件图标数据*/
CFile cfile;
cfile.Open(m_strSrc,Cfile::modeRead);
cfile.Seek(SrcWritePos,Cfile::begin);
SrcBuf=new char [SrcWriteSize];
cfile.Read(SrcBuf,SrcWriteSize);
cfile.Close();
/*将图标数据写入绑定后的文件*/
cfile.Open(m_strDst,Cfile::modeWrite);
cfile.Seek(DstWritePos,Cfile::begin);
cfile.Write(SrcBuf,SrcWriteSize);
cfile.Close();
}
浙公网安备 33010602011771号