PE檔案可選頭結構體中的校驗和
阿新 • • 發佈:2018-12-03
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都沒計算校驗和。