【PE結構】PIMAGE_FILE_HEADER中TimeDateStamp的時間戳與標准時間轉換


計算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;
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM