知识 技术 关键字

原创 2011年01月14日 23:21:00

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

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

相关文章推荐

C++关键字技术

  • 2011年11月29日 15:30
  • 6KB
  • 下载

Java基础入门-关键字、数据类型相关知识

Java中的关键字 注意Java代码是区分大小写 Java 语言中有一些具有特殊用途的词被称为关键字。关键字对 Java 的编译器有着特殊的意义,在程序中应用时一定要慎重哦!! Java 中...

黑马程序员_JavaSe基础知识总结六:super、final关键字

------ android培训、java培训、期待与您交流! ---------- 一、super关键字 1、super关键字的作用 ①调用父类的构造方法 ②调用父类的成员方法 需要注意:su...

Java基础知识——super关键字

1、继承要注意的几点:   属性不可重写,属性可以覆盖   属性没有多态性,属性值取决于引用类型   方法可以重写,方法有多态性   方法的行为取决于对象而不取决于引用类型   生成子类对象...

知识点总结(构造函数,构造代码块儿,this关键字等对比)

---------------------- android培训、java培训、期待与您交流! ----------------------                             ...
  • tcs250
  • tcs250
  • 2012年04月22日 07:15
  • 442

【java基础知识】this 与 static 关键字

一、this关键字 1.定义:java中为了解决变量的命名冲突和不确定性问题,引入了this关键字,this代表当前类的一个实例,它经常出现在方法和构造器方法中。2.使用场景: (1)返回调用当前...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:知识 技术 关键字
举报原因:
原因补充:

(最多只允许输入30个字)