知识 技术 关键字

//

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;
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值