計算PE文件創建時間,需要對時間進行轉換,也就是將時間戳轉換成特定的格式,或者特定的格式轉換成時間戳。
pImageFileHeader->TimeDateStamp的值為1487665851
網上找了一下方法,可以用gmtime_s和strftime函數進行轉化
gmtime_s函數
gmtime_s可以直接顯示文件創建時間,但是年數需要加上1900,月數要加上1,小時要加上8
errno_t gmtime_s(
struct tm* _tm,
const __time_t* time
);
-
_tm
為 tm 結構的指針。 返回的結構的字段表示 timer 參數的計算的值 UTC 的而不是在本地時間。 -
time
為內存的指針。 時間表示為秒自午夜 (00:00 elapsed: 00), 1970 年一月 1 日,世界 (UTC)時 (utc)。
strftime函數
strftime用戶格式化時間,然后顯示出來
_ACRTIMP size_t __cdecl strftime(
_Out_writes_z_(_SizeInBytes) char* _Buffer,
_In_ size_t _SizeInBytes,
_In_z_ _Printf_format_string_ char const* _Format,
_In_ struct tm const* _Tm
);
-
strDest
輸出字符串。 -
maxsize
strDest 緩沖區的大小,單位是字符 (char 或 wchart_t)。 -
format
窗體控件字符串。 -
timeptr
tm 數據結構。
#include "stdafx.h"
#include <windows.h>
#include <time.h>
int _tmain(int argc, _TCHAR* argv[])
{
char path[MAX_PATH];
printf("請輸入一個文件的路徑:");
scanf_s("%s", path, MAX_PATH);
// 打開這個文件,並將文件內容讀取到內存中。
HANDLE hFile = INVALID_HANDLE_VALUE;
hFile = CreateFileA(path,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
printf("無法打開文件");
return 0;
}
// 獲取文件的字節數
DWORD dwFileSize = GetFileSize(hFile, NULL);
// 申請對應大小的緩存區來保存文件內容
BYTE *pFileData = new BYTE[dwFileSize];
// 將文件的全部內容讀取到緩沖區
DWORD dwReadSize = 0;
ReadFile(hFile, pFileData, dwFileSize, &dwReadSize, NULL);
if (dwReadSize != dwFileSize) {
printf("文件讀取失敗\n");
// CloseHandle( hFile );
// delete[ ] pFileData;
return 0;
}
// PE文件所有的結構體都是以 IMAGE_ 開頭
//PIMAGE_DOS_HEADER => IMAGE_DOS_HEADER*
IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)pFileData;
// 判斷第一個字段是否MZ
if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {
printf("不是一個有效的DOS頭\n");
return 0;
}
// 判斷是否是有效的NT頭
IMAGE_NT_HEADERS* pNtHeader =
(IMAGE_NT_HEADERS*)(pDosHeader->e_lfanew + (DWORD)pDosHeader);
if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) {
printf("不是一個有效的NT頭\n");
return 0;
}
printf("文件是一個有效的PE程序\n");
//顯示文件頭
IMAGE_FILE_HEADER *pFileHeader = &pNtHeader->FileHeader;
//gmtime_s顯示文件創建時間,年數需要加上1900,月數要加上1,小時要加上8
struct tm test_gmtime_s;
errno_t err = gmtime_s(&test_gmtime_s, (time_t *)&pFileHeader->TimeDateStamp);
printf("TimeDateStamp: %d年 %d月 %d日 ", test_gmtime_s.tm_year + 1900, test_gmtime_s.tm_mon + 1, test_gmtime_s.tm_mday);
printf("周%d %02d時 %02d分 %02d秒\n", test_gmtime_s.tm_wday, test_gmtime_s.tm_hour + 8, test_gmtime_s.tm_min, test_gmtime_s.tm_sec);
//strftime格式化時間顯示
struct tm p;
errno_t err1;
err1 = gmtime_s(&p,(time_t*)&pFileHeader->TimeDateStamp);
char s[100];
strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", &p);
printf("%d: %s\n", (int)pFileHeader->TimeDateStamp, s);
//原來的數據
printf("TimeDateStamp: 0x%08d\n", pFileHeader->TimeDateStamp);
system("pause");
return 0;
}