关于PE文件中校验和(checksum)的计…

来源:互联网 发布:网络论坛系统cms 编辑:程序博客网 时间:2024/05/30 20:09
   熟悉PE文件格式的人应该都知道,在PE文件中有一个四字节的checksum,当初学习PE文件格式的时候,写过一个计算校验和的小程序,今天在整理电脑的时候突然发现了它,似乎彻底忘了它是干什么的,仔细一看才知道器具体,好记性不如烂笔头,似乎有必要将它贴出来,以便于以后再次遇到同一问题的时候能够直接使用。
   本程序是由C++实现,用到了静态库imagehlp中的一些函数,程序写的很次,基本没有提示,还有部分写死到里面,对于不同的用户可能需要修改其中部分代码。程序的流程是:1、打开一个文件;2、在内存中创建该文件的内存映射;3、得到映射后的初地址;4、根据初地址、文件的长度计算文件的校验和。具体说明将在程序的注释中进行说明:

#include
#include 
#include
#include
#pragma comment(lib,"imagehlp")
//extern"C" PIMAGE_NT_HEADERS CheckSumMappedFile(  PVOIDBaseAddress,  DWORD FileLength,   PDWORD HeaderSum,  PDWORDCheckSum );
using namespace std;
int main()
{
   char buf[300];
   ZeroMemory(buf,300);
   gets(buf);             //输入文件名
   printf("name:%s\n",buf);

  HANDLE hFile CreateFile(buf, 
     GENERIC_READ GENERIC_WRITE, 
     FILE_SHARE_READ, 
     NULL, 
     OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL, 
     NULL);           //打开文件
   if(hFile == INVALID_HANDLE_VALUE)
   {
     printf("Open File Failed!\n");
     return 0;
   }

  HANDLE hFileMapping CreateFileMapping(hFile,
     NULL,
     PAGE_READWRITE,
     000);             //创建文件的内存映射
   if(hFileMapping == NULL)
   {
     printf("Create Mapping FileFailed!\n");
     CloseHandle(hFile);
     return 0;
   }

  LPVOID lpBase MapViewOfFile(hFileMapping, FILE_MAP_READ FILE_MAP_WRITE, 000); //得到文件映射的初地址
   if(lpBase == NULL)
   {
     printf("Failed to Map theFile!\n");
     CloseHandle(hFileMapping);
     CloseHandle(hFile);
   }

  DWORD HeaderSum,CheckSum;
   int len=114688  //文件的长度,此处写死,不同的程序需要修改。
   //HeaderSum=*(DWORD)
  CheckSumMappedFile(lpBase, len, &HeaderSum, &CheckSum);//调用函数计算校验和
  cout<<HeaderSum<<"  "<<CheckSum<<endl;
   getchar();
   getchar();
   return 0;
}

   程序中调用了很多API函数,可以自己去查阅相关手册学习。

原创粉丝点击