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

本文介绍了一个简单的C++程序,用于计算PE文件的校验和。程序通过打开文件、创建内存映射并计算校验和来实现。代码示例中详细展示了整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


   熟悉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函数,可以自己去查阅相关手册学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值