關於PE檔案中校驗和(checksum)的計…
阿新 • • 發佈:2019-02-18
熟悉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函式,可以自己去查閱相關手冊學習。
#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
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
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!
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函式,可以自己去查閱相關手冊學習。