1. 程式人生 > >關於PE檔案中校驗和(checksum)的計…

關於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
00);             //建立檔案的記憶體對映
   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函式,可以自己去查閱相關手冊學習。