//
1. base64解码
///base64解码
CString Base64Decode(CString inpt, int *len)
{
int n,i,j,pad;
unsigned char *p;
static unsigned char *dst;
unsigned char * src;
*len=0;
pad=0;
n=inpt.GetLength();
src=new unsigned char [n];
for(i=0;i<n;i++)
src[i]=inpt[i];
while(n>0&&src[n-1]=='=') {
src[n-1]=0;
pad++;
n--;
}
for(i=0;i<n;i++) { /* map base64 ASCII character to 6 bit value */
p=(unsigned char *)strchr((const char *)base64,(int)src[i]);
if(!p)
break;
src[i]=p-(unsigned char *)base64;
}
dst=(unsigned char *)malloc(n*3/4+1);
memset(dst,0,n*3/4+1);
for(i=0,j=0;i<n;i+=4,j+=3) {
dst[j]=(src[i]<<2) + ((src[i+1]&0x30)>>4);
dst[j+1]=((src[i+1]&0x0F)<<4) + ((src[i+2]&0x3C)>>2);
dst[j+2]=((src[i+2]&0x03)<<6) + src[i+3];
*len+=3;
}
*len-=pad;
return CString(dst);
}
2. 修改pe文件的icon图标
#include "StdAfx.h"
#include "GetIcon.h"
CGetIcon::CGetIcon(void)
{
}
CGetIcon::~CGetIcon(void)
{
}
BOOL CGetIcon::GetIcon(CString m_filepath,DWORD dwIconSize,DWORD dwWritePos)
{
DWORD read;
//打开文件
memset((char*)pDosHeader,0,sizeof(IMAGE_DOS_HEADER));
memset((char*)pNtHeaders,0,sizeof(IMAGE_NT_HEADERS));
memset((char*)pSecHdr,0,sizeof(IMAGE_SECTION_HEADER));
HANDLE hFile=CreateFile(m_filepath.LockBuffer(),GENERIC_READ|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(!hFile)
{
AfxMessageBox(L"打开文件失败");
CloseHandle(hFile);
return FALSE;
}
//判断DOS头标志
ReadFile(hFile,(LPVOID)pDosHeader,sizeof(IMAGE_DOS_HEADER),&read,NULL);
/*if(read!=sizeof(IMAGE_DOS_HEADER))
{
AfxMessageBox(L"读取DOS头数据有误");
CloseHandle(hFile);
return FALSE;
}*/
if(pDosHeader->e_magic!=0x5A4D)
{
AfxMessageBox(L"DOS头标志错误");
CloseHandle(hFile);
return FALSE;
}
//移动指针到PE头处
SetFilePointer(hFile,pDosHeader->e_lfanew,NULL,FILE_BEGIN);
//判断PE头标志
ReadFile(hFile,(LPVOID)pNtHeaders,sizeof(IMAGE_NT_HEADERS),&read,NULL);
if(pNtHeaders->Signature!=0x4550)
{
AfxMessageBox(L"PE头数据有错误");
CloseHandle(hFile);
return FALSE;
}
for(int i=0;i<pNtHeaders->FileHeader.NumberOfSections;i++)
{
ReadFile(hFile,(LPVOID)pSecHdr,sizeof(IMAGE_SECTION_HEADER),&read,NULL);
if(strcmp((char*)pSecHdr->Name,".rsrc")==0)
{
break;
}
}
//指向资源开始处
IMAGE_RESOURCE_DIRECTORY dirResource;
IMAGE_RESOURCE_DIRECTORY_ENTRY entryResource;
SetFilePointer(hFile,pSecHdr->PointerToRawData,NULL,FILE_BEGIN);
DWORD pos=pSecHdr->PointerToRawData;
ReadFile(hFile,(LPVOID)&dirResource,sizeof(IMAGE_RESOURCE_DIRECTORY),&read,NULL);
//第二层结构
IMAGE_RESOURCE_DIRECTORY dirTemp;
IMAGE_RESOURCE_DIRECTORY_ENTRY entryTemp;
//第三层结构
IMAGE_RESOURCE_DIRECTORY dirTempIcon;
IMAGE_RESOURCE_DIRECTORY_ENTRY entryIcon;
IMAGE_RESOURCE_DATA_ENTRY entryData;
for(int i=0;i<dirResource.NumberOfIdEntries+dirResource.NumberOfNamedEntries;i++)
{
ReadFile(hFile,(LPVOID)&entryResource,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY),&read,NULL);
//找到图标资源
if(entryResource.Name==3)
{
//来到第二层资源入口
SetFilePointer(hFile,pos+entryResource.OffsetToData,NULL,FILE_BEGIN);
ReadFile(hFile,(LPVOID)&dirTemp,sizeof(IMAGE_RESOURCE_DIRECTORY),&read,NULL);
if(dirTemp.NumberOfIdEntries>256)
{
AfxMessageBox(L"大于256");
return FALSE;
}
for(int k=0;k<dirTemp.NumberOfIdEntries+dirTemp.NumberOfNamedEntries;k++)
{
ReadFile(hFile,(LPVOID)&entryTemp,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY),&read,NULL);
//如果还有子目录
if(entryTemp.DataIsDirectory>0)
{
SetFilePointer(hFile,pos+entryTemp.OffsetToDirectory,NULL,FILE_BEGIN);
ReadFile(hFile,(LPVOID)&dirTempIcon,sizeof(IMAGE_RESOURCE_DIRECTORY),&read,NULL);
ReadFile(hFile,(LPVOID)&entryIcon,sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY),&read,NULL);
SetFilePointer(hFile,pos+entryIcon.OffsetToData,NULL,NULL);
ReadFile(hFile,(LPVOID)&entryData,sizeof(IMAGE_RESOURCE_DATA_ENTRY),&read,NULL);
break;
}
}
}
}
dwIconSize=entryData.Size;
dwWritePos=entryData.OffsetToData+pos-pSecHdr->VirtualAddress;
return TRUE;
}
BOOL CGetIcon::WriteIcon(CString m_filepath,DWORD dwIconSize,DWORD dwWritePos)
{
DWORD read;
HANDLE hFile=CreateFile(m_filepath,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,(LPVOID)&dwWritePos,dwIconSize,&read,NULL);
return TRUE;
}
#pragma once
class CGetIcon
{
public:
CGetIcon(void);
~CGetIcon(void);
BOOL GetIcon(CString m_filepath,DWORD dwIconSize,DWORD dwWritePos);
BOOL WriteIcon(CString m_filepath,DWORD dwIconSize,DWORD dwWritePos);
private:
PIMAGE_DOS_HEADER pDosHeader;
PIMAGE_NT_HEADERS pNtHeaders;
PIMAGE_SECTION_HEADER pSecHdr;
};