为什么光盘和ram上的.text部分不同?

时间:2017-03-03 13:36:41

标签: c++ windows executable loader relocation

我有一个程序让我们称之为“SampleApplication”(只有1个exe文件)。我将以2种方式阅读这个程序的.text部分

  1. 从其他程序打开“SampleApplication.exe”文件,浏览标题,找到.text部分并逐字节地将数据写入文件。

  2. 运行SampleApplication.exe,其中包含获取其模块指针的指令,浏览标题以找到它的.text部分,并将该部分逐字节打印到其他文件。

  3. 现在,当我以64位模式编译应用程序时,这些文件是相同的 - 写入的字节是相同的。 但是当我在32位模式下编译时,一些字节是不同的。我有理由(如下所述)相信这些字节是地址的一部分。我的问题是为什么他们不同?

    我可以提供的其他信息:

    1. 当程序在ram中时,始终字节64(dec)和65(dec)(在光盘上)分别变为n和n + 1。例如:
    2. 运行程序

      a) 64 -> 5, 65 -> 6; 
      

      另一个程序执行

      b) 64 -> 5, 65 -> 6;  // bytes are the same
      

      重新编译sampleApplication,再次运行

      c) 64 -> 17, 65 -> 18;   // or 31, 32 or 34, 35 or many other combinations
      
      1. 我用反汇编检查了那些字节代表什么。它们似乎代表了内存地址。例如字节
      2. ram(注意小结束)

        68 60 24 05 00
        push (052460)
        

        在光盘上:

        68 60 24 40 00
        push (402460)
        

        (40为64的十六进制)

        任何人都可以告诉我详细情况发生了什么?我真的需要深入了解这种机制。

0 个答案:

没有答案