【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;
}

【PE结构】PIMAGE_FILE_HEADER中TimeDateStamp的时间戳与标准时间转换的更多相关文章
- mysql—MySQL数据库中10位时间戳转换为标准时间后,如何对标准时间进行加减X天处理
		
在这篇的缘由:问题:"FROM_UNIXTIME(timeline,'%Y-%m')"的结果(2020-06)做月份增加1月或者减少1月的计算处理,想着直接在结果上+1但是,结果为 ...
 - PE结构学习笔记--关于AddressOfEntryPoint位置在文件中怎么确定问题
		
第一次学习PE结构,也不知道有没有更好的办法. 1.AddressOfEntryPoint 这个成员在OptionalHeader里面,OptionalHeader的类型是一个IMAGE_OPTION ...
 - 【转】pe结构详解
		
(一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等, 事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是 ...
 - 羽夏笔记——PE结构(不包含.Net)
		
写在前面 本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...
 - 羽夏壳世界—— PE 结构(上)
		
羽夏壳世界之 PE 结构(上),介绍难度较低的基本 PE 相关结构体.
 - 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
		
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
 - PE结构详解
		
1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是“虚拟地址”而不是“物理地址”.为什么不是“物理地址”呢?因为数据在内存的位置经常在变,这样可以节省内存开支.避开错误的内存位置等 ...
 - 手写PE结构解析工具
		
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...
 - 仿LordPE获取PE结构
		
乍一看LordPE一个小工具一般般,真的动手做起来才知道技术含量高的很. 当前只是获取到PE结构并打印,仅此而已. PE.h #pragma once #include <stdio.h> ...
 
随机推荐
- Python3网络爬虫(3):使用User Agent和代理IP隐藏身份
			
Python版本: python3 IDE: pycharm2017.3.3 一.为何要设置User Agent 有一些网站不喜欢被爬虫访问,所以会检测对象,如果是爬虫程序,他就会不让你访问,通过设置 ...
 - android GridView 的使用 实现多项选择
			
今天小研究了一下GridView,目的是为了实现 下面的效果(GridView多项选择): 首先,在布局文件添加GridView ,创建适配器的items... 具体的都在注释里边了,下面是 程序源码 ...
 - CDQ分治学习笔记
			
数据结构中的一块内容:$CDQ$分治算法. $CDQ$显然是一个人的名字,陈丹琪(NOI2008金牌女选手) 这种离线分治算法被算法界称为"cdq分治" 我们知道,一个动态的问题一 ...
 - poj1236/luogu2746 Network of Schools (tarjan)
			
tarjan缩点后,第一问答案显然是入度为零的点得个数第二问:考虑到 没有入度或出度为0的点 的图强连通, 所以答案就是max{入度为零的个数,出度为零的个数} (把出度为零的连到入度为零的点,然后剩 ...
 - CF1114F Please, another Queries on Array?(线段树,数论,欧拉函数,状态压缩)
			
这题我在考场上也是想出了正解的……但是没调出来. 题目链接:CF原网 题目大意:给一个长度为 $n$ 的序列 $a$,$q$ 个操作:区间乘 $x$,求区间乘积的欧拉函数模 $10^9+7$ 的值. ...
 - POSIX 线程取消点的 Linux 实现
			
http://blog.csdn.net/stevenliyong/article/details/4364039 原文链接:http://blog.solrex.cn/articles/linux- ...
 - CF 681
			
我太水了...... 这是一场奇差无比的CF. A,看题意有困难,实际上还是很水的. B,枚举 1234567 和 123456 的个数,时间复杂度1e6以下 C,业界毒瘤模拟题.最TM坑的是还要输出 ...
 - 如何删除launchpad里的空文件夹
			
方法1: 重启后将任意一个应用拖入再移出 方法2: 在终端(应用工具>实用工具>终端)执行:defaults write com.apple.dock ResetLaunchPad -bo ...
 - linux系统关闭IPv6的方式
			
云服务器 ECS> Linux操作运维问题 > 应用配置 > linux系统关闭IPv6的方式 linux系统关闭IPv6的方式 IPv6被认为是IPv4的替代产品,它用来解决现有I ...
 - 2.如何导入Spring约束?
			
前言:之前在学习约束的时候,关于导入约束一直迷茫,今天详细的截图一下,以下图为例 第一步: 新建 第二步: 第三步: 第四步: 第五步:(这里写的有点小错误,是第三个) 第六步: 然后点击OK 最后的 ...