1. 程式人生 > >PE檔案可選頭結構體中的校驗和

PE檔案可選頭結構體中的校驗和

Windows作業系統中的驅動和一些系統dll檔案都是有校驗和的,而且Windows系統在載入時實惠檢查校驗和有沒有發生變化,發生變化,說明檔案已經被修改過(沒有變化,檔案可能沒有修改過;也可能檔案修改後,重新計算了校驗和,填寫到指定位置)肯定不會繼續載入。CheckSumMappedFile( )函式用來計算校驗和,並且帶出原有校驗和。

例子:

#include <stdio.h>
#include <Windows.h>
#include <imagehlp.h>
#pragma comment(lib,"imagehlp")

int main()
{
	HANDLE l_hFileHandle = CreateFileA("C:\\Mutex.exe", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	DWORD l_dwFileSizeLow = GetFileSize(l_hFileHandle, NULL);	// 這裡不需要檔案高位大小,所以給NULL
	
	HANDLE l_hFileMapping = CreateFileMappingA(l_hFileHandle, NULL, PAGE_READWRITE, 0, 0, NULL);
	DWORD error = GetLastError();
	LPVOID l_BaseAddress = MapViewOfFile(l_hFileMapping, FILE_MAP_READ, 0, 0, l_dwFileSizeLow);
	
	PIMAGE_NT_HEADERS l_pNtHeaders=NULL;
	DWORD HeaderSum=0, CheckSum=0;
	l_pNtHeaders = CheckSumMappedFile(l_BaseAddress, l_dwFileSizeLow, &HeaderSum, &CheckSum);
	printf("CheckSum=%d\n", CheckSum);
	printf("HeaderSum=%d\n", HeaderSum);
	printf("l_pNtHeaders->CheckSum=%d\n", l_pNtHeaders->OptionalHeader.CheckSum);
	UnmapViewOfFile(l_BaseAddress);
	CloseHandle(l_hFileMapping);
	CloseHandle(l_hFileHandle);
	return 0;
}

提示2點:

1、CreateFileA和CreateFileMappingA關於檔案的操作許可權一定要一一對應,否則CreateFileMappingA呼叫失敗,錯誤程式碼5(許可權不夠)。

2、實際發現平時我們自己寫的程式,可選頭對應的CheckSum值都是0,應該是VS都沒計算校驗和。