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

  • 从其他程序打开文件“SampleApplication.exe”,浏览 Headers ,查找.text部分并逐字节地将数据写入文件 .

  • 运行SampleApplication.exe,其中包含获取其模块指针的指令,通过 Headers 查找它的.text部分,并将此部分逐字节打印到其他文件 .

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

我可以提供的其他信息:

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

运行程序

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
  • 我用反汇编检查了那些字节代表什么 . 它们似乎代表了内存地址 . 例如字节

在ram(注意小endianess)

68 60 24 05 00
push (052460)

在光盘上:

68 60 24 40 00
push (402460)

(40为64的十六进制)

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