none
同样的代码在VS2008每次编译出的可执行文件不一致问题 RRS feed

  • 问题

  • 各位专家你好,我自己编了个小程序,然后每次编译出来的可执行文件总有几个字节不一样,我认为是vs嵌入的时间戳和校验和,但从可执行文件中16进制的值来看,这个差异点跟我本机的时间怎么也对不起来,不仅仅是将时间直接转化成16进制的,我的问题是想请问下我的理解是否正确?VS编译器将时间转化为时间戳嵌入到可执行文件中的算法是怎么样的或者说有什么工具可以用来转化?

    4C  01 04 00 77 6F 5E 56 00 00 00

    上面加粗字体是我从可执行文件中截取的内容,我认为这四个字节就是时间戳,可好像跟我当前时间并不对应。

    2015年12月2日 7:18

答案

  • 您好 Shurong Xu,

    .NET Framework生成的dll是一个标准的Windows PE文件。在PE的文件头中会包含文件日期时间戳,指这个PE文件生成的时间,它的值是从1970年1月1日00:00:00以来的秒数。

    >>上面加粗字体是我从可执行文件中截取的内容,我认为这四个字节就是时间戳,可好像跟我当前时间并不对应。

    这仅仅是猜测,建议您使用一些PE文件分析工具来分析它。 比如Lord PE,PE Editor,Stud PE等。

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2015年12月30日 3:29

全部回复

  • 你是如何获取的这些字节?你编译的具体是什么程序?能不能给我们一个简单的例子或者重现步骤?


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年12月8日 2:33
  • 我们随便写了段代码,然后用release方式编译出一个exe文件,过几分钟后,什么都不改再重新编译出一个exe文件,然后我对比两个exe文件的二进制,发现只有两处地方是不同的,我猜测应该是时间戳和校验和,我进一步分析发现我怀疑时间戳不同的那几个字节是从编译过程文件obj文件中第5个字节和第6个字节不同造成,我网上查了些资料,资料上有说obj是coff文件格式,第4个字节到第7个字节这四个字节是,但我并不确定,因为我按照网上说的TimeDateStamp格式转换成真实的时间,跟我实际编译的时间相差巨大,比如我问题中写的四个字节是0x565E6F77,按照TimeDateStamp的最高25~31bit表示年,那我编译的时间是43+1980=2023年了,明显不对。我的疑问是这四个字节是否就是时间戳?如果是的话那应该如何转换成actual time?VS编译器是否有强制将时间戳固定或者人为更改的编译开关?谢谢
    2015年12月24日 4:04
  • 你好,

    因为这个论坛主要讨论VS安装使用问题,从你的描述中,可能不是安装方面的问题。

    >>发现只有两处地方是不同的,我猜测应该是时间戳和校验和

    我没有自己去测试过,但是按照你说的,即使是和时间戳和校验和有关,你只是隔了几分钟后重新生成的exe文件,那么也就是说明应该是年份肯定相同,月日也应该相同,能不同的也就是小时/分钟和秒,所以,你如果只是看不同的字节,至少我觉得应该不是“年”。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年12月28日 1:42
  • 你好

    我问的问题不是VS安装的,是用VS编译器编译的问题。隔几分钟之后编译重新生成的EXE文件确实是年份月日都相同的,我说的四个字节的时间戳也是我从网上查coff文件的文件格式推导出来的,实际上我对比隔几分钟生成exe文件的时间戳的地方是只有两个字节不同,这两个字节应该是分钟和秒,但我不知道如何转成实际时间,你们肯定知道是如何转的,我就想了解下你们这个时间戳是如何生成的或者说如何将实际时间转换成编译生成exe文件里的时间戳?如果你只负责VS的安装问题,那能不能请你帮我的问题转给负责VS编译的问题的工程师答复下,谢谢!

    2015年12月28日 9:03
  • 我帮你移到.NET Framework 一般性问题讨论区论坛!可能主要还是和CLR方面有关。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年12月29日 5:31
  • 您好 Shurong Xu,

    .NET Framework生成的dll是一个标准的Windows PE文件。在PE的文件头中会包含文件日期时间戳,指这个PE文件生成的时间,它的值是从1970年1月1日00:00:00以来的秒数。

    >>上面加粗字体是我从可执行文件中截取的内容,我认为这四个字节就是时间戳,可好像跟我当前时间并不对应。

    这仅仅是猜测,建议您使用一些PE文件分析工具来分析它。 比如Lord PE,PE Editor,Stud PE等。

    Best Regards,
    Li Wang


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2015年12月30日 3:29
  • 您好

    非常感谢你们的帮助,利用PE Editor读取exe文件确实能够提取出文件信息,并且确定我提的问题里的两个差异就是时间戳和校验和,按照你所说的按1970年1月1日零点来算的时间也是对应得上的,只不过我以前一直理解这个时间是我电脑的系统时间,其实应该是格林威治时间。

    再次感谢!Thank you very much!

    2016年1月4日 6:35