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

 
 
    熟悉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,
        0 0 0);                 //创建文件的内存映射
    if(hFileMapping  ==  NULL)
    {
        printf( "Create Mapping FileFailed! \n ");
        CloseHandle(hFile);
        return  0;
    }

    LPVOID  lpBase  MapViewOfFile(hFileMapping,  FILE_MAP_READ  FILE_MAP_WRITE,  0 0 0);  //得到文件映射的初地址
    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函数,可以自己去查阅相关手册学习。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值