计算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的时间戳与标准时间转换的更多相关文章

  1. mysql—MySQL数据库中10位时间戳转换为标准时间后,如何对标准时间进行加减X天处理

    在这篇的缘由:问题:"FROM_UNIXTIME(timeline,'%Y-%m')"的结果(2020-06)做月份增加1月或者减少1月的计算处理,想着直接在结果上+1但是,结果为 ...

  2. PE结构学习笔记--关于AddressOfEntryPoint位置在文件中怎么确定问题

    第一次学习PE结构,也不知道有没有更好的办法. 1.AddressOfEntryPoint 这个成员在OptionalHeader里面,OptionalHeader的类型是一个IMAGE_OPTION ...

  3. 【转】pe结构详解

    (一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等, 事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是 ...

  4. 羽夏笔记——PE结构(不包含.Net)

    写在前面   本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...

  5. 羽夏壳世界—— PE 结构(上)

    羽夏壳世界之 PE 结构(上),介绍难度较低的基本 PE 相关结构体.

  6. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  7. PE结构详解

    1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是“虚拟地址”而不是“物理地址”.为什么不是“物理地址”呢?因为数据在内存的位置经常在变,这样可以节省内存开支.避开错误的内存位置等 ...

  8. 手写PE结构解析工具

    PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...

  9. 仿LordPE获取PE结构

    乍一看LordPE一个小工具一般般,真的动手做起来才知道技术含量高的很. 当前只是获取到PE结构并打印,仅此而已. PE.h #pragma once #include <stdio.h> ...

随机推荐

  1. day10 局部变量 全局变量 作用域前奏

    规则命名以及基本介绍 name="LHF" # 顶头写的全局都可以调用的就是全局变量,命名规则要求大写全局变量 def chang_name(): # global name # ...

  2. Maven中使用本地JAR包

    在Maven项目中使用本地JAR包有两种方法: 1. 使用system scope <dependencies> <dependency> <groupId>org ...

  3. PendingIntent的使用

    1, 构造intent Intent mIntent = new Intent("android.intent.action.MAIN"); ComponentName comp ...

  4. Windows 10 MBR转GPT

    Windows 10的创意者更新中,新增了mbr2gpt命令行工具,只需简单几步快速搞定分区表的转换 语法 MBR2GPT /validate|convert [/disk:] [/logs:] [/ ...

  5. JS中every()和some()的用法

    every()与some()方法都是JS中数组的迭代方法. every()是对数组中每一项运行给定函数,如果该函数对每一项返回true,则返回true. some()是对数组中每一项运行给定函数,如果 ...

  6. Apache Solr 初级教程(介绍、安装部署、Java接口、中文分词)

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  7. 设计模式---对象创建模式之原型模式(prototype)

    一:概念 原型模式(Prototype Pattern) 实际上就是动态抽取当前对象运行时的状态 Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例.使用Protot ...

  8. idea创建多模块springboot项目

    需求:一个父模块  下面几个子模块  其中一个模块是springboot结构.其他两个普通jar类型 有许多坑,都在注释里面写着呢.注意看父模块和demo模块的注释. com.imooc.securi ...

  9. javascript 拖拽事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. JVM调优命令-jinfo

    jinfo JVM Configuration info这个命令作用是实时查看和调整虚拟机运行参数. 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinf ...